Alice and the Literal Escape

Flag: ECW{st4rlit_carg0_manif3st}

Challenge

file-download
1KB
circle-info

Description


Captain-explorer Alice sets sail on the Star Wind for a crossing into the unknown! Two security locks protect the cargo hold: the Quartermaster checks that only the ship's mousses embarked ‘from the deck’ have access to the administration bridge. The Logbook records every cargo in the hold; a strange process converts your notes into a record. Flag is located in flag.txt

Challenge made by icegeo from :

circle-exclamation

Solution

Accès au site

Première chose à remarquer dans le fichier src.py donné : on ne peut pas accèder au site si notre IP est différente de 127.0.0.1.

TRUSTED_IPS = ["127.0.0.1"]

app = FastAPI()
config = SecurityConfig(
    whitelist=TRUSTED_IPS,
    blacklist=[],
)

Pour contourner ça, on va utiliser l'entête X-Forwarded-For pour que le proxy remplace notre IP par celle qu'on lui donne. Ca fera croire au serveur web qu'on est trust


Injection SQL

On continue l'exploration de src.py , à la ligne 28 : on a une injection SQL très claire...


Analyse de psql

Le serveur lance les query SQL d'une manière assez particulière : il utilise psql. Il a la particularité d'avoir des méta commandes, permettant un tas de choses. Comme par exemple :


Exploitation

Bon, si on peut injecter la query, on peut y placer une meta commande qui exécute une commande shell... Ca tombe bien, on a une injection SQL !

Le payload est assez simple :

  • ') : il faut d'abord sortir de l'INSERT

  • \! cat flag.txt : puis ajouter la méta commande

  • # : finalement, on commente le reste pour éviter les bugs.

Ce qui donne : '); \! cat flag.txt #

Et en python :

Mis à jour