Служба очереди сообщений windows

Microsoft Message Queuing (MSMQ) is a message queue implementation developed by Microsoft and deployed in its Windows Server operating systems since Windows NT 4 and Windows 95. Windows Server 2016 and Windows 10 also includes this component. In addition to its mainstream server platform support, MSMQ has been incorporated into Microsoft Embedded platforms since 1999 and the release of Windows CE 3.0.[1]

MSMQ is a messaging protocol that allows applications running on separate servers/processes to communicate in a failsafe manner. A queue is a temporary storage location from which messages can be sent and received reliably, as and when conditions permit. This enables communication across networks and between computers, running Windows, which may not always be connected. By contrast, sockets and other network protocols assume that direct connections always exist.

MSMQ has been available to developers on Microsoft platforms since 1997,[2] and has commonly been used in enterprise software built with Visual Studio, both in the native pre-.NET incarnation (version 5 and 6), and in Visual Studio .NET. Microsoft also has incorporated MSMQ in its messaging technology framework, Windows Communication Foundation (WCF). Under WCF, MSMQ can be used for providing secure, reliable transport with a unified programming model compatible with other communications standards.

MSMQ is responsible for reliably delivering messages between applications inside and outside the enterprise. MSMQ ensures reliable delivery by placing messages that fail to reach their intended destination in a queue and then resending them once the destination is reachable. It also supports security and priority based messaging. Dead letter queues can be created for looking at messages which timed out or failed for other reasons.

MSMQ supports both durable and non-durable messaging to make a trade off between performance or consistency by writing messages to disk or only in RAM. Non-durable messaging can only be achieved by sending express messages via non-transactional queues.

MSMQ also supports transactions. It permits multiple operations on multiple queues, with all of the operations wrapped in a single transaction, thus ensuring that either all or none of the operations will take effect. Microsoft Distributed Transaction Coordinator (MSDTC) supports transactional access to MSMQ and other resources to achieve transactional exact once processing.

