Cyber Apocalypse 2025 Escritura - Prueba por fuego
Table of Contents
juicio por fuego
Para este ejercicio, nos dieron una URL con una aplicación web y un archivo zip que contiene el código fuente.
Mirando el código fuente, vemos que es una aplicación web de frascos dentro de una imagen de Docker administrada por UWSGI y Supervisord
Cuando visitamos el sitio, nos recibe esta pantalla:
La última línea se destacó para mí.Verificar la plantilla Jinja para esta página en el código fuente nos muestra la solución obvia aquí: inyección de plantilla:
Entonces, ahora sé que la inyección de plantilla es probablemente el camino a la victoria.Lo que necesito ahora es un campo en el que puedo inyectar una carga útil que no se escape.Afortunadamente, solo hay un campo real en el que realmente ingresamos en la aplicación: el nombre de usuario del guerrero al principio.Buscando las plantillas de la fuente, vemos otra instancia:
Entonces, esta parece una dirección obvia para entrar. Establezcamos nuestro nombre de usuario en
_BRACE0_
Después de jugar el juego, somos recibidos con esta pantalla.
Mirando los datos, hay varias piezas interesantes de información:
- La ruta de la aplicación:
/app/venv/lib/python3.12/site-packages/flask/app.py
- Acceso a funciones peligrosas como
eval
yexec
en el diccionario__builtins__
- Datos de sesión que muestran que la inyección funciona:
'warrior_name': '_BRACE0_'
- Acceso al contexto de la aplicación actual:
current_app': <HTB 'application.app'>
Entonces, para encontrar la bandera podemos:
- Función
open
a través de__builtins__
- módulo
os
- Varias funciones de ejecución de Python
Terminé con la carga útil SSTI {{ url_for.__globals__.__builtins__.open('/app/flag.txt').read() }}
, que simplemente solo lee el indicador.Desafortunadamente, el formulario web limita la longitud del nombre del personaje, por lo que debemos usar BurPsuite para interceptar la solicitud y reemplazar nuestro nombre con la carga útil:
Luego, después de jugar la secuencia, somos recibidos con la bandera :)