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: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 が必要であることに注意してください。これは内部追跡とロギングの目的で使用されます。次のコマンドを使用して、PowerShell で GUID を生成できます。
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 "
}
}
次の簡単な関数を使用して、PowerShell の SilkETW から JSON 出力をインポートできます。
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
データがあれば、関心のあるプロパティの並べ替え、grep、フィルター処理が簡単に行えます。
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 のコミュニティ エディションは無料で入手できることに注意してください。または、リリースから最新のビルド済みバージョンを取得することもできます。
バージョン固有の変更の詳細については、変更ログを参照してください。