Search

Escribe para buscar.

en
HackConRD CTF 2024: Interdimensional Calculator

HackConRD CTF 2024: Interdimensional Calculator

Junior Restituyo
0xR3iko

Empezamos mirando el sitio web y no encontramos nada especial. La página solo muestra un número aleatorio cada vez que se recarga.

Sitio del reto mostrando un número aleatorio sobre un fondo de Rick and Morty

Después fuimos a revisar el código fuente, buscando algo interesante antes de escanear puertos abiertos o enumerar directorios. Ahí encontramos un comentario interesante, <!-- /debug -->, que nos guiaba a probar el directorio /debug.

Código fuente que revela el comentario HTML apuntando a la ruta /debug

Al ir a ese directorio pudimos encontrar código Python. Revisándolo, supimos que era un backend hecho con el framework Flask.

Primero, vimos que la ruta principal / acepta los métodos GET y POST, y que la función GCR tiene un condicional if que se ejecuta cuando enviamos una petición POST. Mirando con más detalle, también vemos los datos que acepta: ingredient y measurements. Ambas variables las ejecuta la función calc. Como la aplicación no sanitiza los datos que recibe, podemos aprovechar esta vulnerabilidad inyectando código malicioso.

Código del backend Flask expuesto en /debug, resaltando la llamada vulnerable a exec() y el manejador POST

Usamos curl para enviar una petición POST de la siguiente forma:

bash
curl -X POST http://83.136.252.214:36662/ -H "Content-Type: application/x-www-form-urlencoded" -d "ingredient=z&measurements=__import__('os').popen('cat+/etc/passwd').read()"

Y logramos un LFI.

Respuesta filtrando /etc/passwd a través de la inyección de código

Finalmente, la flag estaba en el mismo directorio en el que caímos dentro del servidor.

bash
curl -X POST http://83.136.252.214:36662/ -H "Content-Type: application/x-www-form-urlencoded" -d "ingredient=z&measurements=__import__('os').popen('cat+flag').read()"

La flag obtenida al leer el archivo flag con la misma inyección

Gracias por leer.