По­лучив дос­туп к сис­теме, зло­умыш­ленник пер­вым делом пыта­ется вывес­ти из строя средс­тва ауди­та, что­бы как мож­но доль­ше оста­вать­ся незаме­чен­ным. В этой статье я покажу, как ата­кующий может осле­пить средс­тва монито­рин­га Windows путем манипу­ляций с под­систе­мой Event Tracing for Windows (ETW).

warning

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

Приз­наюсь чес­тно, в прош­лом матери­але, ког­да я ска­зал, что у ата­кующе­го получи­лось осле­пить 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), а так­же поля филь­тра­ции событий (MatchAnyKeyword и MatchAllKeyword).

Па­рамет­ры про­вай­дера, опи­сан­ные в струк­туре _TRACE_ENABLE_INFO, мож­но нас­тро­ить одновре­мен­но для всех сес­сий. Для это­го в струк­туре _ETW_GUID_ENTRY есть отдель­ное поле ProviderEnableInfo.

Продолжение доступно только участникам

Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».

Присоединяйся к сообществу «Xakep.ru»!

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться