
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>
<!--
यह एक उपयोगकर्ता कलेक्टर है
-> Microsoft-Windows-DotNETRuntime
-> GUID या स्ट्रिंग-आधारित नाम
-->
<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:\Some\Path\RuleFolder</YaraScan>
<YaraOptions>Matches</YaraOptions>
</ETWCollector>
<!--
यह एक कर्नेल कलेक्टर है
-->
<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# struct के अनुसार स्वरूपित होता है।
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 का कम्युनिटी संस्करण मुफ्त में प्राप्त कर सकते हैं। या आप रिलीज़ से नवीनतम पूर्व-निर्मित संस्करण प्राप्त कर सकते हैं।
संस्करण-विशिष्ट परिवर्तनों के विवरण के लिए, कृपया चेंजलॉग देखें।