Skip to main content

BreizhCTF 2025 | CurlMania

·670 words·4 mins
WiZee
Author
WiZee
Infosec student @ ESNA
Table of Contents

TL;DR
#

  • Le challenge impose de respecter dix commandements, incluant l’accès à la page /1337 avec divers en-têtes HTTP, cookies, paramètres, etc.
  • On utilise curl et sa documentation pour construire une requête conforme à ces exigences
  • En suivant les instructions à la lettre, on parvient à récupérer le flag

Informations du challenge
#

Auteur Mika
Catégorie Web/Serveur
Description Vous n’avez qu’une seule chose à faire, suivre les instructions…
Difficulté Très facile
Points 50
Résolutions 114/118
Sources https://github.com/BreizhCTF/breizhctf-2025/tree/main/web/curlmania/
URL https://curlmania.ctf.bzh/

Résolution du challenge
#

En se rendant sur curlmania.ctf.bzh, on y découvre une page avec les 10 commandements suivants :

  1. Accéder à la page /1337
  2. Votre User-Agent doit être J'aime la galette saucisse
  3. Votre requête doit utiliser la méthode GET et compter 3 paramètres GET dont un ayant pour valeur 35
  4. Un header HTTP LIBEREZ-GCC: OUI doit être présent
  5. Un cookie jaiplustropdinspi est obligatoire
  6. Le Content-Type doit être application/json
  7. Nul autre payload de data que enbretagne (JSON) ne doit être présent
  8. La valeur du paramètre de la règle 7 ne peut être que il fait toujours beau
  9. Le Content-Length doit être de 1337
  10. Votre Referer doit être Je jure solennellement que mes intentions sont mauvaises mais je ne vais pas taper sur l'infra

Ce challenge semble relativement abordable au premier coup d’œil, d’autant plus que sa description indique qu’il suffit de suivre les instructions à la lettre, mais je vais tout de même présenter sa résolution étape par étape.

Pour commencer, la véritable première étape avant d’accéder à la page /1337 serait de comprendre qu’on devra utiliser l’outil curl grâce au titre du challenge CurlMania.

Grâce à son manuel d’utilisation, il va être relativement facile de déterminer les arguments à utiliser pour résoudre ce challenge.

# 1. Accéder à la page /1337
curl "https://curlmania.ctf.bzh/1337"

# 2. Votre User-Agent doit être "J'aime la galette saucisse"
curl "https://curlmania.ctf.bzh/1337" \
    -H "User-Agent: J'aime la galette saucisse"

# 3. Votre requête doit utiliser la méthode GET et compter 3 paramètres GET dont un ayant pour valeur "35"
curl  "https://curlmania.ctf.bzh/1337?a=35&b=&c=" \
    -H "User-Agent: J'aime la galette saucisse" \
    -X GET

# 4. Un header HTTP "LIBEREZ-GCC: OUI" doit être présent
curl "https://curlmania.ctf.bzh/1337?a=35&b=&c=" \
    -H "User-Agent: J'aime la galette saucisse" \
    -X GET \
    -H "LIBEREZ-GCC: OUI"

# 5. Un cookie "jaiplustropdinspi" est obligatoire
curl "https://curlmania.ctf.bzh/1337?a=35&b=&c=" \
    -H "User-Agent: J'aime la galette saucisse" \
    -X GET \
    -H "LIBEREZ-GCC: OUI" \
    -b "jaiplustropdinspi=0"

# Information supplémentaire : Il est nécessaire de réaliser ces 3 étapes ensemble sans quoi le serveur répondra par une erreur 400 Bad Request
# 6. Le Content-Type doit être "application/json"
# 7. Nul autre payload de data que "enbretagne" (JSON) ne doit être présent
# 8. La valeur du paramètre de la règle 7 ne peut être que "il fait toujours beau"
curl "https://curlmania.ctf.bzh/1337?a=35&b=&c=" \
    -H "User-Agent: J'aime la galette saucisse" \
    -X GET \
    -H "LIBEREZ-GCC: OUI" \
    -b "jaiplustropdinspi=0" \
    -H "Content-Type: application/json" \
    --data-binary '{"enbretagne":"il fait toujours beau"}'

# 9. Le Content-Length doit être de 1337
curl "https://curlmania.ctf.bzh/1337?a=35&b=&c=" \
    -H "User-Agent: J'aime la galette saucisse" \
    -X GET \
    -H "LIBEREZ-GCC: OUI" \
    -b "jaiplustropdinspi=0" \
    -H "Content-Type: application/json" \
    --data-binary '{"enbretagne":"il fait toujours beau"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   }'
# Informations supplémentaires : Il y a 1299 espaces dans la valeur de la clé enbretagne afin d'obtenir un Content-Length de 1337. Utiliser -H "Content-Length: 1337" ne fonctionne pas, car curl calcule automatiquement le Content-Length, cela va donc générer l'envoi de 2 valeurs au serveur qui ne saura pas comment traiter cette requête

# 10. Votre Referer doit être "Je jure solennellement que mes intentions sont mauvaises mais je ne vais pas taper sur l'infra"
curl "https://curlmania.ctf.bzh/1337?a=35&b=&c=" \
    -H "User-Agent: J'aime la galette saucisse" \
    -X GET \
    -H "LIBEREZ-GCC: OUI" \
    -b "jaiplustropdinspi=0" \
    -H "Content-Type: application/json" \
    --data-binary '{"enbretagne":"il fait toujours beau"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   }' \
    -H "Referer: Je jure solennellement que mes intentions sont mauvaises mais je ne vais pas taper sur l'infra" \
    -s \
    | grep -oP 'BZHCTF{.+}'

On a respecté l’ensemble des commandements, on obtient donc le flag suivant BZHCTF{W0w_You_KnoW_H0w_To_FLLW_INSTRXCTIONS!!}.

Reply by Email