
Analisi dettagliata di CVE-2021-41773, path traversal di Apache e sfruttamento RCE, con comandi passo-passo e analisi delle cause principali da un ambiente di laboratorio TryHackMe.
Writeup della room "Modern Web Stacks" di TryHackMe, incentrata sullo sfruttamento di CVE-2021-41773, una vulnerabilità di path traversal in Apache HTTP Server 2.4.49 che porta a esecuzione di codice remoto quando mod_cgi è abilitato.
| Elemento | Dettaglio |
|---|
| Vulnerabilità | CVE-2021-41773 — Apache 2.4.49 Path Traversal / RCE |
| Servizio target | Apache HTTP Server sulla porta 8080 |
| Versione vulnerabile | Apache/2.4.49 (Unix) |
| Causa principale | Ordine di normalizzazione errato in ap_normalize_path() |
| Impatto | Lettura arbitraria di file → Esecuzione di codice remoto tramite mod_cgi |
| Strumenti usati | curl |
Apache 2.4.49 ha modificato il modo in cui ap_normalize_path() elabora gli URL. Apache dovrebbe bloccare qualsiasi percorso di richiesta contenente ../ prima che raggiunga il filesystem, ma il filtro di traversal viene eseguito prima della completa decodifica dell'URL.
Ciò significa che una richiesta che utilizza la sequenza doppiamente codificata .%2e/ non viene riconosciuta come ../ dal filtro. Tuttavia, una volta che Apache passa il percorso al sistema operativo, .%2e/ viene risolto in ../, e il filtro di traversal è già stato aggirato.
Da sola, questa falla consente la lettura arbitraria di file al di fuori della directory web. L'impatto diventa critico se abbinato a mod_cgi: se il percorso di traversal risolve in un eseguibile come /bin/sh all'interno di una directory abilitata per CGI (ad es. /cgi-bin/), Apache lo esegue come script CGI e passa il corpo della richiesta HTTP POST al suo stdin — ottenendo così l'esecuzione remota di comandi.
Identificato l'header Server della risposta del target come:
Apache/2.4.49 (Unix)
Questa versione è direttamente affetta da CVE-2021-41773.
/cgi-bin/Richiesto /cgi-bin/ e ricevuta una risposta 403 Forbidden (non un 404), indicando che la directory esiste e che mod_cgi è probabilmente abilitato — prerequisito per la RCE tramite questa CVE.
Usato curl con il flag --path-as-is per inviare la sequenza di traversal codificata esattamente come scritta, senza che curl la normalizzi lato client:
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'
Perché --path-as-is è necessario: di default, curl normalizza gli URL e rimuove le sequenze .%2e/ prima ancora di inviare la richiesta. --path-as-is dice a curl di inviare l'URL esattamente come scritto, preservando il traversal codificato in modo che arrivi integro al server.
Il payload ha attraversato fuori da /cgi-bin/ fino al filesystem di root, ha eseguito /bin/sh come script CGI tramite il corpo POST iniettato e ha restituito il contenuto di /flag.txt.
Formato flag confermato: THM{...}
(Flag oscurata secondo le linee guida di TryHackMe per i writeup pubblici.)
mod_cgi + path traversal = RCE. La sola lettura di file è già grave; combinata con una directory eseguibile CGI, diventa esecuzione di comandi.--path-as-is (o uno strumento equivalente per richieste grezze) è essenziale quando si testano bypass basati su codifica.mod_cgi se non esplicitamente necessario.Questo writeup documenta un ambiente di laboratorio (TryHackMe). Non sono stati acceduti sistemi non autorizzati.