Ослепить Sysmon полностью. Манипулируем объектами ETW, чтобы обойти мониторинг
Получив доступ к системе, злоумышленник первым делом пытается вывести из строя средства аудита, чтобы как можно дольше оставаться незамеченным. В этой статье я покажу, как атакующий может ослепить средства мониторинга Windows путем манипуляций с подсистемой Event Tracing for Windows (ETW).
Признаюсь честно, в прошлом материале, когда я сказал, что у атакующего получилось ослепить Sysmon путем манипуляций с дескриптором безопасности устройства \Device\SysmonDrv, я немножечко слукавил. На самом деле после проделанных манипуляций Sysmon перестанет формировать лишь часть событий, но не все. Перестают генерироваться события, полученные от драйвера SysmonDrv (это, кстати говоря, основная часть: события запуска и завершения процессов, загрузка DLL в адресное пространство процесса, загрузка драйвера, манипуляций с ключами реестра и другие). Но есть еще один поставщик информации, на основе которого Sysmon формирует свои события, — это ETW. Сегодня мы посмотрим на этот механизм со стороны атакующего и попытаемся поманипулировать его работой, чтобы «до конца ослепить Sysmon».
EVENT TRACING FOR WINDOWS
Event Tracing for Windows (ETW) — механизм операционной системы Windows, предназначенный для регистрации событий, происходящих в системе.
В ETW есть несколько основных понятий: провайдеры, сессии, контроллеры и потребители.
- Провайдеры (providers, поставщики событий) — это приложения (например, DLL), в которых реализованы функции регистрации событий. Провайдер должен быть обязательно зарегистрирован в подсистеме ETW и иметь GUID. По сути, именно провайдер отслеживает состояния приложений (или системы) и отправляет события в сессию.
- Сессии (sessions, сеанс трассировки, логгер) — сущности, которые собирают события от провайдеров и передают их потребителям. Одна сессия может потреблять события от одного или нескольких провайдеров. Сессии, как и провайдеры, тоже имеют свой идентификатор (GUID).
- Контроллеры (controllers) — это приложения (например, logman), которые управляют сессиями. Могут создавать или удалять сессии, а также изменять их параметры.
- Потребители событий (consumers) — приложения, которые могут получать и как‑то обрабатывать события от одной или нескольких сессий, а также из файлов.
Можно сказать, что ETW основан на провайдерах и потребителях. Провайдеры формируют и передают события о состояниях, происходящих внутри процессов или ядра, а потребители используют эти события для собственных целей (например, для анализа производительности). Причем между провайдером и потребителем присутствует промежуточная сущность — сеанс трассировки (сессия).
Дело в том, что один провайдер может генерировать множество предопределенных типов событий, часть из которых нужна одним потребителям, а другая часть — другим. Именно на уровне сессии происходит фильтрация событий. Кроме того, одной группе потребителей могут потребоваться события не от одного, а сразу от группы провайдеров, поэтому сеанс трассировки может собирать события сразу от нескольких провайдеров и отдавать их нескольким потребителям.
Давай посмотрим, как это выглядит в ядре ОС. За общее состояние подсистемы ETW отвечает структура _ETW_SILODRIVERSTATE, адрес которой можно получить из глобальных переменных ядра.
В этой структуре есть два интересных нам поля: EtwpLoggerContext и EtwpGuidHashTable.
Остановимся на них подробнее.
Сессии ETW
Поле EtwpLoggerContext — указатель на массив структур типа _WMI_LOGGER_CONTEXT, каждая из которых описывает сессию сбора событий. Адреса для этих структур можно получить способом, изображенным ниже.
Обрати внимание, что первые адреса равны 0x00000000 00000001. Скорее всего, это связано с тем, что два сеанса трассировки предопределены системой и не могут быть изменены, поэтому они имеют такие значения.
Давай посмотрим на определение структуры _WMI_LOGGER_CONTEXT.
На скрине выведены только наиболее интересные нам детали:
- Поле
LoggerId— идентификатор сеанса трассировки. - Параметр
LoggerNameсодержит имя сессии в формате_UNICODE_STRING. InstanceGuid— идентификатор сессии трассировки в формате GUID.- Параметр
SecurityDescriptor— указатель на дескриптор безопасности сессии. - Поле
Consumersпредставляет собой список структур _ETW_REALTIME_CONSUMER, каждая из которых содержит указатель на структуру_EPROCESS. Сама структура_ETW_REALTIME_CONSUMERописывает отдельный объект — потребитель событий.
Поле ProcessObject — это указатель на структуру _EPROCESS процесса‑потребителя.
Для примера давай посмотрим на сессию 0xFFFFBA05E862D040.
Тут мы видим, что у сессии EventLog-Microsoft-Windows-Sysmon-Operational есть только один потребитель и это процесс с идентификатором 1528. Интересно, что же это за процесс?
Да, это служба журнала событий Windows, которая берет события Sysmon-провайдера и записывает их в файл . evtx. Но об этом чуть позже. А пока давай вернемся к структурам ядра.
ETW-провайдеры
Наверное, было бы логично, если бы в _WMI_LOGGER_CONTEXT был указатель на массив провайдеров, которые пишут события в сессию. Но нет, все устроено немного иначе.
Каждый зарегистрированный в системе провайдер описывается структурой _ETW_GUID_ENTRY.
Причем поставщик событий может предоставлять события не более чем в восемь сеансов трассировки. Эти сведения хранятся в поле EnableInfo, которое представляет собой массив структур типа _TRACE_ENABLE_INFO. Эта структура содержит информацию о «состоянии провайдера внутри сессии» (включен/выключен — поле IsEnable), о «принадлежности» к конкретной сессии (поле LoggerId), а также поля фильтрации событий (MatchAnyKayword и MatchAllKayword).
Параметры провайдера, описанные в структуре _TRACE_ENABLE_INFO, можно настроить одновременно для всех сессий. Для этого в структуре _ETW_GUID_ENTRY есть отдельное поле ProviderEnableInfo.
Как ты можешь заметить, у каждого провайдера есть свой дескриптор безопасности — это поле SecurityDescriptor в структуре _ETW_GUID_ENTRY.
Обрати внимание, что первый элемент структуры — GuidList. Это двусвязный список, в виде которого хранятся все провайдеры. Чтобы зарегистрировать в системе новый провайдер, ядру нужно пройтись по всем элементам этого списка и в конец добавить ссылку на новую структуру. А чтобы выполнить какую‑либо операцию над зарегистрированным провайдером (добавить провайдер в сессию, включить/выключить, изменить дескриптор безопасности) ядру придется пройти по каждому элементу, пока он не найдет нужного ему поставщика. Такой подход негативно сказывается на производительности.
Давай вернемся к основной структуре, описывающей состояние ETW (структура _ETW_SILODRIVERSTATE), и обратим внимание на поле EtwpGuidHashTable, оно имеет тип _ETW_HASH_BUCKET. Это поле представляет собой массив из 64 типов (64 элементов) списков провайдеров.
Дело в том, что с эволюцией Windows существенно увеличилось количество поставщиков событий, и с точки зрения производительности было бы не очень разумно хранить это множество зарегистрированных в системе провайдеров в виде одного списка. Поэтому разработчики решили разделить все провайдеры на группы. Признаком принадлежности провайдера к определенной группе служит взятый от GUID хеш, который вычисляется вот по такой формуле:
Guid->Data1 XOR (Guid->Data2 XOR Guid->Data4[0] XOR Guid->Data4[4])) & 0x3F
Значение 0x3F ограничивает размер хеша шестью битами (64 уникальных значения). Отсюда и берется размер массива EtwpGuidHashTable равный 64 элементам.
Помимо того что провайдеры делятся на группы в зависимости от хеша, они еще бывают нескольких типов. Типы провайдеров определены перечислением _ETW_GUID_TYPE. Так, ListHead[0] содержит список провайдеров типа EtwTraceGuidType, а ListHead[1] — список типа EtwNotificationGuidType. Этот факт усложняет представление списков провайдеров в ядре Windows.
Итак, в системе существует 64 группы списков провайдеров, определенных массивом EtwpGuidHashTable. Каждая группа имеет три различных списка, в зависимости от типа. Сначала это не так просто осознать, но не волнуйся, со временем все обязательно уложится в голове.
Предлагаю поупражняться и найти хеш для провайдера {5770385F-C22A-43E0-BF4C-06F5698FFBD9}. Забегая вперед, скажу, что это провайдер, зарегистрированный процессом Sysmon64.exe — Microsoft-Windows-Sysmon.
(0x5770385F XOR 0xC22A XOR 0xBF XOR 0x69) & 0x3F = 0x23
0x23 — 35 в десятичной системе счисления. Это означает что наш провайдер хранится в 35-м наборе списков (в 35-м элементе массива EtwpGuidHashTable). Давай проверим это:
- Получим 35-й элемент массива
EtwpGuidHashTable:dx -r0 @$GuidTable = ((nt!_ESERVERSILO_GLOBALS*)&nt!PspHostSiloGlobals)->EtwSiloState->EtwpGuidHashTable[35] - Из него возьмем нулевой элемент списка ListHead и выведем содержимое этого списка:
dx -g Debugger.Utility.Collections.FromListEntry(@$GuidTable.ListHead[0], "nt!_ETW_GUID_ENTRY", "GuidList").Select(entry => new {GUID = entry.Guid, SecurityDescriptor = entry.SecurityDescriptor}) - Убеждаемся, что в 35-м наборе списков присутствует GUID Sysmon-провайдера.
NT Kernel Logger Session
Помимо того что сеансы трассировки могут создаваться отдельными приложениями, в системе существует специальный тип сессии — NT Kernel Logger, который предназначен для наблюдения за предопределенными классами событий ядра ОС (события подсистемы ввода‑вывода, менеджера управления памятью, менеджера конфигурации и стека TCP/IP и других). Для нужд этой сессии в системе существует и специальный провайдер SystemTraceProvider (а начиная с Windows 10 — несколько провайдеров), который отвечает за формирование этих самых событий.
Чтобы включить в сессию системный провайдер, в поле LogFileMode структуры EVENT_TRACE_PROPERTIES нужно поместить значение EVENT_TRACE_SYSTEM_LOGGER_MODE (0x02000000). В соответствии с руководством Microsoft, чтобы определить перечень событий, за которыми мы хотим наблюдать, нам нужно указать «список» флагов в поле EnableFlags структуры EVENT_TRACE_PROPERTIES.
SYSMON && ETW
В приведенном выше описании мы немного освежили знания, которые нам помогут при исследовании процессов работы инструмента Sysmon. Пора приступать к самому исследованию.
Итак, чтобы получить хоть какие‑то доказательства того, что Sysmon и ETW имеют отношение друг к другу, посмотрим на список хендлов процесса Sysmon64.exe.
О том, как работают команды search name <ProcessPattern> и show handles <PID> <Type>, я рассказывал в прошлом материале.
Как видим, в таблице хендлов присутствуют описатели для двух объектов ядра типа EtwConsumer. Этот объект представляет собой подключенный ETW-потребитель, способный получать события от сеансов трассировки.
Вывод выше означает, что процесс Sysmon64.exe потребляет события от двух сессий. Проверим это. Посмотрим на список всех сеансов трассировки, зарегистрированных в системе, и найдем наиболее подходящие по смыслу для Sysmon.
Команда search session <SessionPattern> вызывает функцию QueryAllTracesW:
ULONG WMIAPI QueryAllTracesW( [out] PEVENT_TRACE_PROPERTIES *PropertyArray, [in] ULONG PropertyArrayCount, [out] PULONG LoggerCount);
Последние два параметра (PropertyArrayCount и LoggerCount) указывают на имеющееся и требуемое количество элементов массива PropertyArray.
На первом параметре (PropertyArray) давай остановимся немного подробнее. Это указатель на массив указателей на структуры типа EVENT_TRACE_PROPERTIES, каждая из которых описывает параметры сессии. Внимательный читатель задастся вопросом, почему же нельзя было передавать в функцию просто указатель на массив структур EVENT_TRACE_PROPERTIES. Это, скорее всего, связано с тем, что структура, описывающая сессию, не имеет постоянного размера.
Дело в том, что в самой структуре отсутствуют поля «имя лог‑файла» и «имя сессии», размер каждого из которых не должен превышать 1024 символа. Эти поля записываются в память за структурой, а в самой структуре указываются просто смещения (поля LogFileNameOffset и LoggerNameOffset) относительно ее начала. Наверное, с целью экономии памяти разработчики решили сделать размер этой структуры переменной длины.
Чтобы получить список сессий, нужно сделать как минимум два вызова функции QueryAllTracesW. Первый вернет количество сессий. На основе этой информации нужно будет:
- Выделить память для массива указателей с количеством элементов, равным количеству сессий.
- Выделить буферную память, в которую будет сохранена информация обо всех сессиях.
- Разделить буферную память на куски, в каждый из которых будет помещена информация об отдельной сессии, а адресами каждого из кусков инициализировать массив указателей, объявленный на первом шаге.
- Для каждого буферного куска (для каждой структуры
EVENT_TRACE_PROPERTIES) установить значения полейBufferSize,LoggerNameOffsetиLogFileNameOffset.
Снова вызвать функцию QueryAllTracesW и получить список сессий (при условии, что размера выделенного буфера хватит для сохранения этой информации).
Итак, проделанные манипуляции позволили нам получить три сеанса, по названию схожие с Sysmon. Как мы выяснили ранее, сессия EventLog-Microsoft-Windows-Sysmon-Operational создана для того, чтобы служба журнала событий Windows могла потреблять события от Sysmon и писать их в соответствующий журнальный файл. Эту сессию давай оставим напоследок, а сейчас остановимся на сеансах SysmonDnsEtwSession и SYSMON TRACE.
Но для начала убедимся, что их потребитель — это именно процесс Sysmon64.exe. Мне неизвестен способ, как это можно сделать из режима пользователя, поэтому обратимся к нашему любимому отладчику.
В WinDbg есть расширение !wmitrace, которое позволяет удобно работать со структурами ETW. С помощью команды !wmitrace.strdump получим список сеансов ETW.
Командой !wmitrace.logger <LoggerId> получим подробную информацию о сессии SYSMON TRACE.
Поле Consumer содержит состоящий из одного элемента список адресов структур _ETW_REALTIME_CONSUMER, каждая из которых содержит указатель на _EPROCESS.
Таким образом мы убеждаемся, что потребителем сессии SYSMON TRACE является процесс Sysmon64.exe.
Для сеанса SysmonDnsEtwSession потребитель тоже Sysmon64.exe. Проверить это ты можешь самостоятельно, проделав перечень шагов, аналогичный описанному выше.
МАНИПУЛИРУЕМ С ETW И ЛОМАЕМ SYSMON
Мы убедились, что Sysmon для своего функционирования создает несколько сеансов трассировки. Давай теперь посмотрим, какие именно манипуляции могут совершать атакующие при попытке ослепить Sysmon.
Выключаем провайдеры сессии SysmonDnsEtwSession
Раз уж сессии собирают события от провайдеров, а у каждого провайдера в структуре _ETW_GUID_ENTRY есть массив его состояний, первое, что приходит в голову (с позиции атакующего), — это отключить провайдера от сессии. Так и поступим.
Давай посмотрим на список провайдеров, от которых сессия SysmonDnsEtwSession получает события.
Команда show session <SessionHandle> вызывает функцию ControlTraceW с параметром EVENT_TRACE_CONTROL_QUERY.
ULONG WMIAPI ControlTraceW( [in] TRACEHANDLE TraceHandle, [in] LPCWSTR InstanceName, [in, out] PEVENT_TRACE_PROPERTIES Properties, [in] ULONG ControlCode);
TraceHandleпринимает идентификатор (дескриптор сессии).- Второй параметр (
InstanceName) — имя сессии. Один из первых двух параметров может быть равен NULL. - Следующий параметр возвращает структуру описания сессии
EVENT_TRACE_PROPERTIES. - В параметре
ControlCodeуказывается код операции. В нашем случае он равенEVENT_TRACE_CONTROL_QUERY.
Вызов этой функции позволяет получить информацию об имени сессии, ее GUID, а также параметры LogFileMode и EnableFlags, но не предоставляет информации о провайдерах.
Далее нам нужно получить информацию о провайдерах, которые предоставляют события в сессию. Я не знаю способа, как запросто получить список провайдеров для конкретной сессии. Судя по тому, как это делает оснастка perfmon.exe, логика тут следующая: нужно получить полный список провайдеров, зарегистрированных в системе, пройтись по каждому и найти признаки его принадлежности к сессии ETW. В целом логика повторяет структуру представления провайдеров в ядре Windows.
Получить список провайдеров можно с помощью вызова TdhEnumerateProviders:
TDHSTATUS TdhEnumerateProviders( [out] PPROVIDER_ENUMERATION_INFO pBuffer, [in, out] ULONG *pBufferSize);
Эта функция возвращает структуру данных типа PROVIDER_ENUMERATION_INFO, которая содержит информацию о количестве зарегистрированных в системе провайдеров (параметр NumberOfProviders), и массив типа TRACE_PROVIDER_INFO, который описывает каждый провайдер в отдельности с указанием имени (вычисляется с помощью ProviderNameOffset) и GUID (поле ProviderGuid). Таким образом, вызов функции TdhEnumerateProviders вернет нам информацию об именах и GUID провайдеров, но не даст информации о принадлежности провайдеров к конкретной сессии.
Чтобы получить недостающую информацию, мы для каждого провайдера должны вызвать функцию EnumerateTraceGuidsEx:
ULONG WMIAPI EnumerateTraceGuidsEx( [in] TRACE_QUERY_INFO_CLASS TraceQueryInfoClass, [in] PVOID InBuffer, [in] ULONG InBufferSize, [out] PVOID OutBuffer, [in] ULONG OutBufferSize, [out] PULONG ReturnLength);
TraceQueryInfoClassпринимает тип запроса функции. В нашем случае он равен TraceGuidQueryInfo, это означает, что нам нужно получить информацию о провайдере.- GUID провайдера передается в виде буфера
InBuffer. - Параметр
InBufferSizeопределяет размер буфера. - Четвертым параметром (
OutBuffer) передается указатель на возвращаемый буфер. - Пятый (
OutBufferSize) и шестой (ReturnLength) параметры указывают размер имеющейся и требуемой памяти, в которую помещается результат работы функции. - Параметр
OutBufferпредставляет собой структуру данных, заголовком которой является TRACE_GUID_INFO.
Вслед за заголовком следует одна или несколько структур типа TRACE_PROVIDER_INSTANCE_INFO, каждая из которых описывает принадлежность сессии к провайдеру и параметры фильтрации событий. Наглядно это можно представить в следующем виде.
Видим, что в сессию включен один провайдер — Microsoft-Windows-DNS-Client. Отключим его от сессии SysmonDnsEtwSession. Это можно сделать с помощью функции EnableTraceEx2 с параметром EVENT_CONTROL_CODE_DISABLE_PROVIDER:
ULONG WMIAPI EnableTraceEx2( [in] TRACEHANDLE TraceHandle, [in] LPCGUID ProviderId, [in] ULONG ControlCode, [in] UCHAR Level, [in] ULONGLONG MatchAnyKeyword, [in] ULONGLONG MatchAllKeyword, [in] ULONG Timeout, [in, optional] PENABLE_TRACE_PARAMETERS EnableParameters);
- Первый параметр (
TraceHandle) — дескриптор сессии трассировки. В нашем случае этот параметр равен 0x23. - В следующем параметре (
ProviderId) передается GUID провайдера. Для провайдераMicrosoft-Windows-DNS-Clientон равен{1C95126E-7EEA-49A9-A3FE-A378B03DDB4D}. - Параметр
ControlCodeпринимает тип операции (EVENT_CONTROL_CODE_DISABLE_PROVIDER). - Четвертый параметр (
Level) — уровень логирования. Установим его в TRACE_LEVEL_INFORMATION. - Пятый и шестой параметры (
MatchAnyKeywordиMatchAllKeyword) принимают параметры фильтрации событий. Установим их равными0xFFFFFFFFFFFFFFFFи0x00соответственно. - Последние параметры (
TimeoutиEnableParameters) установим равными нулю.
Команда disable <ProviderGuid> <SessionHandle> работает на основе функции EnableTraceEx2.
Открываем оснастку «Просмотр событий», пытаемся отрезолвить насколько DNS-имен и убеждаемся в отсутствии событий «EventID 22 (DNS query)» в журнале Microsoft-Windows-Sysmon\Operational.
Итак, нашему атакующему удалось скрыть события разрешения имен от Sysmon, но остался еще один тип событий — «EventID 3 (Network connection detection)».
Изменяем флаги сессии SYSMON TRACE
Теперь давай посмотрим, какие провайдеры отправляют события в сеанс SYSMON TRACE.
Как видим, список провайдеров пуст, однако тут стоит обратить внимание на значение параметра LogFileMode и вспомнить про специальный тип сессий — NT Kernel Logger. Видим, что в списке параметров присутствует EVENT_TRACE_SYSTEM_LOGGER_MODE (0x02000000). Это значит, что провайдером для нее является SystemTraceProvider, а перечень типов событий определяется параметром EnableFlags (0x10000).
Представим, что нашему атакующему пришло в голову отключить все типы событий системного провайдера. Это можно сделать с помощью вызова функции ControlTraceW с параметром EVENT_TRACE_CONTROL_UPDATE. А в саму функцию передать структуру EVENT_TRACE_PROPERTIES с параметром EnableFlags, равным 0x00. Команда set enableflags <SessionHandle> <Flags> выполняет эти операции.
Повторно открываем оснастку «Просмотр событий», пытаемся установить соединение с каким‑нибудь сервером и убеждаемся в отсутствии не только событий «EventID 22 (DNS query)», но и событий «EventID 3 (Network connection detection)» в журнале Microsoft-Windows-Sysmon\Operational.
Манипулируем дескрипторами безопасности сессии EventLog-Microsoft-Windows-Sysmon-Operational
В итоге всю информацию, получаемую от модуля ядра SysmonDrv и от подсистемы ETW, служба режима пользователя Sysmon агрегирует внутри себя и пишет в журнал событий Microsoft-Windows-Sysmon\Operational.
В этом механизме также задействованы сессии ETW и провайдеры. Ранее мы с тобой видели, что в системе присутствуют три сессии, созвучные с Sysmon, и первая из них — EventLog-Microsoft-Windows-Sysmon-Operational, которую мы договаривались оставить на конец. Так вот, конец настал!
Давай посмотрим на список провайдеров этой сессии.
Видим, что у сессии есть один провайдер — Microsoft-Windows-Sysmon.
Ранее, когда мы смотрели структуры ядра, описывающие объекты сессии и провайдера, видели, что у каждой из них есть поле SecurityDescriptor. Предлагаю попробовать поманипулировать им.
Давай сначала попробуем изменить SecurityDescriptor для провайдера Microsoft-Windows-Sysmon, а потом для сессии EventLog-Microsoft-Windows-Sysmon-Operational и посмотрим, что из этого выйдет.
Перед началом этого эксперимента необходимо вернуть всё на исходную позицию и убедиться, что Sysmon пишет события в свой журнал.
Посмотрим на дескриптор безопасности провайдера. Это можно сделать, используя вызов EventAccessQuery:
ULONG EVNTAPI EventAccessQuery( [in] LPGUID Guid, [in, out] PSECURITY_DESCRIPTOR Buffer, [in, out] PULONG BufferSize);
Дескриптор безопасности имеет следующий вид:
O:BAG:BAD:(A;;0x1800;;;WD)(A;;0x120fff;;;SY)(A;;0x120fff;;;LS)(A;;0x120fff;;;NS)(A;;0x120fff;;;BA)(A;;0xee5;;;LU)(A;;LC;;;MU)(A;;0x1800;;;AC)(A;;0x1800;;;S-1-15-3-1024-3153509613-960666767-3724611135-2725662640-12138253-543910227-1950414635-4190290187)
Первая запись в списке DACL (A;;0x1800;;;WD) означает, что для учетной записи Everyone нужно предоставить следующий доступ:
TRACELOG_ACCESS_KERNEL_LOGGER | TRACELOG_REGISTER_GUIDS
Вторая запись ((A;;0x120fff;;;SY)) предоставляет полный доступ для учетной записи Local System.
Давай явно запретим для Local System доступ к провайдеру — (D;;0x120fff;;;SY), а ACE для учетки Everyone вообще уберем. Это можно сделать с помощью функции EventAccessControl:
ULONG EVNTAPI EventAccessControl( [in] LPGUID Guid, [in] ULONG Operation, [in] PSID Sid, [in] ULONG Rights, [in] BOOLEAN AllowOrDeny);
- Первым параметром (
Guid) передается идентификатор провайдера или сеанса, для которого нужно изменить дескриптор безопасности. - Вторым (
Operation) указывается тип операции. Это может быть добавление записи в списки DACL/SACL или полная замена этих списков. - Третьим параметром (
Sid) передается идентификатор учетной записи, для которой изменяются права доступа. - Следующим параметром (
Rights) передается перечень прав доступа в виде маски. - И последним параметром (
AllowOrDeny) определяется тип операции: разрешить или запретить.
Команда set sddldacl <Guid> <sddldacl> реализует вызов этой функции.
Перезагружаем машину и убеждаемся, что в журнале Sysmon нет событий. Причем последним событием является EventID 255. Эта техника, в отличие от предыдущих, будет персистентной.
Получаем еще один детект для нашего SIEM:
Provider Name='Microsoft-Windows-Sysmon' and EventID='255' and Data Name.Description='Failed to open service configuration with error 94 - Last error: Носитель защищен от записи.'
Вернем все назад и попробуем проделать аналогичные манипуляции для сессии трассировки. Список DACL имеет следующий вид:
D:(A;;0x1800;;;WD)(A;;0x120fff;;;SY)(A;;0x120fff;;;LS)(A;;0x120fff;;;NS)(A;;0x120fff;;;BA)(A;;0xee5;;;LU)(A;;LC;;;MU)(A;;0x1800;;;AC)(A;;0x1800;;;S-1-15-3-1024-3153509613-960666767-3724611135-2725662640-12138253-543910227-1950414635-4190290187)
По аналогии с провайдером ребутим хост, открываем оснастку «Просмотр событий» и видим следующую картину.
И будет счастье нашему атакующему, ну а для нас это полное разочарование... На этот раз Sysmon даже ничего не скажет!
Однако не все так плохо: если у тебя в инфраструктуре настроен WEC, в журнале Microsoft-Windows-Eventlog-ForwardingPlugin/Operational ты можешь обнаружить следующее событие.
ВЫВОДЫ
Нам удалось воспроизвести действия атакующего и ослепить Sysmon, манипулируя с подсистемой ETW. Конечно же, предел у фантазий хакеров отсутствует напрочь: здесь еще огромное поле для творчества, и мы обязательно продолжим его осваивать!