
Analyse détaillée de l'exploitation de la traversée de chemin et d'exécution de code à distance (RCE) d'Apache CVE-2021-41773, avec des commandes étape par étape et une analyse des causes profondes provenant d'un environnement de laboratoire TryHackMe.
Writeup de la salle TryHackMe « Modern Web Stacks », axée sur l'exploitation de CVE-2021-41773, une vulnérabilité de contournement de chemin dans Apache HTTP Server 2.4.49 qui conduit à une exécution de code à distance lorsque mod_cgi est activé.
| Élément | Détail |
|---|
| Vulnérabilité | CVE-2021-41773 — Contournement de chemin / RCE Apache 2.4.49 |
| Service cible | Serveur Apache HTTP sur le port 8080 |
| Version vulnérable | Apache/2.4.49 (Unix) |
| Cause racine | Ordre de normalisation défaillant dans ap_normalize_path() |
| Impact | Lecture arbitraire de fichiers → Exécution de code à distance via mod_cgi |
| Outils utilisés | curl |
Apache 2.4.49 a modifié la façon dont ap_normalize_path() traite les URL. Apache est censé bloquer toute requête contenant ../ avant qu'elle n'atteigne le système de fichiers — mais le filtre de contournement s'exécute avant le décodage complet de l'URL.
Cela signifie qu'une requête utilisant la séquence doublement encodée .%2e/ n'est pas reconnue comme ../ par le filtre. Cependant, une fois qu'Apache transmet le chemin au système d'exploitation, .%2e/ est résolu en ../, et le filtre de contournement a déjà été contourné.
Seule, cette vulnérabilité permet une lecture arbitraire de fichiers en dehors de la racine web. L'impact devient critique lorsqu'elle est combinée avec mod_cgi : si le chemin de contournement aboutit à un exécutable comme /bin/sh dans un répertoire compatible CGI (par exemple /cgi-bin/), Apache l'exécute comme un script CGI et transmet le corps de la requête HTTP POST à son entrée standard — donnant lieu à une exécution de commande à distance.
Identifié l'en-tête Server de la cible comme :
Apache/2.4.49 (Unix)
Cette version est directement concernée par CVE-2021-41773.
/cgi-bin/Requête de /cgi-bin/ et réponse 403 Interdit (pas 404), indiquant que le répertoire existe et que mod_cgi est probablement activé — une condition préalable à la RCE via cette CVE.
Utilisation de curl avec l'option --path-as-is pour envoyer la séquence encodée exactement comme tapée, sans que curl ne la normalise côté client :
curl -s --path-as-is "http://<TARGET_IP>:8080/cgi-bin/.%2e/.%2e/.%2e/.%2e/bin/sh" \
--data 'echo Content-Type: text/plain; echo; cat /flag.txt'
Pourquoi --path-as-is est nécessaire : par défaut, curl normalise les URL et supprime les séquences .%2e/ avant même d'envoyer la requête. --path-as-is indique à curl d'envoyer l'URL exactement comme écrite, préservant le contournement encodé pour qu'il atteigne le serveur intact.
La charge utile a traversé hors de /cgi-bin/ vers le système de fichiers racine, exécuté /bin/sh comme script CGI via le corps POST injecté, et renvoyé le contenu de /flag.txt.
Format du drapeau confirmé : THM{...}
(Drapeau expurgé conformément aux directives de TryHackMe concernant les writeups publics.)
mod_cgi + contournement de chemin = RCE. La lecture de fichier seule est déjà grave ; combinée avec un répertoire exécutable CGI, elle devient une exécution de commande.--path-as-is (ou un outil équivalent de requête brute) est essentiel lors du test de contournements basés sur l'encodage.mod_cgi sauf si explicitement nécessaire.Ce writeup documente un environnement de laboratoire (TryHackMe). Aucun système non autorisé n'a été accédé.