AbuseHumanDB — HackTheBox Write-Up
En el primer post de este blog vamos a examinar un challenge de Hack The Box llamado “AbuseHumanDB” y como efectuar un Blind XS Leak+ CORS bypass.
Durante el challenge vamos a tener disponible el código, la intención es hacer Code Review para lograr la explotación.
Análisis
En primer lugar podemos ver que en el archivo “database.js” se inserta el flag, pero a diferencia del resto, con approved = 0
Dentro de la página, en public entries, podemos ver todas las entradas con approved = 1. En la home principal es posible subir una URL para que posteriormente sea aprobada por medio de un puppeteer, este va a ser el encargado de acceder a nuestra URL maliciosa.
Sí queremos buscar el flag (HTB{flag}) en el endpoint de /api/entries/search, no vamos a obtenerningún resultado, ya que sólo va a traer los approved = 0 desde la IP local 127.0.0.1:1337.
En esta parte es donde entra la fuerza bruta basada en errores, sí tratamos de hacer una busqueda de “Back” vamos a obtener un código 200 porque esa entrada existe, en caso contrario devuelve 404.
¿Que sucede al tratar de hacer simplemente un fetch mediante javascript? Nos va a dar un error de “blocked by CORS policy”, por lo que esa query debe venir desde dentro del servicio y aquí es donde entra en juego el puppeteer, este va a ser el encargado de ejecutar nuestro js malicioso localmente.
Explotación
Vamos a hacer bruteforce en base a los códigos de error de la página, sabiendo que:
script.onload = 200 -> Vamos por buen camino
script.onerror = 404 -> Descartamos ese caracter
Para hostear localmente nuestro script levantamos un servidor nginx en nuestra computadora para escribir nuestro index.html
Y para que sea visible públicamente podemos ejecutar un servicio de ngrok que va a publicar lo que tengamos en nuestro localhost. En los access.log de error de ngrok también vamos a ir recibiendo el flag por partes mediante un error 404 gracias al fetch de la línea 25.
Al subir la URL dentro de puppeteer se va a ejecutar nuestro exploit y recibiremos el flag.
>>>print(“h4ppy_h4ck1ng”)
>>>exit()