En este reto me centre principalmente en mejorar mis habilidades y resolver retos WEB. Ya que es lo que estoy aprendiendo principalmente ahora con HTB. En un pasado hice muchos retos de PWN, pero debo y estoy tratando de mejorar mis habilidades en WEB. Resolví tres. De los tres de este PascalCTF he elegido este para hacer el writeup.

Introducción

Este reto no es una "whitebox", es decir, no nos dan toda la información del reto, como el codigo fuente. Solamente nos dan esta pagina web que debemos tratar de vulnerar o conseguir algo. Ese algo se especifica en el reto que es leer el archivo "flag.txt", o se entiende basado en el "flag can be found here: app/flag.txt".

None
Descripción del reto — Pagina del CTF oficial

Funcionamiento del reto

Al usar la web un poco vemos el funcionamiento básico, le enviamos el numero de la canción que queremos cargar y nos carga una web con información y su video en Youtube. Nada mas.

None
Imagen de la canción numero 2 — The Passenger

Debido a que no hay nada mas, directamente imagino que puede ser un LFI, ya que el recurso de la web parece ser cargado de alguna parte. Esto lo imaginé sin siquiera ver la API. Aunque sean numeros y no archivos podemos entender que seria algo como "cancion1.html, cancion2.html,…", cargados desde una carpeta especifica.

Recopilando información use un 404 que me devolvió al intentar acceder a una canción desconocida, y pregunte a Perplexity que de que aplicacion era esa pagina 404. Ciertamente y corresponde bien, me dijo que era de FLASK.

None
Imagen de la respuesta de perplexity del fingerprint de Flask
None
Imagen de la respuesta del servidor al buscar la ruta 2asd en paginas

Al hacer una request legítima, se producen dos llamadas: Una GET a la pagina de la cancion Una POST a una api con el numero de pagina que queremos devolver en JSON.

Como imaginaba que habría una vulnerabilidad del tipo LFI, puse todas mis bazas en eso. Incluso si hubiera tenido que probar mas bypasses hubiera continuado probando.

Explotación

En este caso tiene mas sentido probar la vulnerabilidad en los parámetros de la api, no a traves de las rutas, por varias razones, y entre ellas que tenemos un nginx de por medio, además que deducimos que cuando llame a readfile/template (en el lenguaje que sea) será probablemente en la llamada de la api. Dicho esto envio la cadena de prueba (sabiendo que estamos perdidos en algún directorio) " ../../../../etc/hosts", reemplazando el int original por una cadena de caracteres, ya que si usa Flask es de Python y en python el tipo de la variable puede decidirse en tiempo real. El resultado fue todo un exito y me devolvió correctamente el archivo hosts de ese ordenador.

Para poder leer flag.txt primero tuve que saber donde se ejecutaba la aplicacion, para ello use la ruta "/proc/self/environ". Esto me devolvió el directorio en el que estábamos junto a mas información, y gracias a esto pude encadenar todo para finalmente enviar la cadena "../../../../../home/challenge/flag.txt", que me devolvió correctamente la flag del reto.

None
Imagen de la llamada a la API con la ruta de la solución

Pensaba que iba a ser mas complejo el reto ya que no esta listado como facil/ no tiene tantas solves. Pero ha sido realmente sencillo.