
# Laboratorio CTF basato su Docker che dimostra CVE-2024-4577, iniezione di argomenti PHP-CGI che porta a RCE. Include PHP 5.4.1 CGI vulnerabile, script di exploit e recupero della flag.
Un laboratorio Docker autonomo, creato da zero, che dimostra la primitiva reale
di iniezione di argomenti → Esecuzione Remota di Codice alla base di CVE-2024-4577.
Sfruttalo su http://localhost:8080, ottieni una shell e leggi la flag
dall'interno del container.
Questa è una vulnerabilità genuina, non simulata. Il container compila un binario PHP 5.4.1 CGI non patchato e lo collega dietro Apache esattamente come sono configurati i host vulnerabili reali. Non c'è alcun falso controllo "if password == flag" da nessuna parte — l'unico modo per ottenere la flag è ottenere effettivamente l'esecuzione di codice.
Il payload caratteristico di CVE-2024-4577 usa %AD (un trattino morbido). Quel trucco
funziona solo su Windows, perché la codifica dei caratteri "Best-Fit" di Windows
converte il byte 0xAD in un vero - (0x2D) dopo che la patch di CVE-2012-1823 di PHP
ha già controllato la stringa di query. Quella conversione di codifica viene eseguita da
Windows stesso — non avviene all'interno di un normale container Docker Linux.
Quindi, un laboratorio Linux fedele e eseguibile sulla tua macchina riproduce la stessa identica
primitiva RCE — iniezione di opzioni php-cgi tramite l'URL → -d auto_prepend_file=php://input → esecuzione di codice — usando la forma con - letterale
(che è il bug padre di CVE-2024-4577, CVE-2012-1823). L'unica
differenza rispetto a un vero target Windows CVE-2024-4577 è il livello di bypass di codifica
%AD→-, che questo README documenta integralmente (vedi
Come funziona e
poc.http).
| Questo laboratorio Linux | CVE-2024-4577 reale (Windows) | |
|---|---|---|
| Componente vulnerabile | php-cgi | php-cgi |
| Primitiva RCE | -d auto_prepend_file=php://input | identica |
| Delimitatore nell'URL | - letterale | %AD (best-fit → -) |
| Bypassa la patch del 2012? | N/D (PHP precede la patch) | Sì, tramite best-fit di Windows |
| Funziona su Win 11 Home + Docker Desktop | ✅ | ❌ (richiede container Windows) |
Se hai specificamente bisogno della riproduzione bit-per-bit del %AD di Windows, ti serve
un host Docker in grado di eseguire container Windows (Windows Server / Win Pro + Hyper-V) —
non funzionerà su Windows 11 Home. Il payload Windows è incluso in
poc.http come riferimento.
CVE-2024-4577 — Iniezione di Argomenti PHP CGI che porta a Esecuzione Remota di Codice. Scoperta da DEVCORE (Orange Tsai / Angelboy), divulgata 2024-06-06.
Quando PHP è distribuito in modalità CGI (o il binario php-cgi.exe è altrimenti
raggiungibile) su Windows con determinate impostazioni locali di sistema (cinese tradizionale/semplificato,
giapponese e altre), il server web passa la stringa di query HTTP a
php-cgi come argomenti della riga di comando. Un attaccante può introdurre di nascosto
opzioni della riga di comando di php-cgi (-d ...) in quella stringa di query. La conversione
della tabella codici best-fit di Windows trasforma il byte del trattino morbido 0xAD (%AD) in un
trattino ASCII -, che elude l'indurimento di CVE-2012-1823 e consente all'attaccante
di impostare direttive INI PHP arbitrarie — la più utile è
auto_prepend_file=php://input con allow_url_include=1, che esegue il
corpo della richiesta fornito dall'attaccante come PHP. Risultato: esecuzione remota di codice
non autenticata. È stato armato nel mondo reale entro pochi giorni (ad es. ransomware
TellYouThePass).
CGI passa la stringa di query come argv. Secondo RFC 3875, se la stringa di query di una
richiesta CGI non contiene = non codificato, il server la divide su +,
decodifica ogni parola dall'URL e passa le parole al programma CGI come
argomenti della riga di comando. php-cgi riceve quindi un argv
controllato dall'attaccante.
php-cgi interpreta quegli argv come opzioni. Storicamente php-cgi
interpretava -d chiave=valore, -T, ecc. da quell'argv. Fornire
-d allow_url_include=1 -d auto_prepend_file=php://input fa sì che PHP esegua
il corpo della richiesta come codice → CVE-2012-1823.
La correzione di CVE-2012-1823 è incompleta su Windows. La patch del 2012 ha aggiunto
un controllo in sapi/cgi/cgi_main.c: approssimativamente "se la stringa di query (grezza) inizia
con - e non ha =, salta l'analisi delle opzioni (skip_getopt)." Un attaccante
che invia un - letterale ora viene bloccato.
La codifica best-fit sconfigge il controllo (il bug del 2024). Su Windows, PHP
converte la riga di comando usando la tabella codici della locale con mapping best-fit
abilitato. L'attaccante invia %AD (byte 0xAD, trattino morbido). Al
momento del controllo, il primo byte è 0xAD, non -, quindi
skip_getopt non viene impostato. Successivamente, quando PHP costruisce effettivamente l'argv,
Windows mappa best-fit 0xAD → -, quindi getopt ora vede -d. L'iniezione
di opzioni scatta dopo il controllo che avrebbe dovuto fermarla. Quell'ordine
controllo-poi-conversione è l'intera vulnerabilità.
In questo laboratorio Linux, i passaggi 1–2 sono riprodotti esattamente con un php-cgi che precede la patch del passaggio 3, quindi la forma con
-letterale funziona e dimostra la RCE identica. Il passaggio 4 è il livello solo-Windows, documentato ma non eseguito (Linux non ha conversione best-fit).
Corretta in 8.3.8, 8.2.20, 8.1.29. Pertanto vulnerabili:
Condizioni: sistema operativo Windows; PHP eseguito come CGI o php-cgi.exe esposto
(la configurazione predefinita XAMPP su Windows è vulnerabile); una locale
interessata per il percorso best-fit. (Il bug padre CVE-2012-1823 — la primitiva
che questo laboratorio esegue — interessa qualsiasi sistema operativo che esegue un php-cgi precedente alla correzione del 2012 in questa
configurazione.)
cve-2024-4577-lab/ ├── Dockerfile # builds the lab: compiles unpatched PHP 5.4.1 CGI + Apache ├── Dockerfile.vulhub # fallback: prebuilt vulnerable base image (if compile fails) ├── docker-compose.yml # one-command build+run, maps localhost:8080 -> 80 ├── start.sh # container entrypoint (Apache foreground) ├── exploit.sh # one-shot RCE PoC (bash + curl) ├── poc.http # raw HTTP requests (Linux payload + real Windows %AD payload) ├── app/ │ └── index.php # ordinary web page (NOT itself vulnerable) ├── config/ │ ├── apache-vhost.conf # the vulnerable Apache <-> php-cgi wiring │ └── php.ini # minimal php.ini (cgi.force_redirect=0, etc.) ├── flag.txt # the flag (copied to /flag.txt in the container) └── README.md # this file
## 5. Prerequisiti
- **Docker Desktop** (Windows/macOS) o Docker Engine (Linux).
Windows 11 Home: installa Docker Desktop con il backend **WSL 2** (predefinito).
→ https://www.docker.com/products/docker-desktop/
- `curl` per lo sfruttamento (`curl.exe` è integrato in Windows 10/11; disponibile anche in
Git Bash / WSL / macOS / Linux).
- Accesso a Internet **durante la build** (scarica il sorgente di PHP 5.4.1).
## 6. Istruzioni di build
Apri un terminale nella cartella `cve-2024-4577-lab/`.
### Opzione A — docker compose (consigliata)```bash
docker compose up --build -d