WriteUp HackerOne H1-212

Vamos a estrenar el blog con una divertida entrada (que esperemos sean muchas) con la resolución de una de las cosas que más nos gustan en el departamento: los retos de seguridad o CTF.

Hace poco se ha realizado el CTF de HackerOne H1-212 que se puede encontrar en la web de HackerOne. Hoy os traemos este Write-Up de la mano de uno de nuestro compañero Borja Martínez, donde nos explica cómo resolvió la prueba de H1, relacionada con una vulnerabilidad de SSRF.

Para empezar, accedemos a la dirección que proporcionan en el enunciado (http://104.236.20.43) y nos encontramos con la página por defecto de un Apache2.

Página por defecto Apache

Después de unas breves pruebas nos encontramos con el directorio /flag donde sale un simple mensaje (You really thought it would be that easy? Keep digging!).

Directorio flag

Volviendo al [enunciado] (https://www.hackerone.com/blog/hack-your-way-to-nyc-this-december-for-h1-212) nos damos cuenta que se se hace referencia a un panel de administración para la organizacion de “acme.org”:

Pista sobre panel de admin

Con lo cual intuimos que el servidor puede presentar varios virtual hosts, por lo que se realizan varias pruebas en la cabecera hasta dar con el host correcto.

host: admin.acme.org

Buscando el host correcto

Al realizar la petición nos percatamos que en la respuesta se fija el valor de una cookie (admin=no). Nuestro instinto más primario nos llevar a cambiar ese valor a “yes”.

Cambio de cookie admin

Tampoco iba a ser tan fácil y seguimos poco a poco con las pruebas. En este punto apreciamos que no acepta el método GET ya que nos da un error 405 por lo que lo cambiamos por el otro método “POST”.

Cambio método POST

Ahora obtenemos el error 406. Después de “fuzzear” durante un rato ficheros encontramos read.php que nos devuelve en la respuesta un error diferente. Hemos avanzamos hasta el error 418, junto a lo que parece ser una respuesta a una consulta de JSON.

Respuesta JSON

A partir del error que ha devuelto el servidor, formamos una petición JSON con el valor que espera ”row”. Ahora nos pide el valor “domain”.

Respuesta JSON, domain required

Volvemos a formar la petición JSON con el valor domain y vemos que nos faltan valores que vamos añadiendo.

Respuesta JSON, falta valor .com

Llegamos a formar la peticion 212.dominio.com que nos devuelve el siguiente directorio:

Respuesta JSON, campo data vacío

Vemos que nos devuelve un campo data vacío, y a cada petición que hacemos con un nuevo dominio nos crea un id nuevo id=0,id=1,id=2…

Respuesta JSON, nuevo id

Si en el dominio ponemos un dominio válido vemos que nos resuelve el contenido del mismo en base64, para hacer la prueba usamos el dominio borjmz.com que apunta a 127.0.0.1:

Petición borjmz.com Respuesta página inicio

Nos devuelve la página de inicio de Apache con lo cual imaginamos que podríamos estar ante un SSRF. Nos disponemos a escanear y encontramos un servidor nginx en el puerto 1337:

Posible SSRF Servidor nginx en puerto 1337

Decodificamos la cadena base64 y nos encontramos con la siguiente frase:

  • Hmm, where would it be?
Mensaje decodificado

Parece que vamos por buen camino….

Nos da a entender que puede estar en el archivo /flag pero no podemos leer el directorio ya que tenemos el problema que la petición incluye un .com, con lo cual al realizar la petición queda de la siguiente manera 212.borjmz.com:1337/flag.com (127.0.0.1:1337/flag.com) con lo cual necesitamos realizar un bypass de la cadena “.com”.

Probamos con varios caracteres pero están prohibidos:

Pruebas bypass del .com

Se hacen varias pruebas para lograr el bypass:

Prueba con netcat Prueba con salto de línea

Finalmente se ha conseguido hacer el bypass con las siguiente petición:

[{"domain" :
"212.borjmz.com/flag\\nFake:.com"}]{style="background: #f9f2f4"}

Nos llega la respuesta correctamente en base64 y al descifrar obtenemos la flag.

Flag decodificada
{"data":"RkxBRzogQ0YsMmRzVlwvXWZSQVlRLlRERXBgdyJNKCVtVTtwOSs5RkR7WjQ4WCpKdHR7JXZTKCRnN1xTKTpmJT1QW1lAbmthPTx0cWhuRjxhcT1LNTpCQ0BTYip7WyV6IitAeVBiL25mRm5hPGUkaHZ7cDhyMlt2TU1GNTJ5OnovRGg7ezYK"}

FLAG:

CF,2dsV\\/\]fRAYQ.TDEp\`w"M(%mU;p9+9FD{Z48X\*Jtt\{\%vS(\$g7\\S):f%=P\[Y@nka=<tqhnF<aq=K5:BC@Sb\*{\[%z"+@yPb/nfFna<e\$hv{p8r2\[vMMF52y:z/Dh;{6

Gracias por el reto!