
ETW용 C# 래퍼로서 커널 및 사용자 모드 이벤트 데이터를 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>
<!--
This is a user collector
-> Microsoft-Windows-DotNETRuntime
-> GUID or string based name
-->
<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>
<!--
This is a user collector
-->
<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>
<!--
This is a kernel collector
-->
<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가 있어야 하며, 이는 내부 추적 및 로깅 목적으로 사용됩니다. 다음 명령을 사용하여 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:\Users\b33f\Desktop\mimikatz.json
데이터가 있으면 원하는 속성을 정렬, grep 및 필터링하기 쉽습니다.

SilkETW에는 이벤트 데이터를 필터링하거나 태그하는 Yara 기능이 포함되어 있습니다. 다시 말하지만, 이는 명백한 방어 기능을 가지고 있지만 ETW 연구를 보강하는 데에도 쉽게 사용할 수 있습니다.
이 예에서는 Cobalt Strike의 execute-assembly를 통해 메모리에서 Seatbelt 실행을 감지하기 위해 다음 Yara 규칙을 사용합니다.
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의 커뮤니티 에디션을 무료로 받을 수 있습니다. 또는 릴리스에서 최신 사전 빌드 버전을 가져올 수 있습니다.
버전별 변경 사항에 대한 자세한 내용은 변경 로그를 참조하십시오.