Cyber Apocalypse 2025 Escriptura - Prova per foc
Table of Contents
prova per foc
Per a aquest exercici, se'ns va donar una URL amb un WebApp i un fitxer ZIP que conté el codi font.
Mirant el codi font, veiem que és un Flask WebApp dins d’una imatge Docker gestionada per UWSGI i Supervisor
Quan visitem el lloc, ens reben aquesta pantalla:
L’última línia em va destacar. Comprovar la plantilla Jinja per a aquesta pàgina al codi font ens mostra la solució òbvia aquí: injecció de plantilla:
Per tant, ara sé que la injecció de plantilles és probable que sigui la victòria. El que necessito ara és un camp que puc injectar una càrrega útil que no s’escapa. Per sort, només hi ha un camp real que realment entrem a l’aplicació: el nom d’usuari del guerrer al principi. Cerqueu plantilles a la font, veiem una altra instància:
Per tant, sembla una direcció òbvia per entrar. Configuem el nostre nom d'usuari a
_BRACE0_
Després de jugar al joc, ens reben aquesta pantalla
Mirant les dades, hi ha diverses dades interessants:
- La ruta de l'aplicació:
/app/venv/lib/python3.12/site-packages/flask/app.py
- Accés a funcions perilloses com
eval
iexec
al diccionari__builtins__
- Dades de sessió que mostren la injecció funcionada:
'warrior_name': '_BRACE0_'
- Accés al context de l'aplicació actual:
current_app': <HTB 'application.app'>
Per tant, per trobar la bandera podem:
- funció
open
via__builtins__
os
mòdul- Diverses funcions d'execució de Python
Vaig acabar amb la càrrega útil SSTI ``{{ url_for.globals.builtins.open('/app/flag.txt').read() }}T10, que simplement llegeix la bandera. Malauradament, el formulari web limita la longitud del nom del caràcter, per la qual cosa hem d'utilitzar Burpsuite per interceptar la sol·licitud i substituir el nostre nom per la càrrega útil:
Aleshores, després de reproduir la seqüència, ens reben amb la bandera :)