
C#で書かれたETWラッパー。脅威ハンティング、マルウェア解析、インシデント対応のために、カーネルおよびユーザーモードのイベントデータをJSONにシリアライズし、Yara統合とElasticsearchへの送信を備えています。
SilkETW と SilkService は、ETW のための柔軟な C# ラッパーです。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:\Path\To\SilkService.exe" start= demand
SilkService は XML 構成ファイル "SilkServiceConfig.xml" を読み込みます。このファイルはサービスバイナリと同じディレクトリに配置する必要があります。以下に構成ファイルの例を示します。
<SilkServiceConfig>
<!--
これはユーザーコレクターです
-> Microsoft-Windows-DotNETRuntime
-> GUID または文字列ベースの名前
-->
<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:\Some\Path\RuleFolder</YaraScan>
<YaraOptions>Matches</YaraOptions>
</ETWCollector>
<!--
これはカーネルコレクターです
-->
<ETWCollector>
<Guid>21ac2393-3bbb-4702-a01c-b593e21913dc</Guid>
<CollectorType>kernel</CollectorType>
<KernelKeywords>Process</KernelKeywords>
<OutputType>file</OutputType>
<Path>C:\Users\b33f\Desktop\kproc.json</Path>
</ETWCollector>
</SilkServiceConfig>
各 ETWCollector 要素にはランダムな GUID が必要です。これは内部追跡とログ記録に使用されます。GUID は PowerShell で次のコマンドを使用して生成できます。
PS C:\> [guid]::NewGuid()
Guid
----
eee52b87-3f32-4651-b0c3-e7bb9af334aa
実行時、SilkService は "Logs" サブフォルダを作成し、サービスランタイム情報を記録します。これは、サービスの状態を確認し、サービスパラメータの検証を確認し、エラー情報を確認するための貴重なリソースです。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 ハッシュテーブル内のデータは異なります。以下に、"Microsoft-Windows-Kernel-Process" -> "ThreadStop/Stop" のサンプル JSON 出力を示します。
{
"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"
}
}
SilkETW の JSON 出力は、以下の簡単な関数を使用して 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:\Users\b33f\Desktop\mimikatz.json
データがあれば、関心のあるプロパティを簡単に並べ替え、grep、フィルタリングできます。

SilkETW には、イベントデータをフィルタリングまたはタグ付けするための Yara 機能が含まれています。これには明らかな防御機能がありますが、ETW 研究を強化するためにも同様に使用できます。
この例では、次の Yara ルールを使用して、Cobalt Strike の execute-assembly を介したメモリ内の Seatbelt 実行を検出します。
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:\Users\b33f\Desktop\yara -yo matches -ot file -p C:\Users\b33f\Desktop\yara.json
実行時に Yara ルールがヒットしたことがわかります。

また、"Microsoft-Windows-DotNETRuntime" イベントのサブセット(0x2038)、具体的には JitKeyword、InteropKeyword、LoaderKeyword、NGenKeyword のみをキャプチャしていることに注意してください。
ソースをダウンロードして Visual Studio でコンパイルするか、リリース からプリビルド版の最新版を入手できます。Visual Studio の Community Edition は無料で入手できます。
バージョン固有の変更の詳細については、変更履歴を参照してください。