The following ports are used for Microsoft Message Queuing operations:

  • TCP: 1801
  • RPC: 135, 2101*, 2103*, 2105*
  • UDP: 3527, 1801
  • * These port numbers may be incremented by 11 if the initial choice of RPC port is being used when Message Queuing initializes. Port 135 is queried to discover the 2xxx ports.[3]
  • Version 1.0 (May 1997). Supports Windows 95, Windows NT 4.0 SP3, Windows 98 and Windows Me.
  • Version 2.0, included with Windows 2000.
    • New features include:[4] Support for registering public message queues in Active Directory, 128-bit encryption and digital certificate support, full COM support for message properties (achieving functional parity with the Win32 API function calls, full DNS path name support, improved performance in multi-threaded applications.
  • Version 3.0, included with Windows XP (Professional, not Home Edition) and Windows Server 2003.
    • New features include:[5] Internet Messaging (referencing queues via HTTP, SOAP-formatted messages, MSMQ support for Internet Information Services), queue aliases, multicasting of messages, and additional support for programmatic maintenance and administration of queues and MSMQ itself.
  • Version 4.0, part of Windows Vista and Windows Server 2008.
    • New features include:[6] Subqueues,[7] improved support for «poison messages» (messages which continually fail to be processed correctly by the receiver), and support for transactional receives of messages from a remote queue.
  • Version 5.0, part of Windows 7 and Windows Server 2008 R2.
    • New features include:[8] support for Secure Hash Algorithm 2.0 (SHA2) and all advanced hash algorithms that are supported in Windows 2008 R2; by default, weaker hash algorithms are disabled.
  • Version 6.0, part of Windows 8 and Windows Server 2012.
  • Version 6.3, part of Windows 8.1 and Windows Server 2012 R2.

MSMQ is heavily used in various Windows Platform-based contact center applications which uses this service for internal notifications and services. [citation needed]

  • List of Microsoft Windows components
  • IBM MQ, similar techonolgy by IBM
  • Java Message Service, similar technology on the Java platform
  • Amazon Simple Queue Service, commoditized messaging service provided by Amazon.com for a per-use fee. It allows users to rent access to messaging without having to maintain their own server.
  • RabbitMQ, open source message queue broker that implements a pre-standard version of AMQP.[9]
  1. ^ «Microsoft Windows CE 3.0 Message Queuing Service». Microsoft Developer Network. 29 June 2006. Retrieved 2009-11-25.
  2. ^ InformationWeek News Connects The Business Technology Community. Informationweek.com (2014-02-04). Retrieved on 2014-02-22. Archived April 10, 2008, at the Wayback Machine
  3. ^ TCP ports, UDP ports, and RPC ports that are used by Message Queuing. Support.microsoft.com (2011-09-28). Retrieved on 2014-02-22.
  4. ^ «Cloud Administrator». Azure Cloud Administrator. Dayasagar Roy. Archived from the original on 2018-11-24. Retrieved 2006-08-05.
  5. ^ «Cloud Administrator». Azure. Dayasagar Roy. Archived from the original on 2018-11-24. Retrieved 2006-08-05.
  6. ^ «Cloud Administrator». Azure. Dayasagar Roy. Archived from the original on 2018-11-24. Retrieved 2006-08-05.
  7. ^ Sub-queues in MSMQ 4.0
  8. ^ «Cloud Administrator». Azure. Dayasagar Roy. Retrieved 2006-08-05.
  9. ^ «ISO/IEC 19464:2014 — Information technology — Advanced Message Queuing Protocol (AMQP) v1.0 specification». www.iso.org. Retrieved 2017-11-07.
  • MSDN documentation

Службы очереди сообщений

Службы очереди сообщений (Microsoft Message Queuing Services, MSMQ) — сервис, входящий в стандартную поставку Microsoft Windows 2000 Server. С помощью MSMQ приложения, работающие в разное время, могут связываться через разнородные сети и системы, способные временно работать автономно. Приложения посылают сообщения MSMQ и используют очереди MSMQ — это позволяет быть уверенным, что сообщение рано или поздно достигнет адресата. MSMQ обеспечивает гарантированную доставку сообщений, интеллектуальную маршрутизацию, защиту и передачу сообщений, основанную на приоритетах.

При помощи MSMQ конечные пользователи могут связываться через автономные сети и системы, вне зависимости от текущего состояния поддерживающих связь приложений и систем. При помощи MSMQ разработчики могут сосредоточиться на программировании бизнес-логики, а не решать проблемы работы с сетями, поскольку MSMQ обеспечивает гарантированную доставку. Администраторы систем при помощи MSMQ могут эффективно управлять большими, сложными сетями очередей сообщений.

Программные продукты с такими возможностями часто называют программным обеспечением поддержки очередей сообщений, программным обеспечением с промежуточным накоплением или средствами среднего уровня, ориентированными на сообщения (MOM, Message-Oriented Middleware).

Особенности и возможности службы MSMQ: .

Интеграция с Windows 2000 Server. Поддерживается служба Active Directory, в которой хранятся отдельные объекты MSMQ.
Работа в смешанном режиме. MSMQ может функционировать в смешанных сетевых средах, состоящих из серверов и клиентов на базе как Windows NT 4.0, так и Windows 2000.
Совместимость сверху вниз. Служба MSMQ полностью совместима с MSMQ версии 1.0.
Передача сообщений без установления логического соединения. Поскольку MSMQ использует бессеансовую модель на прикладном уровне, отправитель и получатель не обязаны применять один и тот же протокол. MSMQ поддерживает протоколы IP и IPX.
Поддержка приоритетов трафика. Приоритеты сообщений позволяют срочному или важному трафику вытеснять менее важный, что гарантирует адекватное время ответа критическим приложениям за счет менее важных приложений.
Гарантированная доставка. Сообщения помещаются в хранящуюся на диске очередь, что обеспечивает гарантированную доставку сообщений.
Транзакции. Имеется возможность использования транзакций MSMQ, т. е. можно объединить несколько действий MSMQ в транзакцию и обеспечить гарантированную доставку сообщений, а также то, что они будут доставлены не более одного раза или что доставленные сообщения будут успешно извлечены из очереди адресатом.
Динамические очереди. Администраторы могут изменять свойства очередей без воздействия на приложения передачи сообщений.
Маршрутизация. MSMQ поддерживает интеллектуальную маршрутизацию, которая основана на физической топологии сети, группировке сеансов и на обеспечении транспортной связности. Группировка сеансов облегчает эффективное использование медленных линий.
Безопасность. MSMQ поддерживает механизмы безопасности: управление доступом, аудит, шифрование и аутентификацию. Управление доступом реализовано с применением системы безопасности Windows 2000 и цифровых подписей. Аудит реализован при помощи службы регистрации событий Windows 2000. Шифрование и аутентификация (использование цифровых подписей) обеспечиваются при помощи механизмов открытых и закрытых ключей.
Широкая интеграция систем. Приложения MSMQ могут выполняться на целом ряде аппаратных платформ, использующих продукты для обеспечения связи со службой MSMQ, поставляемые фирмой Level 8 Systems, партнером Microsoft, Исходно MSMQ поддерживает Windows NT, Windows 95 и Windows 98. Поддержка остальных систем поставляется фирмой Level 8 Systems.
Среда программирования MSMQ.. Прикладной интерфейс MSMQ позволяет разрабатывать приложения MSMQ на языке С или C++. MSMQ также включает элементы управления СОМ, которые можно применять для создания приложений MSMQ в Microsoft Visual Java (VJ), Visual Basic (VB) или любых других приложений-контейнеров СОМ (например, Microsoft Access или Borland/Inprise Delphi). При помощи Microsoft ASP и Microsoft US можно интегрировать MSMQ-приложение с веб-страницами и формами, использующими элементы управления СОМ. При помощи MAPI Transport Provider и Exchange Connector можно интегрировать приложение MSMQ с формами Exchange и клиентами MAPI. Транспорт MSMQ

RPC можно использовать для создания надежных приложений, использующих вызовы RPC.

Установка MSMQ. Чтобы добавить или удалить службу:

1. В меню Пуск (Start) выберите команду Настройка (Settings) | Панель управления (Control panel) | Установка/удаление программ (Add/Remove Programs).
2. В левой панели диалогового окна Установка/удаление программ выберите вкладку Добавление/удаление компонентов Windows.
3. Откроется окно Мастер компонентов Windows (Windows Components Wizard). В списке Компоненты Windows (Windows Components) выберите опцию Службы очереди сообщений (Message Queuing Services) (рис. 22.18).
4. Нажмите кнопку Далее (Next) и следуйте командам мастера.

Рис 22.18. Установка служб очереди сообщений

Примечание

Сначала нужно установить сервер MSMQ на контроллере домена Windows 2000 (в группе серверов, объединенных территориально), а затем можно устанавливать программное обеспечение MSMQ на других компьютерах. Сервер MSMQ не может быть установлен на компьютерах, работающих под управлением Windows 2000 Professional.

Служба MSMQ в Windows NT 4.0 и Windows 2000. Перечислим общие задачи управления службой MSMQ. Интерфейс пользователя для выполнения этих задач отличается в Windows 2000 от интерфейса в Windows NT 4.0.

В табл. 22.6 перечислены отличия в терминологии и в архитектуре предыдущих версий от текущей версии MSMQ.

Таблица 22.6. Управление службой MSMQ в Windows 2000 и в Windows NT 4.0

Необходимое действие Windows NT 4.0 Windows 2000
Управление доступом, установка аудита или изменение владельца для Message Queuing MSMQ Explorer Оснастка Active Directory- пользователи и компьютеры (Active Directory Users and Computers)
Изменение учетной записи для службы MSMQ Значок Services на панели управления Оснастка Управление компьютером (Computer Management)
Настройка параметров маршрутизации MSMQ Explorer Оснастка Active Directory — пользователи и компьютеры
Создание внешних (foreign) узлов или добавление внешних компьютеров MSMQ Explorer Оснастка Active Directory-пользователи и компьютеры
Добавление, удаление и настройка компьютеров MSMQ; установка квот для компьютеров или изменение свойств MSMQ Explorer Оснастка Active Directory — пользователи и компьютеры
Установка параметров IPX/SPX для компьютеров MSMQ Значок Network на панели управления Значок Сеть и удаленный доступ к сети (Network arid Dialup Connections) на панели управления
Создание, удаление и настройка очередей; установка квот очереди или изменение свойств MSMQ Explorer Оснастка Active Directory — пользователи и компьютеры
Просмотр и удаление сообщений; просмотр свойств сообщений MSMQ Explorer Оснастка Active Directory — пользователи и компьютеры

Управление службой MSMQ. Управление MSMQ на локальном компьютере осуществляется при помощи оснастки Управление компьютером — узел Службы и приложения | Очередь сообщений. Основное управление объектами MSMQ в организации осуществляется с применением оснастки Active Directory — пользователи и компьютеры. Для управления MSMQ в организации:

1. Запустите оснастку Active Directory — пользователи и компьютеры.
2. В дереве консоли разверните узел Active Directory — пользователи и компьютеры.
3. В меню Вид (View) выберите пункт Пользователи, группы и компьютеры как контейнеры (Users, Groups and Computers as Containers), а затем в том же меню выберите пункт Дополнительные функции (Advanced Features).
4. В дереве консоли найдите нужный домен, затем подразделение, наконец нужный компьютер, на котором установлена MSMQ, щелкните правой кнопкой мыши на узле msmq и в контекстном меню выберите пункт Свойства (Properties).

Уровень сложностиСредний

Время на прочтение9 мин

Количество просмотров4K

Введение

В конце апреля 2023 был опубликован PoC для уязвимости CVE-2023-21769 в сервисе очереди сообщений MSMQ. Это одна из трёх уязвимостей, обнаруженных в MSMQ и запатченных в апрельском обновлении ОС Windows (1, 2, 3). Опубликованный PoC реализует уязвимость отказа в обслуживании сервиса MSMQ. Две другие уязвимости – удалённый BSoD и RCE, названная Queue Jumper. По информации от MSRC с помощью этих уязвимостей можно было взять под контроль практически все версии ОС Windows, на которых доступен и активен MSMQ. Серьёзно, не правда ли?

Поскольку протокол MSMQ бинарный, сходу идентифицировать в чём заключается данная уязвимость не получилось, и пришлось прибегнуть к методам обратной разработки.

Поэтому в данной заметке мы на простом примере проведём идентификацию патча и сравнительный анализ бинарного кода, немного познакомимся с проприетарным протоколом MQQB, и проанализируем уязвимость, поехали!

Идентификация патча

MSMQ является одной из технологий Windows для распределённого взаимодействия приложений, по умолчанию доступной на всех современных ОС данного семейства. Более подробно о нём можно узнать на Вики и в документации MSDN, здесь лишь отметим, что MSMQ реализует один из способов удалённого взаимодействия между приложениями с использованием сервера очередей, который получает и хранит отдельные сообщения или целые транзакции, и пересылает их приложению-адресату, когда появляется такая возможность.

Активируем этот сервис в опциях нашей Windows 10 (желательно на виртуальной машине), то в TCPView можно убедиться, что указанный в PoC TCP-порт 1801 прослушивается сервисом mqsvc.exe:

Прослушиваемые порты MSMQ

Прослушиваемые порты MSMQ

Подключимся к нему отладчиком WinDBG и запустим обнаруженный ранее PoC. Возникает исключение Access Violation из-за попытки записи по недоступному адресу:

Стек вызовов при возникновении ошибки

Стек вызовов при возникновении ошибки

По трассировке стека видно, что ошибка возникает в потоке, исполняющем библиотеку MQQM.dll, в конструкторе класса QmPacket, при записи 0x0C в запрещенную область памяти. Возможно, что уязвимость содержится именно в этой процедуре.

Скачаем патч с сайта MSRC или каким-либо другим способом, и найдем в нем библиотеку MQQM.dll, запустим анализ в дизассемблере IDA Pro. Стоит отметить, что Microsoft поставляет отладочные символы для данной библиотеки, поэтому нужно дать IDA Pro возможность скачать их, это очень облегчит анализ.

Сравнительный анализ патча

Воспользуемся Bindiff или Diaphora поиска патча в библиотеке. Diaphora это активно развивающийся проект, и в данном случае был использован именно он, однако архитектурно Diaphora не очень подходит для больших файлов, так как экспортирует данные IDA Pro в БД mysql, а затем сравнивает их с другой экспортированной таким же образом БД, и всё это на 100% Python. BinDiff сравнивает напрямую IDB-файлы и является нативным приложением, поэтому работает значительно быстрее, но для исследуемой библиотеки размером 1.2 МБ это не так критично.

Как правило, при анализе патча нас интересуют процедуры, которые слегка подкорректированы (из эмпирического предположения, что фикс не меняет всю логику работы программы). Сравним две версии программы:

Результаты сравнения MQQM.dll с помощью Diaphora

Результаты сравнения MQQM.dll с помощью Diaphora

Во вкладке Partial matches Diaphora показывает, что подмеченный нами ранее конструктор CQmPacket , в котором происходит краш при использовании PoC, как раз удовлетворяет данному критерию, коэффициент похожести между двумя его версиями — 0.720. Помимо этого небольшим изменениям подверглись ряд методов *::SectionIsValid. Что же изменилось в конструкторе CQmPacket? Отметим, что функция довольно объёмная, изменения в ней размазаны по всему телу:

CFG пропатченной / старой версии CQmPacket()

CFG пропатченной / старой версии CQmPacket()

Если приглядеться к добавленным/изменённым блокам, можно заметить использование новой процедуры GetNextSectionPtrSafe и методов вида *::GetNextSectionSafe вместо методов *::GetNextSection:

Фрагмент пропатченной / старой весрии CQmPacket()

Фрагмент пропатченной / старой весрии CQmPacket()

Сразу сделаем предположение, что ошибка в старой версии связана с недостаточными проверками арифметики указателей при разборе секций пакета. Так как у нас есть PoC – мы и так можем понять, где конкретно происходит ошибка, но если бы у нас не было PoC, то из предыдущего предположения, мы бы пытались попасть в эти запатченные ветки функции.

В PoC указано, что в обновленной версии при попытке эксплуатации уязвимости выводится строка Next section is behind packet end. Именно эта строка выводится в проверках GetNextSectionPtrSafe, то есть ошибка триггерится в ней, вот её декомпилированный и аннотированный код:

Декомпилированный код процедуры GetNextSectionPtrSafe

Декомпилированный код процедуры GetNextSectionPtrSafe

Данная процедура используется для того, чтобы безопасно сместить указатель на величины, указанные во втором и третьем аргументах. При этом осуществляется проверка, что смещения и полученный указатель не переполнились (в процедуре SafeAddPointersEx) и не вышли за пределы конца пакета (именно этот путь триггерится в PoC). Осталось только понять, что это за секции, и как контролировать их в пакете. А значит пришло время немного изучить данный бинарный протокол.

Анализ обработчика протокола

Уязвимый сетевой сервис работает по протоколу MQQB. Документация на него является общедоступной, поэтому разобрать отдельный пакет не так уж сложно.

Пакет MQQB отправляемый клиентом может состоять из множества секций, описанных в документации. Обработка таких сложных и вариативных структур всегда подвержена ошибкам, и недостаточные проверки формата данных в программах, написанных на C/C++ ­- лакомый кусочек для исследователей. По умолчанию пакет начинается с 16-байтовой структуры BaseHeader. Вот её поля на примере пакета из PoC:

Формат и содержимое BaseHeader

Формат и содержимое BaseHeader

Поле версии должно равняться 0x10, а сигнатура – 0x4C494F52 (LIOR), иначе пакет будет отброшен сервисом. В поле size размещается полный размер пакета. После структуры BaseHeader в пакете располагается структура UserHeader. Вот её неполный формат в контексте нашего пакета:

Формат и содержимое UserHeader

Формат и содержимое UserHeader

С подробным описанием структуры можно ознакомиться по ссылке. Первые 32 байта – это 2 поля UUID отправителя и получателя. Далее идут поля времени получения и отправления (0xFFFFFF и 0x4C494F52) и ID сообщения (0x3805). И наконец, наиболее важное для нас поле располагается по смещению 0x28 (0x38 от начала пакета), это битовая структура флагов пользовательского заголовка (UserHeaderFlags), которая равняется 0x201726D0 в PoC. По этим флагам сервис определяет, какие секции содержатся в пакете. Полный формат флагов представлен в той же ссылке, а на следующем рисунке представлены эти флаги для пакета с PoC:

Формат и содержимое UserHeader.flags

Формат и содержимое UserHeader.flags

Как видно из рисунка, многие среди прочих в заголовке установлены биты msg_prop_hdr и soap_hdr, значит данные секции содержатся в пакете. Попробуем понять, как они обрабатываются в программе. Что же происходит, когда программа понимает, что внутри есть эти секции? Поищем доступ к этому флагу в процедуре (1<<28 == 0x10000000), и найдём следующий блок кода:

Обработка секции Soap

Обработка секции Soap

Обнаруживается интересная схема: проверяется текущий указатель смещения в пакете nextSection (строки 234, 236), сохраняется как указатель на секцию, затем из пакета извлекается смещение для следующей секции (строка 239) и опять проверяется на нахождение этой секции в пределах пакета, и новая секция снова сохраняется в структуре СQmPacket. И наконец, перед выходом из блока, пересчитывается nextSection, снова используя смещение из данных пакета (245), и после этого nextSection не проверяется. Также заметим, что выражение 2*size + 0xB скорее всего означает, что в секции должны содержаться size двухбайтовых объектов (вероятно, символов Unicode-строки), и заголовок секции длиной 0xB.

Проверим наши догадки, найдём информацию об этой секции в документации. Действительно, размеры представлены в виде размеров Unicode строк, только это не две Soap-секции, а заголовок Soap-секции и её тело. Вот что пишет Microsoft по поводу поля смещения в header и body:

A 32-bit unsigned integer that specifies the length of the Header/Body field. This field MUST be set to the number of elements in the Unicode Header/Body field, including the terminating null character. This field has a valid range between 0x00000000 and the size limit imposed by the value of BaseHeader.PacketSize.

И как мы уже увидели в коде, если для Header результирующий указатель проверяется, то для Body это этого не происходит. Возможно, оно проверяется где-то далее по коду, ведь мы уже видели в начале блока проверку nextSection.

А вот и нет! Если секция Soap была последней при обработке, то управление перейдет к последнему блоку кода, который инициализирует конец пакета какими-то данными:

Последний блок функции

Последний блок функции

Именно на этой строчке кода происходит падение в PoC. Тут-то и сходятся звёзды — недоверенные данные гибкого формата на месте дополняются во время обработки, и всё это реализовано на небезопасной арифметике указателей в сервисе, имеющем доступ к драйверу ядра.

Таким образом мы пришли к следующему упрощенному представлению CQmPacket::CQmPacket:

Упрощенная блок-схема процедуры CQmPacket

Упрощенная блок-схема процедуры CQmPacket

Процедура состоит из последовательности условных переходов на блоки обработки каждой секции пакета. И действительно, если после Soap-секции будет обработка какой-либо другой секции, то указатель nextSection будет проверен и программа сообщит об ошибке в обработке пакета. А если нет, то управление перейдёт к последнему блоку (отмечен красным на диаграмме), и программа начнёт работать с непроверенным указателем. Именно таким образом при обработке пакета из PoC nextSection увеличивается далеко за пределы границ пакета и происходит запись по недоступным адресам. Поэтому корректный обработчик пакета должен проверять указатель nextSection после обработки каждой секции, и в процессе этой обработки.

Также отметим, что в случае современных ОС семейства Windows мы имеем дело с 64-битным адресным пространством, а смещения в пакетах – 32-битные, т.е. потенциально возможно сместить указатель записи только на 2*2^(32) + 11 байт вперёд. Это является уязвимостью, однако возможность её использования для чего-либо опасного зависит от многих факторов.

В данном случае, буфер в котором находятся наши данные всегда предшествует высоким Usermode-адресам процесса:

Фрагмент карты адресного пространства процесса MQSVC.exe

Фрагмент карты адресного пространства процесса MQSVC.exe

На рисунке выделена область памяти 0x0000025AB95E0000, в которой находится наш пакет (и другие пакеты, полученные процессом). Эта область является отображением в память временного файла C:\Windows\System32\msmq\storage\p000000d.mq для хранения пакетов очереди. Однако следующие доступные адреса находятся в 0x00007DF4********, и до них никак не добраться из нашего буфера имея лишь 4-байтовое смещение.

Для дальнейшей проработки данного вектора необходимо проверить возможность перехода данных пакета в другие области памяти, то есть осуществить Taint-анализ. За аллокацию объектов пакетов очереди сообщений отвечает драйвер MQAC.SYS, и, вероятно, уязвимость, вызывающая BSoD связана именно с ним.

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

Сопутствующие работы

На момент написания статьи никаких общедоступных исследований об уязвимостях Queue Jumper не было. Но впоследствии появился ряд работ в данном направлении. Приведу их список в хронологическом порядке, чтобы вы могли узнать ещё больше об MSMQ.

17 мая 2023: статья на китайском от исследователя zoemurmure, в которой также приведён анализ данного PoC. Однако в ней делается предположение о возможности перезаписи не только по положительным смещениям от пакета, но и по отрицательным, что не является верным.

1 июня 2023: статья на английском от исследователя Rick Osgood. Он копнул глубже, и сумел осуществить считывание памяти с помощью этих уязвимостей.

24 июля 2023: статья на английском от специалистов Fortinet. В ней описаны некоторые подробности реализации фаззера MSMQ и заявлено о возможности удалённого выполнения кода с помощью изменения заголовка CompoundMessage.

2 августа 2023: статья на английском на ресурсе securityingellignence.com от исследователя Valentina Palmiotti и др. Исследователи рассматривают перспективы эксплуатации на уровнях приложений и драйверов ядра, и приходят к предварительному заключению, что реализовать такое будет проблематично. Также в статье приведена идея удалённого детектирования уязвимых серверов без нарушения работы сервиса MSMQ.

Заключение

В результате анализа данной уязвимости мы ознакомились с базовыми приёмами Patch diffing’а (сравнительного анализа патчей) на уровне двоичного кода. По предыдущим публикациям заметно, что для некоторых читателей тематика обратной разработки представляет повышенный интерес, поэтому приведу небольшой список литературы, полезной в рамках настоящей статьи.

  • IDA Pro Book либо же The Ghidra Book – в зависимости от предпочитаемого вами основного инструмента анализа (PDF-ки легко гуглятся).

  • Денис Юричев – “Reverse Engineering для начинающих”. Ещё одна классическая книга, очень полезная для начинающих и доступная на русском языке.

  • Patch Diffing in the Dark – туториал по патч диффингу от Vulnerability Research Centre.

Как следует из нашей и остальных работ по теме MSMQ, защититься от сетевых атак с использованием уязвимостей из набора Queue Jumper можно запретив трафик по 1801 порту, либо проверяя каждый пакет MSMQ на корректность, то есть проверяя, что указатель nextSection не выйдет за границы пакета при его обработке.

Учитывая гибкую структуру пакета, просто идентифицировать протокол и проверить значение по какому-либо смещению не выйдет – для обнаружения атаки нужен полноценный парсер MQQB-пакетов. Так как документация на формат пакетов протокола и декомпилированный код разбора пакета доступны, разработка такого парсера возможна без особых усилий по реверс-инжинирингу.

Ввиду того, что уязвимый сервис доступен для активации практически во всех актуальных версиях Windows, пользователям, как и всегда, рекомендуется не пропускать обновления безопасности ОС.

Локально проверить наличие сервиса можно с помощью команды sc query "msmq", а также через GUI «Служб», и проверкой прослушиваемого сервисом порта (1801) через TCPView или powershell: Get-Process -Id (Get-NetTCPConnection -LocalPort 1801).OwningProcess. При обнаружении активного сервиса возможна проверка уязвимости с помощью PoC, упомянутого в начале статьи. Если в результате использования PoC происходит падение сервиса, рекомендуется отключить сервис / ограничить к нему доступ и приступать к обновлению ОС.

Понравился материал? Пишите свои замечания и вопросы в комментариях!


Наши ресурсы

  • https://www.usergate.com/ru/security-reports

  • https://t.me/usergatenews/

  • mrc@usergate.com

Microsoft Message Queue is message based protocol technology that provides a way to communicate asynchronously in a distributed environment. Microsoft Message Queue is also known as MSMQ for short, code name “Falcon”.

MSMQ is one of the best proven ways to engineer for developing distributed enterprise business solutions. It provides asynchronous and disconnected pattern of communication between different components of an enterprise application. Different application can work in isolation and can communicate or pass information to other application using this message protocol.

MSMQ is service which manages queues. These queue stores message used for communication or to pass information. MSMQ is part of Microsoft OS from time of Windows NT 4 and Windows 95. It was introduced in late 1997 and become a part of Microsoft Embedded platforms from 1999. MSMQ is also called Message – Oriented Middleware (MOM).

MSMQ Versions

First Version 1.0 of MSMQ was released in May 1997 for Windows 95, Windows NT 4.0, Windows 98 and Windows Me.

Later on at the time when Windows 2000 was released, MSMQ Version 2.0 was introduced with more features like public message queue Active Directory (AD) registration, 128-bit encryption, digital certificate support, full COM support for message properties, DNS path name support and improved performance in multi-threaded applications.

MSMQ Version 3.0 was introduced with Windows XP and Windows Server 2003 where MSMQ came with web enabled message functionality, queue aliases, message multicasting etc.

At the time Windows Vista and Windows Server 2008, MSMQ incorporated more features as Version 4.0 which includes sub-queues, more support for solving “Poison messages” problem and support for transactional receives of message from a remote queue.

The last version of MSMQ is Version 5.0 which was released with Windows 7 and Windows Server 2008 R2. This version of MSMQ provided support for Secure Hash Algorithm 2.0 (SHA2) and other standard hash algorithms.

Default Communication Ports Used by MSMQ

TCP Protocol: 1801.
UDP Protocol: 3527, 1801.
RPC: 135, 2101, 2103, 2105.

Using MSMQ

MSMQ can be used in DOMAIN as well as WORKGROUP environment. MSMQ is available as a windows feature, which can be enabled /disabled in any windows operating system. It is disabled by default in all the operating systems. In desktop environment MSMQ can be enabled by:
Open Start > Control Panel > Programs and Features > Turn Windows features on or off (Left pane) > Microsoft Message Queue (MSMQ) Server.

Install MSMQ on Windows 7

In Windows 7, MSMQ comes with following features:

Microsoft Message Queue (MSMQ) Server Core

  • MSMQ Active Directory Domain Services Integration
  • MSMQ HTTP Support
  • MSMQ Triggers
  • Multicasting Support
  • MSMQ DCOM Proxy

In server environment MSMQ is available as part of add / remove feature. MSMQ can be enabled by opening “Add features wizard” from Server Manager.

In Windows Server 2008 R2, MSMQ comes with these features:
Message Queuing Service

  • Message Queuing Services
  • Directory Service Integration (Machine should be part of Domain)
  • Message Queuing Triggers
  • HTTP Support (IIS and Windows Activation Services – WAS required)
  • Multicasting Support
  • Routing Service
  • Message Queuing DCOM Proxy

Message Queuing Service

This is the core service that is installed when MSMQ feature is enabled. This includes the basic queue functionalities and services related to it. Messages can be received and send to queues. Application using MSMQ can be programmed using System.Messaging; namespace of Microsoft .NET framework.

Message queue directory service integration

It enables Message queuing to function in domain mode. It allows to publish queue properties to Active Directory Domain Service (AD DS), provides authentication for queues, encryption using certificates registered in AD DS and routing of messages with Message Queuing sites.

Message queuing Triggers

MSMQ Triggers is feature associated with a message queue. It can be invoked every time a Message arrives in queues. An action or a process can be executed when these automated triggers are fired in response to message queue event.

HTTP Support

This feature provides support for reference queues using HTTP protocol and HTTP message authentication using an XML digital signature.

Multicasting Support

A traditional MSMQ model allows a single message to send to a single queue. Using Multicasting feature of MSMQ, one-to-many message model can be enabled to send same message to multiple queues.

Routing Service

This service gives the client application the ability to send messages to their destination using least-cost routing. The administrator only needs to define the cost of each route, and MSMQ will automatically calculate the most economical path for the message. Routing service removes the single point of failure problem. MSMQ re-route message to overcome network issues and makes it more efficient in case of unreliable networks like internet.

MSMQ comes with an out-of-box explorer which can be used to monitor and manages queues and functionalities. It can be found under Computer Management > Services and Applications > Message Queuing or Windows + R – type compmgmt.msc.

There are some good professional third party tools to manage MSMQ like:

  • Queue Explorer 3.1
  • MSMQ Queue Explorer
  • MSMQ QXplorer
  • QSet

Developers and programmers can post question and queries to official Microsoft Message Queuing (MSMQ) Forum.

MSMQ development API reference to MSDN namespace – System.Messaging.

Last updated on: 1st September, 2016

Microsoft Message Queue (MSMQ) Server is a messaging protocol developed by Microsoft that allows applications running on separate servers/processes to communicate with each other. MSMQ is part of Microsoft’s messaging infrastructure, providing a way for applications to send and receive messages over the network asynchronously.

MSMQ is often considered a legacy technology, as it has been around since the late 1990s. It was more commonly used in enterprise applications for system integration and in scenarios where offline capabilities were needed.

In this article:

  1. What is MSMQ?
  2. Key Features and Benefits of MSMQ
  3. MSMQ in Action: Usage Scenarios
    • Usage Scenario
    • Practical Coding Example
  4. Comparing MSMQ with Modern Alternatives
  5. The Legacy of MSMQ and Current Trends
  6. Conclusion
  7. References

1. What is MSMQ?

Microsoft Message Queue (MSMQ) is a technology developed by Microsoft for providing asynchronous communication between distributed applications in an enterprise environment. MSMQ allows applications to send and receive messages via queues, which are stored on the file system and managed by the MSMQ service. This message queuing system enables decoupled communication, where applications do not need to interact with each other directly or be online simultaneously to exchange messages.

Microsoft Message Queue Server

Microsoft Message Queue Server

Asynchronous Messaging in MSMQ:

  • Queue-Based Communication: Applications send messages to queues, and recipient applications retrieve these messages from the queues. This setup allows for asynchronous processing, where the sender and receiver do not need to operate or be available at the same time.
  • Handling Network Fluctuations: MSMQ is designed to handle intermittent network connections gracefully. Messages are queued locally and transmitted once the network is available, ensuring message delivery is not dependent on real-time network conditions.

2. Key Features and Benefits of MSMQ

Key Features

MSMQ comes with a host of features that make it a robust solution for enterprise-level message queuing:

Reliable Delivery:

  • MSMQ guarantees the delivery of messages, ensuring that each message is delivered once and only once. This reliability is crucial for applications where data integrity is paramount.

Transactional Messages:

  • MSMQ supports transactional processing of messages. This means that either all messages in a transaction are successfully delivered and processed, or none are, maintaining data consistency across distributed systems.

Security:

  • Security in MSMQ is multifaceted, including encryption for message privacy, authentication to ensure messages come from legitimate sources, and authorization controls to manage who can send and receive messages.

Offline Operations:

  • MSMQ can store messages in queues even when the network is down or the recipient application is offline. This capability ensures that message processing and delivery can continue once the application or network becomes available.

Benefits in Enterprise Environments

  • Decoupling of Applications: MSMQ allows applications to operate independently, enhancing system scalability and robustness.
  • Improved Performance: By enabling asynchronous communication, MSMQ allows applications to offload heavy processing, thereby not blocking other operations.
  • Flexibility and Scalability: MSMQ supports a wide range of scenarios from simple point-to-point messaging to complex routing and prioritization of messages, making it versatile for various enterprise needs.
  • Enhanced Reliability: The assurance of message delivery and transactional integrity makes MSMQ suitable for critical business processes where data accuracy is essential.

In enterprise environments, MSMQ’s ability to provide reliable, secure, and scalable messaging solutions makes it an important tool in the arsenal of system integrators and application developers, particularly in scenarios requiring robust communication mechanisms.

3. MSMQ in Action: Usage Scenarios

MSMQ Usage Scenarios

Microsoft Message Queue (MSMQ) finds its utility in a variety of scenarios, particularly in environments where reliable, asynchronous communication is essential. Its use cases span across different domains, showcasing its flexibility and robustness.

System Integration:

  • In large enterprises, different systems often need to communicate with each other. MSMQ facilitates this by allowing systems to exchange information through messages, regardless of the languages or platforms they are built on. This capability is invaluable in scenarios where legacy systems need to be integrated with newer applications.

Business Process Automation:

  • MSMQ is instrumental in automating business processes. For instance, in a supply chain management system, MSMQ can be used to queue orders, inventory updates, and shipping notifications, ensuring that each component of the supply chain communicates effectively, even under heavy loads or network disruptions.

Financial Transactions:

  • The financial sector leverages MSMQ for transaction processing. The transactional messaging feature ensures that operations such as transfers or payments are completed reliably and in the correct order, a critical requirement in financial systems.

Healthcare Applications:

  • MSMQ is used in healthcare applications for transmitting patient data, lab results, and other critical information between systems. Its ability to function offline ensures that data transfer is not hindered by intermittent network issues, crucial in healthcare settings.

Retail Operations:

  • In retail, MSMQ can manage communication between point-of-sale systems and inventory management systems, helping in keeping stock levels updated in real-time and processing sales transactions efficiently.

3.2 Practical Coding Example

Below is a simple example of how a basic MSMQ application might be coded in C#. This example includes creating a queue, sending a message to the queue, and receiving a message from the queue. Note that this is a basic demonstration intended for educational purposes and may need to be adapted for specific use cases.

First, ensure that the MSMQ feature is installed on your Windows machine and add a reference to System.Messaging in your project.

Creating a Queue:

using System.Messaging;

...

// Check if a specific queue exists. If not, create it.
string queuePath = @".\Private$\MyTestQueue";
if (!MessageQueue.Exists(queuePath))
{
    MessageQueue.Create(queuePath);
}

Sending a Message to the Queue:

...

// Create a new message queue instance
MessageQueue myQueue = new MessageQueue(queuePath);

// Create a new message
Message myMessage = new Message();
myMessage.Body = "Hello MSMQ!";

// Send the message to the queue
myQueue.Send(myMessage);

Receiving a Message from the Queue:

...

// Set the formatter to indicate body type
myQueue.Formatter = new XmlMessageFormatter(new Type[] { typeof(string) });

// Receive and format the message
try
{
    Message myReceivedMessage = myQueue.Receive();
    string messageContent = myReceivedMessage.Body.ToString();
    Console.WriteLine($"Received message: {messageContent}");
}
catch (MessageQueueException e)
{
    Console.WriteLine(e.Message);
}

This code demonstrates a basic use case of MSMQ where a message is created, sent to a queue, and then received from the queue. Remember, for a real-world application, you’ll need to handle exceptions more robustly and consider security and transactional messaging based on your requirements.

4. Comparing MSMQ with Modern Alternatives

While MSMQ has been a stalwart in the message queuing arena, the landscape of messaging technologies has evolved with newer players like RabbitMQ, Apache Kafka, and various cloud-native services.

RabbitMQ:

  • A widely-used open-source message broker, RabbitMQ supports multiple messaging protocols. It is known for its flexibility, ease of deployment, and support for complex routing. Unlike MSMQ, RabbitMQ offers a broader range of features for message management and monitoring.

Apache Kafka:

  • Designed for high throughput and scalability, Apache Kafka is more than just a messaging system; it’s a distributed streaming platform. Kafka excels in scenarios involving large amounts of data, providing capabilities for real-time analytics. It’s a different paradigm compared to MSMQ, focusing more on data streaming rather than traditional queuing.

Cloud-Native Services:

  • Services like AWS SQS, Azure Queue Storage, and Google Cloud Pub/Sub provide scalable, managed queueing services with deep integration into their respective cloud ecosystems. These services offer high availability, automatic scaling, and ease of maintenance, which are challenging to achieve with self-managed solutions like MSMQ.

Comparison:

  • MSMQ’s strengths lie in its simplicity, integration with Windows-based systems, and support for offline operations. However, when it comes to scalability, cross-platform support, and advanced monitoring and management features, modern alternatives often have the upper hand. For instance, RabbitMQ and Kafka provide better support for complex routing and distributed systems, while cloud-native services offer the advantages of cloud scalability and reduced maintenance overhead.

5. The Legacy of MSMQ and Current Trends

MSMQ, a venerable component of Microsoft’s technology portfolio, retains its relevance in certain legacy systems. In today’s landscape, the focus has shifted towards distributed, scalable, and cloud-native messaging solutions, positioning MSMQ more as a specialized tool within a broader, more diverse messaging toolkit.

6. Conclusion

Historically, MSMQ played a pivotal role in enabling asynchronous communication in IT environments, particularly within the Microsoft ecosystem. Its legacy continues in specific use cases where its particular features align with business needs, even as the industry gravitates towards more modern, scalable messaging platforms.

7. References

  1. “Pro MSMQ – Microsoft Message Queue Programming” by Arohi Redkar, Ken Rabold, Richard Costall, Scot Boyd, Carlos Walzer.
  2. “Enterprise Integration Patterns: Designing, Building, and Deploying Messaging Solutions” by Gregor Hohpe and Bobby Woolf
  3. “Installing Message Queuing (MSMQ)“, Microsoft Learn
  4. “Distributed Systems: Concepts and Design” by George Coulouris, Jean Dollimore, Tim Kindberg, and Gordon Blair

Понравилась статья? Поделить с друзьями:
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
  • Java sdk path windows
  • Поиск одинаковых папок на компьютере windows 10
  • Web service client windows
  • Где лежит стандартный просмотрщик изображений windows 10
  • Что лучше выбрать windows 7 или windows 8