Horizontall
Platform
HackTheBox
O.S
Linux
Level
Easy
Skills
Fuzzing
Web Application
Directory Listing Port Forwarding
Fase 1: Reconocimiento
Empezamos realizando un escaneo profundo de todos los puertos TCP abiertos.
sudo nmap -p- --open -sS -n -Pn -vv --min-rate 5000 10.10.11.105 -oN target

Posteriormente ejecutamos los scripts por defecto de NSE (-sC) y una detección de versiones de los servicios con nmap (-sV)
sudo nmap -sCV -p22,80 10.10.11.105 -oN ports

Vemos que se aplica VirtualHosting, así que modificamos nuestro fichero DNS para que pueda traducir el nombre de dominio correctamente.

Luego de analizar el código fuente, específicamente el script chunk-vendors.0e02b89e.js, nos damos cuenta que estamos frente a un framework de JavaScript llamado Vue.js, el cual tras una breve investigación me doy cuenta de que es muy utilizado para construir interfaces de usuario interactivas y aplicaciones web de una sola página. No ayudará en mucho a la posterior explotación, pero siempre viene bien saber a que nos estamos enfrentando.

Al aplicarse VirtualHosting lo primero que pienso es que existe algún subdominio asociado también a esa IP, por lo cual utilizo ffuf para intentar descubrir alguno.

El parámetro -fw lo he explicado en la resolución de la máquina
, recomiendo que vayan a echarle un ojo.Podemos apreciar que tras la búsqueda hemos encontrado 2 subdominios, de los cuales nos interesa el api-prod, ya que el www lleva a la misma página. Volvemos a editar nuestro fichero de hosts y accedemos a la web a ver que nos encontramos.

Bueno, al parecer una página que no dice mucho. Vamos a hacer un descubrimiento de directorios para ver si hay algo más.

El recurso /admin suena interesante; luego de visitarlo en la web nos damos cuenta de que nos dirige a un login de Strapi, el cual en resumen es un CMS y como sabemos, todos los CMS suelen tener vulnerabilidades asociadas en versiones antiguas, así que nuestro siguiente objetivo será buscar la versión.
Luego de ver que en el código fuente y en los scripts del mismo no había ninguna pista clara sobre ello, decido hacer otra enumeración de directorios pero esta vez sobre el recurso encontrado (/admin). Cabe aclarar que me toca excluir un tamaño de respuesta específico en la búsqueda de directorios ya que al intentar hacerlo normal, gobuster me ha sacado el error de que todas las páginas devuelven un estado 200 así no existan, lo que generará falsos positivos.
Error: the server returns a status code that matches the provided options for non existing urls.
http://api-prod.horizontall.htb/admin/b78f7529-a4ed-400e-b22e-a9a92512af4e => 200 (Length: 854). To continue please exclude the status code or the length
Comando ejecutado:

Simplemente con acceder al primer recurso podemos ver la versión exacta del CMS al que nos estamos enfrentando en este caso. 👀

Fase 2: Explotación
Con una simple búsqueda en internet, nos damos cuenta que es vulnerable a RCE y que existe un exploit público en ExploitDB.

Así que lo buscamos en local con ayuda de la herramienta searchsploit y lo traemos al directorio actual para ver como funciona.

Antes de utilizar el script, leemos el código para ver como se usa, comprobar si hay que modificar alguna variable, etc.
En este caso había que modificar en 3 partes la contraseña a la que deseamos cambiar:


Y para su uso, simplemente especificamos la URL que va al CMS vulnerable.

Esto nos devuelve unas credenciales y un Jason Web Token (JWT).
El usuario y la contraseña devueltos los podemos usar para acceder como administradores a la web Strapi.

Y el JWT lo usaremos para el posterior script que es la ejecución remota de comandos como tal. 😏
Si nos fijamos bien y entendemos lo que estamos haciendo, la acción anterior era un exploit cuando no teníamos un usuario autenticado.

Bien, pues ahora que ya estamos autenticados con un usuario legítimo, existe otro exploit público para ejecutar como tal comandos de manera remota.

Para ejecutar este script no tenemos que modificar nada interno, simplemente especificar los siguientes parámetros
python3 50238.py http://api-prod.horizontall.htb Jason_Web_Token_obtenido_anteriormente 'comando_a_ejecutar' IP_local

Comprobamos que los comandos se ejecutan de manera correcta, así que solo toca ingeniárselas para recibir una reverse shell, ya que por alguna razón con el comando típico one liner de bash no funciona.

Yo lo que he hecho es crear un script con el mismo código que devuelve la reverse shell, pasarlo a la máquina víctima con un servidor web PHP y por último ejecutarlo en la máquina víctima mientras me encontraba en escucha en la máquina local.



Perfecto, ya tenemos una shell en el sistema víctima, ahora con una simple sanitización de terminal y definición de variables correctamente ya podemos a empezar a operar y a buscar el acceso como root 🙌🏻.
Por cierto, la flag del usuario se obtiene en la ruta /home/developer 😅.

Fase 3: Post-explotación
Luego de buscar permisos SUID, variables de entorno y demás vectores de entrada, lo único que me ha llamado la atención es un puerto interno en el cual se encontraba corriendo un laravel.


La cual es vulnerable a RCE también.

Bien, para explotar este puerto de manera cómoda he decidido realizar un Port Forwarding con Chisel, simplemente obteniendo el binario de internet, pasándolo a la máquina víctima y posteriormente ejecutándolo de la siguiente forma:

Comprobamos la conexión establecida:

Bien, esta vez el exploit de ExploitDB no me ha funcionado, así que me ha tocado buscar por CVE y exploits en GitHub.

Entramos al primer repo, bajamos el exploit y leemos las instrucciones para su ejecución.

Perfecto, al parecer conseguimos una ejecución remota como root 😈.
Enviamos una reverse shell y conseguimos la última flag.

Extra
Recién entro en la máquina, al estar en un entorno web, busco en posibles ficheros de configuración si existe alguna contraseña.

Me llama la atención el fichero que se encuentra en el directorio de desarrollo, así que hago una búsqueda más profunda.

Luego de obtener estas credenciales, accedo a la base de datos interna de la máquina y encuentro un hash de admin en la base de datos ‘Strapi’, en la tabla ‘strapi_administrator’


Aunque no es un hash crackeable, por lo menos no fácilmente, es un método que igual es de utilidad en otros retos CTF o incluso en entornos reales, así que por aquí lo dejo 🫡.
Last updated