SilkETW & SilkService เป็น wrappers 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 จะสร้างโฟลเดอร์ย่อย "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 ขึ้นอยู่กับผู้ให้บริการและประเภทเหตุการณ์ สามารถดูเอาต์พุต 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
ด้วยข้อมูลที่อยู่ในมือ ทำให้ง่ายต่อการจัดเรียง 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 รุ่นชุมชนได้ฟรี หรือคุณสามารถคว้าเวอร์ชันที่สร้างไว้ล่วงหน้าล่าสุดจากรุ่นต่างๆ
สำหรับรายละเอียดเกี่ยวกับการเปลี่ยนแปลงเฉพาะเวอร์ชัน โปรดดูที่บันทึกการเปลี่ยนแปลง