Search

Escribe para buscar.

en
HackConRD CTF 2024: Broken Production

HackConRD CTF 2024: Broken Production

Junior Restituyo
0xR3iko

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.

Página de login del portal del reto

Seguimos adelante y creamos una cuenta para entrar al portal.

Registro de una cuenta nueva en el 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.

Sesión iniciada como Employee, con acceso limitado

Archivos:

Archivos de código fuente entregados con el reto

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.

Dockerfile que revela la creación de la flag y su nombre aleatorio

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.

SessionHandler.php mostrando la lógica de la cookie PHPSESSID en Base64

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

Codificando el usuario admin como valor de cookie en Base64

Estableciendo la cookie PHPSESSID forjada en el navegador

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

Panel de administración con 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.

admin.php sanitizando ../ en el parámetro GET utils

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

LFI logrado saltando el filtro con ....//

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

Leyendo el log de acceso del servidor a través del LFI

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

Inyectando un payload PHP en el header User-Agent con Burp Suite

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

Ejecutando un comando a través de la entrada de log envenenada

Salida del comando devuelta mediante el RCE por log poisoning

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

Enumerando el directorio raíz y localizando el archivo de la flag

Leyendo el nombre aleatorio del archivo de la flag

Finalmente, obtuvimos nuestra flag.

Obteniendo la flag a través del RCE

La flag devuelta en la respuesta

Gracias por leer.