Содержание статьи
- Временные и постоянные WMI-подписки
- Механика срабатывания временной подписки
- Код для создания подписки
- Постоянная подписка
- Детект по логам Sysmon и PowerShell
- Что мы ищем в Sysmon
- PowerShell Script Block Logging (Event ID 4104)
- Анализ артефактов
- Файл OBJECTS.DATA
- PyWMIPersistenceFinder
- Анализ памяти
- Защита от WMI-закрепа
- ASR-правило Microsoft Defender
- Ограничение прав на WMI (wmimgmt.msc)
- Ограничение PowerShell
- Отключение WMIC
- Инструкция для SOC-аналитиков
- Сигналы и источники телеметрии для расследования
- Пример запроса для Splunk
- План реагирования
- Связь с MITRE ATT&CK
- Выводы
Техника MITRE ATT&CK T1546.003 позволяет злоумышленнику создать скрытую «закладку» в системе. Такая подписка может не требовать отдельного исполняемого или сценарного файла, однако ее объекты сохраняются в репозитории WMI. Постоянная WMI-подписка может переживать завершение пользовательской сессии и перезагрузку системы, а в зависимости от потребителя и контекста выполнения — запускать действия с повышенными привилегиями. Создание постоянных объектов в root\ обычно требует административных прав.
В этой статье мы:
- Создадим WMI-подписку своими руками.
- Проанализируем ее на трех уровнях: логи, артефакты на диске и память.
- Разберем, как детектировать такие атаки в SOC.
- Настроим защиту от WMI-персист.
warning
Статья имеет ознакомительный характер и предназначена для специалистов по безопасности, проводящих тестирование в рамках контракта. Автор и редакция не несут ответственности за любой вред, причиненный с применением изложенной информации. Распространение вредоносных программ, нарушение работы систем и нарушение тайны переписки преследуются по закону.
Временные и постоянные WMI-подписки
В Windows существуют два похожих, но принципиально разных механизма подписки на события WMI.
Временная подписка существует только внутри процесса, который ее создал. Например, команда Register-WmiEvent регистрирует обработчик в текущем процессе PowerShell. Такая подписка перестает работать после завершения этого процесса или удаления подписчика командой Unregister-Event. Она не создает постоянных объектов в пространстве имен root\, не переживает перезапуск PowerShell или перезагрузку системы и не создает события Sysmon 19, 20 и 21, относящиеся к регистрации постоянной подписки.
Постоянная подписка состоит из трех объектов WMI:
__EventFilter— описывает событие‑триггер;CommandLineEventConsumer— определяет выполняемое действие;__FilterToConsumerBinding— связывает фильтр с потребителем.
Эти объекты сохраняются в WMI Repository, могут переживать перезагрузку системы, и именно они соответствуют механизму закрепления MITRE ATT&CK T1546.003.
В первой части статьи мы используем временную подписку как простой способ продемонстрировать сам принцип: событие WMI вызывает заданное действие. Далее при разборе Sysmon и OBJECTS. рассматриваем уже артефакты постоянной подписки. Поэтому наборы логов и следов у этих двух вариантов различаются.
Механика срабатывания временной подписки
Сначала разберем упрощенный вариант — временную подписку через Register-WmiEvent. Она покажет, как событие WMI может запускать действие, но сама по себе не может быть полноценным механизмом постоянного закрепления: подписка существует, только пока работает создавший ее процесс PowerShell, и не переживает перезагрузку.
Она будет срабатывать при запуске «Блокнота» (notepad.) и открывать картинку с котом из интернета. Это безопасная демонстрация событийного выполнения: в реальной атаке вместо открытия картинки могло бы выполняться другое действие. В нашем случае обращение к удаленному URL имитирует сетевое действие.
Для демонстрации используется обычная ссылка на изображение. Обфускация здесь не нужна, поскольку задача эксперимента — показать механизм срабатывания WMI-события.

На этом этапе мы создали именно временную, привязанную к PowerShell-сессии подписку. Ее следы следует искать прежде всего в PowerShell-телеметрии и памяти процесса, а не среди постоянных объектов репозитория WMI.
Код для создания подписки
Создаем временную подписку через PowerShell:
Register-WmiEvent -Query "SELECT * FROM __InstanceCreationEvent WITHIN 5 WHERE TargetInstance ISA 'Win32_Process' AND TargetInstance.Name = 'notepad.exe'" -Action { Start-Process "https://cdn-kz.kursiv.media/wp-content/uploads/2025/05/img_8458.jpeg" } -SourceIdentifier "MaliciousEvent"Запускаем «Блокнот»:
Start-Process notepad.exe
В течение пяти секунд после запуска «Блокнота» открывается картинка. Это доказывает, что подписка сработала.

Постоянная подписка
В рамках второго эксперимента я создал постоянную подписку в пространстве имен root\. После регистрации я проверил наличие фильтра MaliciousFilter, потребителя MaliciousConsumer и связывающего объекта __FilterToConsumerBinding. Далее мы посмотрим телеметрию и артефакты этих постоянных объектов. PowerShell Event ID 4104 относится к временному эксперименту, а Sysmon 19–21 и анализ OBJECTS. — к постоянному.
Детект по логам Sysmon и PowerShell
Что мы ищем в Sysmon
Sysmon — это ключевой инструмент для мониторинга WMI-активности. Он логирует три важных события:
- Event ID 19 —
WmiEventFilter: создание WMI-фильтра, то есть триггера; - Event ID 20 —
WmiEventConsumer: создание WMI-потребителя, то есть выполняемого действия; - Event ID 21 —
WmiEventConsumerToFilter: связывание фильтра с потребителем.
При регистрации постоянной подписки Sysmon может сформировать следующую телеметрию.

Event ID 19 - WmiEventFilter:
Name: "MaliciousFilter"
Query: `SELECT * FROM __InstanceCreationEvent WITHIN 5 WHERE TargetInstance ISA 'Win32_Process' AND TargetInstance.Name = 'notepad.exe'`
Event ID 20 - WmiEventConsumer:
Name: "MaliciousConsumer"
Destination: `powershell.exe -EncodedCommand UwB0AGEAcgB0...`
Event ID 21 - WmiEventConsumerToFilter:
Filter: "MaliciousFilter"
Consumer: "MaliciousConsumer"
В моем эксперименте событие Event ID 21 не зафиксировалось. Возможно, это связано с конфигурацией Sysmon или неполным сбором событий. Событие 21 предназначено для отражения регистрации связи между фильтром и потребителем. Временные подписки Register-WmiEvent такие события не создают.
PowerShell Script Block Logging (Event ID 4104)
Один из наиболее прямых способов обнаружить создание временной подписки через PowerShell — использовать Script Block Logging и анализировать событие 4104. Пока создавшая подписку PowerShell-сессия продолжает работать, подписчика также можно проверить командой Get-EventSubscriber.
New-Item -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging" -Force
Set-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging" -Name "EnableScriptBlockLogging" -Value 1
Продолжение доступно только участникам
Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».
Присоединяйся к сообществу «Xakep.ru»!
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
