
Exploit de ejecución remota de código sin autenticación para Craft CMS. Encadena almacenamiento de datos de sesión no saneado con deserialización insegura para ejecutar comandos arbitrarios en servidores vulnerables (versiones 3.x, 4.x, 5.x).
Ejecución remota de código sin autenticación previa en Craft CMS
Descubierto y desarrollado por Mohammed Idrees Banyamer
CVE-2025-32432 es una vulnerabilidad crítica de ejecución remota de código (RCE) sin autenticación previa que afecta a múltiples versiones de Craft CMS. Al encadenar el almacenamiento de datos de sesión sin sanitizar con un gadget de deserialización inseguro, un atacante no autenticado puede ejecutar comandos arbitrarios en el servidor remoto.
| Rama | Vulnerable hasta |
|---|---|
| Craft CMS 3.x | ≤ 3.9.14 |
| Craft CMS 4.x | ≤ 4.14.14 |
| Craft CMS 5.x | ≤ 5.6.16 |
⚠️ Todas las versiones anteriores que presenten el comportamiento de enrutamiento descrito también probablemente estén afectadas.
La vulnerabilidad surge al encadenar dos debilidades distintas en el endpoint assets/generate-transform:
El comportamiento antiguo de enrutamiento escribe parámetros de consulta sin procesar directamente en el archivo de sesión PHP en /tmp/sess_<PHPSESSID>, sin sanitización ni filtrado.
Una cadena de gadgets de deserialización de Yii (FieldLayoutBehavior → PhpManager) permite a un atacante forzar la inclusión de un archivo arbitrario — en este caso, el archivo de sesión envenenado.
Impacto combinado: Compromiso total del servidor, exfiltración de datos, movimiento lateral y más.
requestsurllib3# Install via requirements file
pip install -r requirements.txt
# Or install directly
pip install requests urllib3
python exploit.py -u <target_url> -c "<command>" [options]
# Auto-exploit — brute-forces Asset ID automatically
python exploit.py -u https://craft.example.com -c "id"
# With a known Asset ID — more reliable and faster
python exploit.py -u https://craft.example.com -c "cat /etc/passwd" -a 42
# Custom timeout + verbose output
python exploit.py -u https://craft.example.com -c "uname -a" -t 10 -v
Step 1 ──► Session Establishment
Fetch homepage → obtain PHPSESSID cookie
Step 2 ──► Asset ID Resolution
Provided via -a flag OR brute-forced (non-404 detection)
Step 3 ──► Session Poisoning
Malicious GET request → raw PHP injected into /tmp/sess_<PHPSESSID>
Step 4 ──► RCE Trigger
Crafted deserialisation payload → PhpManager includes session file
→ PHP executes → system command runs → output returned
💡 La salida del comando se imprime (primeros 2,000 caracteres). Para interacción completa, se recomienda una reverse shell.
requirements.txt
requests>=2.31.0
urllib3>=2.0
Esta herramienta está destinada únicamente a fines educativos y evaluaciones de seguridad autorizadas.
No la utilice contra ningún sistema sin el permiso explícito y por escrito del propietario del sistema.
El autor no asume ninguna responsabilidad por el mal uso o daño causado por esta herramienta. Al usar este software, usted acepta que es el único responsable de sus propias acciones y que cumplirá con todas las leyes locales, nacionales e internacionales aplicables.
| Rol | Detalles |
|---|---|
| 🔍 Descubrimiento del CVE y Exploit Original | Mohammed Idrees Banyamer |
| 🐙 GitHub | @TheMursalin |
| 🤝 Refinamiento de código | Contribuciones de la comunidad bienvenidas |
⭐ Si te resulta útil, considera seguir a @TheMursalin para más exploits, writeups y herramientas de seguridad.
Este proyecto se publica bajo la Licencia MIT — consulte el archivo LICENSE para más detalles.
| Flag | Descripción | Por defecto |
|---|
-u, --url | Requerido. URL base del objetivo (ej. https://example.com) | — |
-c, --cmd | Requerido. Comando del sistema a ejecutar (ej. id, whoami) | — |
-a, --asset | ID de Asset válido conocido (acelera significativamente la explotación) | Ninguno |
--scan-max | ID máximo de Asset para fuerza bruta cuando no se proporciona un ID | 300 |
-t, --timeout | Tiempo de espera de la solicitud en segundos | 15 |
-v, --verbose | Habilitar salida detallada/depuración | Desactivado |