
Ausführlicher Bericht über CVE-2021-41773 Apache Path Traversal und RCE-Ausnutzung mit Schritt-für-Schritt-Befehlen und Root-Cause-Analyse aus einer TryHackMe-Lab-Umgebung.
Writeup des TryHackMe-Raums "Modern Web Stacks", der sich auf die Ausnutzung von CVE-2021-41773 konzentriert, einer Path-Traversal-Schwachstelle im Apache HTTP Server 2.4.49, die zu Remote-Code-Ausführung führt, wenn mod_cgi aktiviert ist.
| Element | Details |
|---|
| Schwachstelle | CVE-2021-41773 — Apache 2.4.49 Path Traversal / RCE |
| Zieldienst | Apache HTTP Server auf Port 8080 |
| Anfällige Version | Apache/2.4.49 (Unix) |
| Grundursache | Fehlerhafte Normalisierungsreihenfolge in ap_normalize_path() |
| Auswirkung | Beliebiges Dateilesen → Remote Code Execution über mod_cgi |
| Verwendete Tools | curl |
Apache 2.4.49 hat geändert, wie ap_normalize_path() URLs verarbeitet. Apache soll jeden Anforderungspfad blockieren, der ../ enthält, bevor er das Dateisystem erreicht – aber der Traversal-Filter läuft bevor die vollständige URL-Decodierung stattfindet.
Das bedeutet, dass eine Anfrage mit der doppelt kodierten Sequenz .%2e/ vom Filter nicht als ../ erkannt wird. Sobald Apache den Pfad jedoch an das Betriebssystem übergibt, wird .%2e/ zu ../ aufgelöst, und der Traversal-Filter wurde bereits umgangen.
Für sich genommen erlaubt dies das beliebige Lesen von Dateien außerhalb des Web-Root. Die Auswirkung wird kritisch, wenn dies mit mod_cgi kombiniert wird: Wenn der Traversal-Pfad zu einer ausführbaren Datei wie /bin/sh innerhalb eines CGI-fähigen Verzeichnisses (z. B. /cgi-bin/) aufgelöst wird, führt Apache diese als CGI-Skript aus und übergibt den HTTP-POST-Body an seine STDIN – das ermöglicht Remote-Befehlsausführung.
Der Server-Antwortheader des Ziels wurde identifiziert als:
Apache/2.4.49 (Unix)
Diese Version ist direkt von CVE-2021-41773 betroffen.
/cgi-bin/ prüfenDie Anfrage an /cgi-bin/ ergab eine 403 Forbidden-Antwort (keine 404), was darauf hindeutet, dass das Verzeichnis existiert und mod_cgi wahrscheinlich aktiviert ist – eine Voraussetzung für RCE über dieses CVE.
curl mit dem --path-as-is-Flag verwendet, um die kodierte Traversal-Sequenz genau so zu senden, wie sie eingegeben wurde, ohne dass curl sie clientseitig normalisiert:
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'
Warum --path-as-is erforderlich ist: Standardmäßig normalisiert curl URLs und entfernt .%2e/-Sequenzen, bevor die Anfrage überhaupt gesendet wird. --path-as-is weist curl an, die URL genau so zu senden, wie sie geschrieben wurde, und bewahrt die kodierte Traversal, sodass sie unversehrt beim Server ankommt.
Das Payload traversierte aus /cgi-bin/ zum Root-Dateisystem, führte /bin/sh als CGI-Skript über den injizierten POST-Body aus und gab den Inhalt von /flag.txt zurück.
Flag-Format bestätigt: THM{...}
(Flagge gemäß TryHackMe-Richtlinien für öffentliche Writeups geschwärzt.)
mod_cgi + Path Traversal = RCE. Alleiniges Dateilesen ist schlecht; kombiniert mit einem CGI-ausführbaren Verzeichnis wird daraus Befehlsausführung.--path-as-is (oder ein entsprechendes Raw-Request-Tool) ist beim Testen von kodierungsbasierten Umgehungen unerlässlich.mod_cgi, sofern nicht explizit erforderlich.Dieses Writeup dokumentiert eine Laborumgebung (TryHackMe). Es wurden keine unbefugten Systeme zugegriffen.