Cyber Apocalypse 2025 Escriptura - Prova per foc

· 2min · Juicecat
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 index.md-2.png Quan visitem el lloc, ens reben aquesta pantalla: index.md-3.png

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

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

Mirant les dades, hi ha diverses dades interessants:

  1. La ruta de l'aplicació: /app/venv/lib/python3.12/site-packages/flask/app.py
  2. Accés a funcions perilloses com eval i exec al diccionari __builtins__
  3. Dades de sessió que mostren la injecció funcionada: 'warrior_name': '_BRACE0_'
  4. 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: index.md-7.png

Aleshores, després de reproduir la seqüència, ens reben amb la bandera :) index.md-1.png