SilkETW und SilkService sind flexible C#-Wrapper für ETW. Sie sollen die Komplexität von ETW abstrahieren und Benutzern eine einfache Schnittstelle für Recherchen und Selbstbeobachtung bieten. Obwohl beide Projekte offensichtlich defensive (und offensive) Anwendungen haben, sollten sie in erster Linie als Forschungsinstrumente betrachtet werden.
Zur einfacheren Nutzung werden die Ausgabedaten in JSON serialisiert. Die JSON-Daten können entweder in eine Datei geschrieben und lokal mit PowerShell analysiert, im Windows-Ereignisprotokoll gespeichert oder an die Infrastruktur eines Drittanbieters wie Elasticsearch versendet werden.
Weitere Informationen zur Zukunft von SilkETW und SilkService finden Sie im Abschnitt „Roadmap“.
Weitere Hintergrundinformationen zu SilkETW und SilkService finden Sie in den folgenden Ressourcen.
SilkETW basiert auf .Net v4.5 und verwendet eine Reihe von Bibliotheken von Drittanbietern, wie unten gezeigt. Weitere Einzelheiten finden Sie unter 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
Die Verwendung der Befehlszeile ist ziemlich einfach und die Benutzereingaben werden im Ausführungsprolog validiert. Weitere Einzelheiten finden Sie im Bild unten.
SilkService wurde entwickelt, weil viele Menschen SilkETW kopflos ausführen und die ETW-Erfassung für mehrere Quellen gleichzeitig durchführen wollten. Obwohl dies offensichtlich attraktiv ist, sollten die folgenden Punkte beachtet werden.
Nach dem Kompilieren oder Herunterladen des Release-Pakets können Sie den Dienst installieren, indem Sie den folgenden Befehl an einer Eingabeaufforderung mit erhöhten Rechten eingeben.
sc create SillkService binPath= "C:PathToSilkService.exe" start= demand
SilkService nimmt eine XML-Konfigurationsdatei namens „SilkServiceConfig.xml“ auf, die im selben Verzeichnis wie die Dienstbinärdatei abgelegt werden sollte. Eine Beispielkonfigurationsdatei finden Sie unten.
< 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 >
Beachten Sie, dass jedes ETWCollector-Element eine zufällige GUID haben sollte, diese wird für interne Nachverfolgungs- und Protokollierungszwecke verwendet. Sie können GUIDs in PowerShell mit dem folgenden Befehl generieren:
PS C: > [ guid ]::NewGuid()
Guid
----
eee52b87 - 3f32 - 4651 - b0c3 - e7bb9af334aa
Zur Laufzeit erstellt SilkService einen Unterordner „Logs“, um Informationen zur Dienstlaufzeit aufzuzeichnen. Dies ist eine unschätzbare Ressource zum Abfragen des Dienststatus, zur Überprüfung der Dienstparametervalidierung und zur Überprüfung von Fehlerinformationen. SilkService bevorzugt das ordnungsgemäße Herunterfahren, wenn ein Fehler auftritt, auch wenn ein solcher Fehler nicht unbedingt eine Beendigung erfordert. Diese Designentscheidung wurde bewusst getroffen, da es keine vernünftige Strategie ist, baumelnde Kollektoren oder eine teilweise Funktionsfähigkeit zu haben.
Konsultieren Sie immer das Dienstprotokoll, wenn sich der Dienst selbst herunterfährt!
Es ist immer möglich, dass etwas schief geht. Weitere Einzelheiten finden Sie im Serviceprotokoll. Während SilkService zum Beenden und Bereinigen von ETW-Kollektoren oder Fehlern konfiguriert ist, ist es möglich, dass ein veralteter Kollektor nach Prozessbeendigung registriert bleibt. Um laufende Collectors aufzulisten, können Sie den folgenden Befehl verwenden.
logman -ets
Wenn veraltete Collectors identifiziert werden, können diese entfernt werden, indem die folgenden Befehle über eine Eingabeaufforderung mit erhöhten Rechten ausgegeben werden.
Get-EtwTraceProvider | Where-Object {$.SessionName -like " SilkService* " } | ForEach-Object { Stop-EtwTraceSession - Name $.SessionName}
Get-EtwTraceProvider | Where-Object { $_ .SessionName -like " SilkService* " } | Remove-EtwTraceProvider
Die JSON-Ausgabe wird vor der Serialisierung gemäß der folgenden C#-Struktur formatiert.
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 ;
}
Beachten Sie, dass die XmlEventData-Hashtabelle je nach Anbieter und Ereignistyp variable Daten enthält. Eine Beispiel-JSON-Ausgabe finden Sie unten für „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 "
}
}
Mit der folgenden einfachen Funktion können Sie die JSON-Ausgabe von SilkETW in PowerShell importieren.
function Get-SilkData {
param ( $Path )
$JSONObject = @ ()
Get-Content $Path | ForEach-Object {
$JSONObject += $_ | ConvertFrom-Json
}
$JSONObject
}
Im folgenden Beispiel sammeln wir Prozessereignisdaten vom Kernel-Anbieter und verwenden Bildladevorgänge, um die Mimikatz-Ausführung zu identifizieren. Mit dem folgenden Befehl können wir die benötigten Daten sammeln.
SilkETW.exe -t kernel -kk ImageLoad -ot file -p C:Usersb33fDesktopmimikatz.json
Mit den vorliegenden Daten ist es einfach, die Eigenschaften, an denen wir interessiert sind, zu sortieren, zu durchsuchen und zu filtern.
SilkETW umfasst Yara-Funktionen zum Filtern oder Markieren von Ereignisdaten. Auch dies hat offensichtliche Verteidigungsmöglichkeiten, kann aber genauso gut zur Erweiterung Ihrer ETW-Forschung genutzt werden.
In diesem Beispiel verwenden wir die folgende Yara-Regel, um die Ausführung von Seatbelt im Speicher über die Execute-Assembly von Cobalt Strike zu erkennen.
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*)
}
Mit dem folgenden Befehl können wir mit der Erfassung von .Net ETW-Daten beginnen. Die Option „-yo“ gibt hier an, dass wir nur Yara-Übereinstimmungen auf die Festplatte schreiben sollten!
SilkETW.exe -t user -pn Microsoft-Windows-DotNETRuntime -uk 0x2038 -l verbose -y C:Usersb33fDesktopyara -yo matches -ot file -p C:Usersb33fDesktopyara.json
Wir können zur Laufzeit sehen, dass unsere Yara-Regel erreicht wurde.
Beachten Sie auch, dass wir nur eine Teilmenge der „Microsoft-Windows-DotNETRuntime“-Ereignisse (0x2038) erfassen, insbesondere: JitKeyword, InteropKeyword, LoaderKeyword und NGenKeyword.
Sie können entweder die Quelle herunterladen und in Visual Studio kompilieren. Bitte beachten Sie, dass Sie die Community Edition von Visual Studio kostenlos erhalten können. Oder Sie können die neueste vorgefertigte Version von Releases herunterladen.
Einzelheiten zu versionspezifischen Änderungen finden Sie im Changelog.