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
데이터가 있으면 관심 있는 속성을 쉽게 정렬하고, 파악하고, 필터링할 수 있습니다.
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의 커뮤니티 버전을 무료로 얻을 수 있습니다. 또는 릴리스에서 사전 구축된 최신 버전을 가져올 수도 있습니다.
버전별 변경 사항에 대한 자세한 내용은 변경 로그를 참조하세요.