Usage

Publicado: 22 de Mayo de 2025 Autor: José Miguel Romero aKa x3m1Sec Dificultad: ⭐ Easy
📝 Descripción
En esta máquina de Hack The Box llamada Usage, nos enfrentamos a una aplicación web construida con el framework PHP Laravel, alojada en un servidor nginx sobre un sistema Linux. A través de una fase inicial de reconocimiento, identificamos rápidamente que el sitio hace uso de virtual hosting.
La clave para avanzar radica en una vulnerabilidad SQL Injection a ciegas (Blind SQLi) detectada en la funcionalidad de recuperación de contraseña del sitio principal. Mediante el uso de payloads manuales y scripts automatizados en Python, conseguimos explotar dicha vulnerabilidad para exfiltrar información sensible directamente desde la base de datos.
Esta máquina es ideal para practicar técnicas de inyección SQL a ciegas, explotación web en entornos Laravel y scripting para automatización de tareas ofensivas.
🔭 Reconocimiento
Ping para verificación en base a TTL
💡 Nota: El TTL cercano a 64 sugiere que probablemente sea una máquina Linux.
Escaneo de puertos
Enumeración de servicios
⚠️ Importante: Detectamos durante la fase de enumeración con nmap que se está realizando virtual hosting. Debemos añadir el siguiente vhost a nuestro fichero /etc/hosts
🌐 Enumeración Web
80 HTTP (usage.htb - admin.usage.htb)
http://usage.htb

Usamos la opción de Registro y nos autenticamos pero no vemos nada interesante a priori:

Usamos Wappalyzer para enumerar un poco las tecnologías usadas y vemos que el framework principal que se ha usado para el sitio es Laravel, un framework de php.

Vamos a analizar un poco la opción de Reset Password para ver qué está realizando por detrás:

Verificamos si alguno de los campos del formulario es vulnerable a algún tipo de inyección.
Al introducir una comilla en el campo e-mail obtenemos un error 500, señal de que el backend no está manejando correctamente ni sanitizando el campo de entrada:

Confirmamos la vulnerabilidad SQLi con el siguiente payload:

No vemos ningún tipo de error reflejado que nos pueda aportar información sobre el nombre de la base de datos o algún otro campo, por lo que se trata de una inyección a ciegas (blind sqli)
Aquí podríamos usar sqlmap o también podemos realizalo de forma manual montar unos script en python que mediante la función substring nos permita mediante fuerza bruta ir adivinando el nombre de la base de datos y las tablas:
Enumeración de base de datos
Básicamente este script automatiza la petición que hemos visto anteriormente al endpoint forget-password y aplica la siguiente inyección test' OR substring(database(),{i},1)='{character}'-- - para ir determinando el carácter que corresponde a cada posición del nombre de la base de datos.
Para saber si el carácter es correcto evalúa si la cadena "We have e-mailed your password" llega en la respuesta.
Vemos que el script funciona y ya tenemos el nombre de la base de datos:

Ahora que ya tenemos el nombre de la base de datos, si ahora quisiéramos averiguar las tablas de dicha base de datos podemos jugar con una nested query. Para ello hacemos algunos cambios en el script anterior dejándolo de la siguiente forma:
Enumeración de tablas de una base de datos específica
Básicamente realizamos algunos ajustes y cambiamos el payload de la inyección para que en el substring en lugar del nombre de la base de datos, usamos group_concat para retornar los nombres de las tablas separados por coma y vamos comparando con cada carácter en cada iteración del bucle:
![[Pasted image 20250522193104.png]]
Encontramos una tabla interesante llamada admin_users de la cual nos podría interesar extraer su contenido.
Enumeración de columnas de una tabla
Hemos realizado unos ajustes al script anterior y modificado el payload para consultar las columnas especificando el nombre de la base de datos y el nombre de la tabla:

Ahora que ya tenemos los nombres de las columnas, únicamente nos queda extraer su contenido, así que volvemos a modificar el script:
Obtenemos el usuario y la contraseña en formato hash:

Usamos la herramienta nth para comprobar qué tipo de hash es aunque a priori viéndolo ya parece que es bcrypt:

Usamos hashcat y rockyou para crackearlo:

Obtenemos la contraseña de admin: whatever1
http://admin.usage.htb

Probamos a autenticarnos en el panel de administración con las credenciales admin:whatever1

💻 Explotación
CVE-2023-24249
Tras verificar las versiones de Laravel y PHP no parece haber exploits, aunque sí que encontramos algo interesante para una de las dependencias que estamos enumerando

Parece que hay un CVE-2023-24249 con una vulnerabilidad de tipo arbitrary file upload relacionada con el componente de administración que permite cambiar la foto de perfil:
Hay documentación sobre cómo explotar esta vulnerabilidad:
https://flyd.uk/post/cve-2023-24249/

Subimos una imagen cualquiera jpg e interceptamos la petición con burp y cambiamos la extensión del archivo añadiendo un .php al final y reemplazamos el contenido por una php bash one liner:
Vemos la ruta donde se ha subido el archivo:

Iniciamos un listener con netcat
Foothold
Accedemos al recurso que hemos subido en /uploads/images/cat.jpg.php y obtenemos acceso a la máquina como usuario dash:

Obtenemos la primera flag en el directorio de usuario de dash:

👑 Escalada de privilegios
Comenzamos a enumerar la máquina y encontramos las credenciales de base de datos en la siguiente ubicación:

Probamos a reutilizarla con los usuarios dash y xander pero no funciona.
En el directorio del usuario dash existe un fichero .monitrc en el que también hay otra contraseña:

Usamos esta credencial para autenticarnos como xander y tenemos éxito:
Verificamos si hay algún usuario que pueda ejecutar algún binario como root
Comprobamos que el usuario xander tiene permisos de lectura y ejecución sobre este binario
Ejecutamos la herramienta probando las 3 opciones aunque no nos permite hacer gran cosa por temas de permisos.
Usamos el comando strings con el binario para ver si vemos algo interesante:

Aquí podría haber algo, ya que se está haciendo uso de wildcard. Hay un artículo interesante sobre esto en HackTricks
https://book.hacktricks.wiki/en/linux-hardening/privilege-escalation/wildcards-spare-tricks.html

Seguimos los pasos indicados en la documentación y creamos un archivo @id_rsa, a continuación creamos un enlace simbólico al archivo /root/.ssh/id_rsa y finalmente lo movemos al directorio del que lee el comando 7za que es /var/www/html:

Hemos creado un enlace simbólico en este caso al id_rsa de root para que se ejecute la herramienta y vaya a comprimir todo lo que hay en el directorio /var/www/html pues también procese nuestro archivo id_rsa que apunta a la clave ssh del usuario root

Vemos la clave privada de root que podemos copiar en el directorio /tmp de la máquina, darle permisos 600 y usar para conectarnos a la máquina como root
id_rsa

Last updated