Cyber Apocalypse 2025 écriture - Trial by Fire
Table of Contents
Trial by Fire
Pour cet exercice, on nous a donné une URL avec un webApp et un fichier zip contenant le code source.
En regardant le code source, nous voyons que c'est un Flask Webapp à l'intérieur d'une image Docker gérée par UWSGI et SuperVisord
Lorsque nous visitons le site, nous sommes accueillis par cet écran:
La dernière ligne m'a marqué. La vérification du modèle Jinja pour cette page dans le code source nous montre la solution évidente ici: injection de modèle:
Donc, je sais maintenant que l'injection de modèle est probablement le chemin de la victoire. Ce dont j'ai besoin maintenant, c'est un champ dans lequel je peux injecter une charge utile qui n'est pas échappé. Heureusement, il n'y a qu'un seul champ réel que nous entrons réellement dans l'application - le nom d'utilisateur du guerrier au début. Recherche dans la source des modèles, nous voyons une autre instance:
Donc, cela semble être une direction évidente pour entrer. Définissons notre nom d'utilisateur sur
_BRACE0_
Après avoir joué le jeu, nous sommes accueillis avec cet écran
En regardant les données, il existe plusieurs informations intéressantes:
- Le chemin de l'application:
/app/venv/lib/python3.12/site-packages/flask/app.py
- Accès à des fonctions dangereuses comme
eval
etexec
dans le dictionnaire__builtins__
- Données de session montrant l'injection fonctionnée:
'warrior_name': '_BRACE0_'
- Accès au contexte de l'application actuel:
current_app': <HTB 'application.app'>
Donc, pour trouver le drapeau que nous pouvons:
- fonction
open
via__builtins__
- Module
os
- Diverses fonctions d'exécution Python
Je me suis retrouvé avec la charge utile SSTI {{ url_for.__globals__.__builtins__.open('/app/flag.txt').read() }}
, qui lit simplement le drapeau. Malheureusement, le formulaire Web limite la longueur du nom du caractère, nous devons donc réellement utiliser Burpsuite pour intercepter la demande et remplacer notre nom par la charge utile:
Ensuite, après avoir joué la séquence, nous sommes accueillis avec le drapeau :)