Skip to content
KitploitKITPLOIT
ИнструментыЭксплойтыБлог
Log in
Отправить
ИнструментыЭксплойтыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
CVE-2023-46604 — Глубокий технический анализ CVE-2023-46604, уязвимости RCE в протоколе OpenWire Apache ActiveMQ, включая разбор структуры пакетов и механизм эксплуатации. | Kitploit
Инструменты/GitHubGitHub/skrkcb2/cve-2023-46604
Анализ уязвимостейЭксплуатацияСтатьи и ИсследованияОбучение и ОбразованиеЭксплуатация Бинарных Файлов
GitHubskrkcb2/cve-2023-46604

CVE-2023-46604

Глубокий технический анализ CVE-2023-46604, уязвимости RCE в протоколе OpenWire Apache ActiveMQ, включая разбор структуры пакетов и механизм эксплуатации.

Репозиторий
161 год назадЕщё не проверено

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

CVE-2023-46604

01. Apache ActiveMQ и OpenWire

  • 1) Обзор Apache ActiveMQ и OpenWire

    ActiveMQ — это брокер, поддерживающий JMS и позволяющий осуществлять связь между системами, использующими не только Java, но и различные другие языки. Кроме того, это сервер с открытым исходным кодом для обмена сообщениями и шаблонами интеграции, который обеспечивает согласованность и устойчивость между системами благодаря функциям кластеризации, а также через базу данных и файловую систему.

    OpenWire — это бинарный протокол обмена сообщениями, используемый в Apache ActiveMQ. Он разработан для эффективной передачи данных между брокером (ActiveMQ) и клиентами.

    CVE-2023-46604 — это уязвимость в ActiveMQ, связанная с протоколом OpenWire (в процессе маршалинга). Удаленный злоумышленник, имеющий сетевой доступ к брокеру или клиенту OpenWire на основе Java, может манипулировать сериализованным типом класса в протоколе OpenWire, тем самым заставляя клиента или брокера (соответственно) инстанцировать любой класс, находящийся в classpath, что приводит к выполнению произвольных команд оболочки. Этот метод атаки характерен для APT-группы Andariel.

02. Анализ уязвимости через протокол OpenWire в среде Apache ActiveMQ 5.17.3

  • 2.1 Анализ пакетов и методы атаки через протокол OpenWire

    CVE-2023-46604 реализуется путем манипуляции XML-вызовами или внедрения вредоносных данных в процессе обмена данными через протокол OpenWire, что приводит к выполнению удаленных команд. Протокол OpenWire обрабатывает сериализацию и передачу данных, а уязвимость заключается в том, что в процессе сериализации допускается использование вредоносных типов классов.

    Описание изображения

    [Рисунок] POC

    Описание изображения

    [Рисунок] XML

    Рассмотрим анализ пакетов, отправляемых по протоколу OpenWire в ActiveMQ 5.17.3. Прежде всего, необходимо понимать структуру пакетов.
    Заголовок пакета 
      +----------------------------------------------------------------------------------+
    | Длина пакета | Команда | Ид. команды | Требуется ответ на команду | CorrelationId |
    |---------------|---------|------------|---------------------------|---------------|
    |   00000066    |   1f    |  00000000  |          00               |   00000000    |
    +----------------------------------------------------------------------------------+
    
    Тело пакета
      +--------------------------------------------------------------------------------------+
    | not-null | not-null | classname-size | classname | not-null | message-size | message |
    |----------|----------|----------------|-----------|----------|--------------|---------|
    |    01    |    01    |      0043      |   .....   |    01    |     0012     |  .....  |
    +--------------------------------------------------------------------------------------+
    
    Формат тела пакета OpenWire
                   [=Если not-null равен 1===========]
    +----------+ [ +-------+----------------+ ]
    | not-null | [ | size  | encoded-string | ]
    +----------+ [ +-------+----------------+ ]
    | байт     | [ | short | size октетов   | ]
    +----------+ [ +-------+----------------+ ]
                 [============================]
    

    Описание изображения

    [Рисунок 1] Проверка пакета OpenWire в WireShark

    На [Рисунке 1] показана фактическая полезная нагрузка, содержащая заголовок и тело пакета, описанные выше (для удобства использован вызов через файловую систему, а не через classpath в исходном POC). Рассмотрим более подробно, как эти содержимое пакета взаимодействуют и почему их нужно отправлять именно так.

    Описание изображения

    [Рисунок 2] Значение заголовка пакета

 Разбор заголовка пакета
   +----------------------------------------------------------------------------------+
  | Длина пакета | Команда | Ид. команды | Требуется ответ на команду | CorrelationId |
  |---------------|---------|------------|---------------------------|---------------|
  |   00000066    |   1f    |  00000000  |          00               |   00000000    |
  +----------------------------------------------------------------------------------+

 Длина пакета : 00000066 / Протоколы типа OpenWire по умолчанию указывают длину пакета.
 Команда : 1f / Устанавливается для обозначения ExceptionResponse(31). 31 в шестнадцатеричном виде — 1f.
 Ид. команды : 00000000 / Имеет тип int (4 байта), в шестнадцатеричном представлении 00 00 00 00.
 Требуется ответ на команду : 00 / Логический тип: True(01), False(00); здесь False.
 CorrelationId : Тот же тип, что и Ид. команды.

[Рисунок 2] содержит пояснения к форме и назначению каждого поля заголовка пакета, чтобы облегчить понимание. Теперь, после рассмотрения заголовка, посмотрим, как тело пакета проходит через код.

Описание изображения

[Рисунок 3] Значение тела пакета

 Разбор содержимого тела пакета
    +--------------------------------------------------------------------------------------+
  | not-null | not-null | classname-size | classname | not-null | message-size | message |
  |----------|----------|----------------|-----------|----------|--------------|---------|
  |    01    |    01    |      0043      |   .....   |    01    |     0012     |  .....  |
  +--------------------------------------------------------------------------------------+

  not-null (01) | / Первая функция на [Рисунке 3] пропускает not-null
  not-null (01) | classname-size (0043) | classname / Вторая функция на [Рисунке 3] пропускает not-null, третья функция проверяет размер
  not-null (01) | message-size (0012) | message / Вторая функция на [Рисунке 3] пропускает not-null, третья функция проверяет размер

[Рисунок 3] показывает, как значения, установленные в теле пакета, влияют на процесс. В конечном итоге, через [Рисунок 4] сериализованные данные загружают класс и инстанцируют его.

Описание изображения

[Рисунок 4] Выполнение RCE через createThrowable

Описание изображения

[Рисунок 5] Пример выполнения RCE (калькулятор)

Описание изображения

[Рисунок 6] Git Diff (5.17.2 -> 5.17.6)

Описание изображения

[Рисунок 7] Функция validate

Скачать инструмент