إن SilkETW وSilkService عبارة عن أغلفة C# مرنة لـ ETW، وهي تهدف إلى تجريد تعقيدات ETW ومنح الأشخاص واجهة بسيطة لإجراء البحث والاستبطان. في حين أن كلا المشروعين لهما تطبيقات دفاعية (وهجومية) واضحة، إلا أنه ينبغي اعتبارهما في المقام الأول أدوات بحث.
لسهولة الاستهلاك، يتم إجراء تسلسل لبيانات الإخراج إلى JSON. يمكن كتابة بيانات JSON في ملف وتحليلها محليًا باستخدام PowerShell، أو تخزينها في سجل أحداث Windows أو شحنها إلى البنية التحتية لجهة خارجية مثل Elasticsearch.
لمزيد من المعلومات حول مستقبل SilkETW وSilkService، راجع قسم خريطة الطريق.
لمزيد من المعلومات الأساسية عن SilkETW وSilkService برجاء الرجوع إلى المصادر التالية.
تم إنشاء SilkETW على الإصدار 4.5.Net ويستخدم عددًا من مكتبات الطرف الثالث، كما هو موضح أدناه. يرجى الاطلاع على 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 بإنشاء مجلد فرعي "سجلات" لتسجيل معلومات وقت تشغيل الخدمة. يعد هذا موردًا لا يقدر بثمن لاستقصاء حالة الخدمة والتحقق من التحقق من صحة معلمة الخدمة ومراجعة معلومات الخطأ. تفضل 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
}
في المثال أدناه، سنقوم بجمع بيانات حدث العملية من موفر Kernel واستخدام تحميلات الصور لتحديد تنفيذ 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 مجانًا. أو يمكنك الحصول على أحدث إصدار تم إنشاؤه مسبقًا من الإصدارات.
للحصول على تفاصيل حول التغييرات الخاصة بالإصدار، يرجى الرجوع إلى سجل التغيير.