HackConRD CTF 2024: Broken Production
Empezamos yendo al portal para ver a qué nos enfrentábamos: aparece una página de login. Probamos algo de SQLi y revisamos el código fuente, pero no encontramos nada.

Seguimos adelante y creamos una cuenta para entrar al portal.

A primera vista vemos que nuestro rol es Employee y no Admin. Este usuario tiene acceso limitado, así que fuimos a revisar el código fuente que recibimos como foothold.

Archivos:
![]()
Mirando el Dockerfile vimos cosas interesantes, como archivos de configuración y rutas, además de una flag falsa seguida de la creación de la flag real que buscamos. Acá podemos ver la ruta de creación /, y también que la flag tiene números aleatorios en su nombre.

Siguiendo, en los archivos encontramos challenge/SessionHandler.php. Acá vemos que la sesión está controlada por una cookie PHPSESSID que equivale a un JSON {"username": username} codificado en Base64.

Sabiendo que necesitamos la sesión de admin, codificamos esta información en Base64 y obtenemos la cookie que necesitábamos.
![]()

Una vez dentro como admin, vemos que tenemos la opción de ver los logs del servidor.

Volviendo a los archivos entregados, revisamos challenge/view/admin.php. Acá vemos el directorio utils que se recibe por una petición GET, y parece estar sanitizando ../ anticipando un LFI.

Intentamos saltar esta sanitización y logramos encontrar un LFI usando ....//.

Con este LFI y acceso a los logs del servidor, podemos intentar colarnos mediante log poisoning.

Para eso vamos a Burp Suite y cambiamos el User-Agent a <?php system($_GET['cmd']); ?>.

Ahora, usando un nuevo parámetro cmd, podemos ejecutar comandos y revisar los logs en busca de una respuesta.


Después enumeramos el directorio raíz y encontramos la flag flag_08d4f2e9753d32.txt.


Finalmente, obtuvimos nuestra flag.


Gracias por leer.