Cyber ​​Apocalypse 2025 écriture - Trial by Fire

· 2min · Juicecat
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 index.md-2.png Lorsque nous visitons le site, nous sommes accueillis par cet écran: index.md-3.png

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: index.md-4.png

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: index.md-5.png 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 index.md-6.png

En regardant les données, il existe plusieurs informations intéressantes:

  1. Le chemin de l'application: /app/venv/lib/python3.12/site-packages/flask/app.py
  2. Accès à des fonctions dangereuses comme eval et exec dans le dictionnaire __builtins__
  3. Données de session montrant l'injection fonctionnée: 'warrior_name': '_BRACE0_'
  4. 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: index.md-7.png

Ensuite, après avoir joué la séquence, nous sommes accueillis avec le drapeau :) index.md-1.png