SilkETW & SilkService adalah pembungkus C# yang fleksibel untuk ETW, dimaksudkan untuk mengabstraksi kompleksitas ETW dan memberikan antarmuka sederhana kepada orang-orang untuk melakukan penelitian dan introspeksi. Meskipun kedua proyek tersebut jelas memiliki kegunaan defensif (dan ofensif), kedua proyek tersebut sebaiknya dianggap sebagai alat penelitian.
Agar mudah dikonsumsi, data keluaran diserialkan ke JSON. Data JSON dapat ditulis ke file dan dianalisis secara lokal menggunakan PowerShell, disimpan di log peristiwa Windows, atau dikirim ke infrastruktur pihak ketiga seperti Elasticsearch.
Untuk informasi lebih lanjut tentang masa depan SilkETW & SilkService, lihat bagian Peta Jalan.
Untuk latar belakang lebih lanjut tentang SilkETW dan SilkService silakan lihat sumber daya berikut.
SilkETW dibangun di .Net v4.5 dan menggunakan sejumlah perpustakaan pihak ketiga, seperti yang ditunjukkan di bawah ini. Silakan lihat LISENSI-PIHAK KE-3 untuk rincian lebih lanjut.
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
Penggunaan baris perintah cukup mudah dan input pengguna divalidasi dalam prolog eksekusi. Lihat gambar di bawah ini untuk lebih jelasnya.
SilkService dibuat karena banyak orang ingin menjalankan SilkETW tanpa kepala dan melakukan pengumpulan ETW untuk berbagai sumber secara bersamaan. Meskipun hal ini jelas menarik, hal-hal berikut harus diingat.
Setelah mengkompilasi atau mengunduh paket rilis, Anda dapat menginstal layanan dengan mengeluarkan perintah berikut dari prompt yang ditinggikan.
sc create SillkService binPath= "C:PathToSilkService.exe" start= demand
SilkService menyerap file konfigurasi XML, "SilkServiceConfig.xml", yang harus ditempatkan di direktori yang sama dengan biner layanan. Contoh file konfigurasi dapat dilihat di bawah ini.
< 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 >
Perhatikan bahwa setiap elemen ETWCollector harus memiliki GUID acak, ini digunakan untuk tujuan pelacakan dan pencatatan internal. Anda dapat membuat GUID di PowerShell menggunakan perintah berikut:
PS C: > [ guid ]::NewGuid()
Guid
----
eee52b87 - 3f32 - 4651 - b0c3 - e7bb9af334aa
Saat runtime, SilkService akan membuat subfolder "Logs" untuk mencatat informasi runtime layanan. Ini adalah sumber daya yang sangat berharga untuk melakukan survei status layanan, memverifikasi validasi parameter layanan, dan meninjau informasi kesalahan. SilkService memiliki preferensi untuk mematikan dengan baik jika menemui jenis kesalahan apa pun, meskipun kesalahan tersebut tidak sepenuhnya memerlukan penghentian. Keputusan desain ini dibuat dengan sengaja karena bukanlah strategi yang tepat untuk memiliki kolektor yang menjuntai atau pengoperasian sebagian.
Selalu lihat log layanan jika layanan mati sendiri!
Selalu ada kemungkinan terjadi kesalahan. Konsultasikan log layanan untuk rincian lebih lanjut. Meskipun SilkService dikonfigurasi untuk menghentikan dan membersihkan kolektor atau kesalahan ETW, ada kemungkinan bahwa kolektor basi tetap terdaftar setelah penghentian proses. Untuk membuat daftar kolektor yang berjalan, Anda dapat menggunakan perintah berikut.
logman -ets
Jika ada kolektor basi yang teridentifikasi, mereka dapat dihapus dengan mengeluarkan perintah berikut dari prompt yang ditinggikan.
Get-EtwTraceProvider | Where-Object {$.SessionName -like " SilkService* " } | ForEach-Object { Stop-EtwTraceSession - Name $.SessionName}
Get-EtwTraceProvider | Where-Object { $_ .SessionName -like " SilkService* " } | Remove-EtwTraceProvider
Output JSON, sebelum serialisasi, diformat sesuai dengan struct C# berikut.
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 ;
}
Perhatikan bahwa, bergantung pada penyedia dan jenis peristiwa, Anda akan memiliki data variabel di tabel hash XmlEventData. Contoh output JSON dapat dilihat di bawah untuk "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 "
}
}
Anda dapat mengimpor keluaran JSON dari SilkETW di PowerShell menggunakan fungsi sederhana berikut.
function Get-SilkData {
param ( $Path )
$JSONObject = @ ()
Get-Content $Path | ForEach-Object {
$JSONObject += $_ | ConvertFrom-Json
}
$JSONObject
}
Pada contoh di bawah ini kami akan mengumpulkan data peristiwa proses dari penyedia Kernel dan menggunakan pemuatan gambar untuk mengidentifikasi eksekusi Mimikatz. Kami dapat mengumpulkan data yang diperlukan dengan perintah berikut.
SilkETW.exe -t kernel -kk ImageLoad -ot file -p C:Usersb33fDesktopmimikatz.json
Dengan data yang ada, mudah untuk mengurutkan, mengambil, dan memfilter properti yang kita minati.
SilkETW menyertakan fungsionalitas Yara untuk memfilter atau menandai data peristiwa. Sekali lagi, ini memiliki kemampuan defensif yang jelas tetapi dapat dengan mudah digunakan untuk meningkatkan penelitian ETW Anda.
Dalam contoh ini kita akan menggunakan aturan Yara berikut untuk mendeteksi eksekusi Sabuk Pengaman di memori melalui rakitan eksekusi 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*)
}
Kita bisa mulai mengumpulkan data .Net ETW dengan perintah berikut. Opsi "-yo" di sini menunjukkan bahwa kita sebaiknya hanya menulis kecocokan Yara ke disk!
SilkETW.exe -t user -pn Microsoft-Windows-DotNETRuntime -uk 0x2038 -l verbose -y C:Usersb33fDesktopyara -yo matches -ot file -p C:Usersb33fDesktopyara.json
Kita dapat melihat pada saat runtime bahwa aturan Yara kita telah terkena.
Perhatikan juga bahwa kami hanya menangkap sebagian dari peristiwa "Microsoft-Windows-DotNETRuntime" (0x2038), khususnya: JitKeyword, InteropKeyword, LoaderKeyword, dan NGenKeyword.
Anda dapat mengunduh sumbernya dan mengkompilasinya di Visual Studio. Harap dicatat bahwa Anda bisa mendapatkan Visual Studio edisi komunitas secara gratis. Atau Anda dapat mengambil versi terbaru yang dibuat sebelumnya dari rilis.
Untuk detail tentang perubahan spesifik versi, silakan merujuk ke Changelog.