SilkETW и SilkService — это гибкие оболочки C# для ETW. Они предназначены для того, чтобы абстрагировать сложности ETW и предоставить людям простой интерфейс для проведения исследований и самоанализа. Хотя оба проекта имеют очевидные оборонительные (и наступательные) применения, их в первую очередь следует рассматривать как исследовательские инструменты.
Для удобства использования выходные данные сериализуются в формат JSON. Данные JSON можно либо записать в файл и проанализировать локально с помощью PowerShell, сохранить в журнале событий Windows, либо отправить в стороннюю инфраструктуру, например Elasticsearch.
Для получения дополнительной информации о будущем SilkETW и SilkService см. раздел «Дорожная карта».
Для получения дополнительной информации о SilkETW и SilkService обратитесь к следующим ресурсам.
SilkETW построен на .Net v4.5 и использует ряд сторонних библиотек, как показано ниже. Дополнительную информацию см. в разделе LICENSE-3RD-PARTY.
ModuleId Version LicenseUrl
-------- ------- ----------
McMaster.Extensions.CommandLineUtils 2.3.2 https://licenses.nuget.org/Apache-2.0
Microsoft.Diagnostics.Tracing.TraceEvent 2.0.36 https://github.com/Microsoft/perfview/blob/master/LICENSE.TXT
Newtonsoft.Json 12.0.1 https://licenses.nuget.org/MIT
System.ValueTuple 4.4.0 https://github.com/dotnet/corefx/blob/master/LICENSE.TXT
YaraSharp 1.3.1 https://github.com/stellarbear/YaraSharp/blob/master/LICENSE
Использование командной строки довольно простое, а ввод пользователя проверяется в прологе выполнения. Более подробную информацию смотрите на изображении ниже.
SilkService был создан потому, что большое количество людей хотели запускать SilkETW в автономном режиме и выполнять сбор ETW для нескольких источников одновременно. Несмотря на очевидную привлекательность этого подхода, следует иметь в виду следующие моменты.
После компиляции или загрузки пакета выпуска вы можете установить службу, введя следующую команду из командной строки с повышенными привилегиями.
sc create SillkService binPath= "C:PathToSilkService.exe" start= demand
SilkService принимает файл конфигурации XML «SilkServiceConfig.xml», который должен быть помещен в тот же каталог, что и двоичный файл службы. Пример файла конфигурации можно увидеть ниже.
< SilkServiceConfig >
< ETWCollector >
< Guid >45c82358-c52d-4892-8237-ba001d396fb4 Guid >
< CollectorType >user CollectorType >
< ProviderName >e13c0d23-ccbc-4e12-931b-d9cc2eee27e4 ProviderName >
< UserKeywords >0x2038 UserKeywords >
< OutputType >url OutputType >
< Path >https://some.elk:9200/NetETW/_doc/ Path >
ETWCollector >
< ETWCollector >
< Guid >6720babc-dedc-4906-86b9-d0bc0089ec50 Guid >
< CollectorType >user CollectorType >
< ProviderName >Microsoft-Windows-DNS-Client ProviderName >
< OutputType >eventlog OutputType >
< YaraScan >C:SomePathRuleFolder YaraScan >
< YaraOptions >Matches YaraOptions >
ETWCollector >
< ETWCollector >
< Guid >21ac2393-3bbb-4702-a01c-b593e21913dc Guid >
< CollectorType >kernel CollectorType >
< KernelKeywords >Process KernelKeywords >
< OutputType >file OutputType >
< Path >C:Usersb33fDesktopkproc.json Path >
ETWCollector >
SilkServiceConfig >
Обратите внимание, что каждый элемент ETWCollector должен иметь случайный GUID, который используется для внутреннего отслеживания и регистрации. Вы можете сгенерировать GUID в PowerShell, используя следующую команду:
PS C: > [ guid ]::NewGuid()
Guid
----
eee52b87 - 3f32 - 4651 - b0c3 - e7bb9af334aa
Во время выполнения SilkService создаст подпапку «Журналы» для записи информации о времени выполнения службы. Это бесценный ресурс для опроса состояния службы, проверки правильности параметров службы и просмотра информации об ошибках. SilkService предпочитает корректно завершать работу, если обнаруживает ошибку любого типа, даже если такая ошибка строго не требует завершения. Такое конструктивное решение было принято намеренно, поскольку наличие болтающихся коллекторов или частичной работоспособности не является разумной стратегией.
Всегда сверяйтесь с журналом службы, если служба отключается!
Всегда возможно, что что-то пойдет не так. Дополнительную информацию см. в журнале обслуживания. Хотя SilkService настроен на завершение и очистку сборщиков ETW или ошибок, возможно, что устаревший сборщик останется зарегистрированным после завершения процесса. Чтобы просмотреть список работающих сборщиков, вы можете использовать следующую команду.
logman -ets
Если обнаружены устаревшие сборщики, их можно удалить, выполнив следующие команды из командной строки с повышенными привилегиями.
Get-EtwTraceProvider | Where-Object {$.SessionName -like " SilkService* " } | ForEach-Object { Stop-EtwTraceSession - Name $.SessionName}
Get-EtwTraceProvider | Where-Object { $_ .SessionName -like " SilkService* " } | Remove-EtwTraceProvider
Вывод JSON перед сериализацией форматируется в соответствии со следующей структурой C#.
public struct EventRecordStruct
{
public Guid ProviderGuid ;
public List < String > YaraMatch ;
public string ProviderName ;
public string EventName ;
public TraceEventOpcode Opcode ;
public string OpcodeName ;
public DateTime TimeStamp ;
public int ThreadID ;
public int ProcessID ;
public string ProcessName ;
public int PointerSize ;
public int EventDataLength ;
public Hashtable XmlEventData ;
}
Обратите внимание, что в зависимости от поставщика и типа события в хеш-таблице XmlEventData будут переменные данные. Пример вывода JSON можно увидеть ниже для «Microsoft-Windows-Kernel-Process» -> «ThreadStop/Stop».
{
"ProviderGuid" : " 22fb2cd6-0e7b-422b-a0c7-2fad1fd0e716 " ,
"YaraMatch" :[
],
"ProviderName" : " Microsoft-Windows-Kernel-Process " ,
"EventName" : " ThreadStop/Stop " ,
"Opcode" : 2 ,
"OpcodeName" : " Stop " ,
"TimeStamp" : " 2019-03-03T17:58:14.2862348+00:00 " ,
"ThreadID" : 11996 ,
"ProcessID" : 8416 ,
"ProcessName" : " N/A " ,
"PointerSize" : 8 ,
"EventDataLength" : 76 ,
"XmlEventData" :{
"FormattedMessage" : " Thread 11,996 (in Process 8,416) stopped. " ,
"StartAddr" : " 0x7fffe299a110 " ,
"ThreadID" : " 11,996 " ,
"UserStackLimit" : " 0x3d632000 " ,
"StackLimit" : " 0xfffff38632d39000 " ,
"MSec" : " 560.5709 " ,
"TebBase" : " 0x91c000 " ,
"CycleTime" : " 4,266,270 " ,
"ProcessID" : " 8,416 " ,
"PID" : " 8416 " ,
"StackBase" : " 0xfffff38632d40000 " ,
"SubProcessTag" : " 0 " ,
"TID" : " 11996 " ,
"ProviderName" : " Microsoft-Windows-Kernel-Process " ,
"PName" : " " ,
"UserStackBase" : " 0x3d640000 " ,
"EventName" : " ThreadStop/Stop " ,
"Win32StartAddr" : " 0x7fffe299a110 "
}
}
Вы можете импортировать выходные данные JSON из SilkETW в PowerShell, используя следующую простую функцию.
function Get-SilkData {
param ( $Path )
$JSONObject = @ ()
Get-Content $Path | ForEach-Object {
$JSONObject += $_ | ConvertFrom-Json
}
$JSONObject
}
В приведенном ниже примере мы будем собирать данные о событиях процесса от поставщика ядра и использовать загрузку изображений для идентификации выполнения Mimikatz. Мы можем собрать необходимые данные с помощью следующей команды.
SilkETW.exe -t kernel -kk ImageLoad -ot file -p C:Usersb33fDesktopmimikatz.json
Имея данные на руках, их легко сортировать, искать и фильтровать по интересующим нас свойствам.
SilkETW включает в себя функцию Yara для фильтрации или маркировки данных о событиях. Опять же, это имеет очевидные защитные возможности, но его так же легко можно использовать для расширения ваших исследований ETW.
В этом примере мы будем использовать следующее правило Yara для обнаружения выполнения ремня безопасности в памяти с помощью выполнения сборки Cobalt Strike.
rule Seatbelt_GetTokenInformation
{
strings:
$s1 = "ManagedInteropMethodName=GetTokenInformation" ascii wide nocase
$s2 = "TOKEN_INFORMATION_CLASS" ascii wide nocase
$s3 = /bool(native int,valuetype w+.w+/w+,native int,int32,int32&/
$s4 = "locals (int32,int64,int64,int64,int64,int32& pinned,bool,int32)" ascii wide nocase
condition:
all of ($s*)
}
Мы можем начать сбор данных .Net ETW с помощью следующей команды. Опция «-yo» здесь указывает, что на диск следует записывать только совпадения Yara!
SilkETW.exe -t user -pn Microsoft-Windows-DotNETRuntime -uk 0x2038 -l verbose -y C:Usersb33fDesktopyara -yo matches -ot file -p C:Usersb33fDesktopyara.json
Во время выполнения мы видим, что наше правило Yara было нарушено.
Также обратите внимание, что мы фиксируем только подмножество событий «Microsoft-Windows-DotNETRuntime» (0x2038), а именно: JitKeyword, InteropKeyword, LoaderKeyword и NGenKeyword.
Вы можете скачать исходный код и скомпилировать его в Visual Studio. Обратите внимание, что вы можете получить версию Visual Studio для сообщества бесплатно. Или вы можете получить последнюю предварительно созданную версию из выпусков.
Подробную информацию об изменениях в конкретной версии можно найти в журнале изменений.