
C#-Wrapper für ETW, der Kernel- und Benutzermodus-Ereignisdaten in JSON serialisiert für Bedrohungsjagd, Malware-Analyse und Incident Response, mit Yara-Integration und Elasticsearch-Versand.
SilkETW & SilkService sind flexible C#-Wrapper für ETW. Sie sollen die Komplexität von ETW abstrahieren und den Leuten eine einfache Schnittstelle bieten, um Forschung und Introspektion durchzuführen. Obwohl beide Projekte offensichtliche defensive (und offensive) Anwendungen haben, sollten sie in erster Linie als Forschungswerkzeuge betrachtet werden.
Zur einfachen Verwendung werden 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 eine Drittanbieter-Infrastruktur wie Elasticsearch gesendet werden.
Weitere Informationen zur Zukunft von SilkETW & SilkService finden Sie im Abschnitt Fahrplan.
Weitere Hintergrundinformationen zu SilkETW und SilkService finden Sie in den folgenden Ressourcen.
SilkETW basiert auf .Net v4.5 und verwendet eine Reihe von Drittanbieter-Bibliotheken, wie unten gezeigt. Weitere Einzelheiten finden Sie in 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 recht einfach und die Benutzereingaben werden im Ausführungsprolog validiert. Siehe das Bild unten für weitere Details.

SilkService wurde erstellt, weil viele Leute SilkETW kopflos ausführen und ETW-Sammlung 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 in einer erhöhten Eingabeaufforderung ausführen.
sc create SillkService binPath= "C:\Path\To\SilkService.exe" start= demand
SilkService verwendet eine XML-Konfigurationsdatei, "SilkServiceConfig.xml", die im selben Verzeichnis wie die Dienstbinärdatei abgelegt werden sollte. Eine Beispielkonfigurationsdatei ist unten zu sehen.
<SilkServiceConfig>
<!--
This is a user collector
-> Microsoft-Windows-DotNETRuntime
-> GUID or string based name
-->
<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>
<!--
This is a user collector
-->
<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>
<!--
This is a kernel collector
-->
<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>
Beachten Sie, dass jedes ETWCollector-Element eine zufällige GUID haben sollte, die für die interne Verfolgung und Protokollierung verwendet wird. 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 Laufzeitinformationen des Dienstes aufzuzeichnen. Dies ist eine unschätzbare Ressource, um den Dienstzustand abzufragen, die Parameterüberprüfung des Dienstes zu verifizieren und Fehlerinformationen zu überprüfen. SilkService hat die Präferenz, sich ordnungsgemäß herunterzufahren, wenn es auf einen Fehler stößt, selbst wenn ein solcher Fehler nicht unbedingt eine Beendigung erfordert. Diese Designentscheidung wurde bewusst getroffen, da es keine gute Strategie ist, lose Sammler oder partielle Betriebsfähigkeit zu haben.
Konsultieren Sie immer das Dienstprotokoll, wenn der Dienst sich selbst herunterfährt!
Es ist immer möglich, dass etwas schief geht. Konsultieren Sie das Dienstprotokoll für weitere Details. Während SilkService so konfiguriert ist, dass es ETW-Sammler bei Fehlern beendet und bereinigt, kann es vorkommen, dass nach der Prozessbeendigung ein veralteter Sammler registriert bleibt. Um laufende Sammler aufzulisten, können Sie den folgenden Befehl verwenden.
logman -ets
Wenn veraltete Sammler identifiziert werden, können sie durch Ausführen der folgenden Befehle in einer erhöhten Eingabeaufforderung entfernt 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 Sie je nach Anbieter und Ereignistyp variable Daten in der XmlEventData-Hashtabelle haben. Beispiel-JSON-Ausgabe für "Microsoft-Windows-Kernel-Process" -> "ThreadStop/Stop" ist unten zu sehen.
{
"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"
}
}
Sie können JSON-Ausgabe von SilkETW in PowerShell mit der folgenden einfachen Funktion 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 Image-Ladungen, um die Mimikatz-Ausführung zu identifizieren. Wir können die erforderlichen Daten mit dem folgenden Befehl sammeln.
SilkETW.exe -t kernel -kk ImageLoad -ot file -p C:\Users\b33f\Desktop\mimikatz.json
Mit den vorliegenden Daten ist es einfach, die Eigenschaften, die uns interessieren, zu sortieren, zu grep und zu filtern.

SilkETW enthält Yara-Funktionen zum Filtern oder Markieren von Ereignisdaten. Auch dies hat offensichtliche defensive Fähigkeiten, kann aber genauso gut verwendet werden, um Ihre ETW-Forschung zu erweitern.
In diesem Beispiel verwenden wir die folgende Yara-Regel, um die Seatbelt-Ausführung im Speicher durch Cobalt Strike's execute-assembly 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*)
}
Wir können mit dem folgenden Befehl mit der Sammlung von .Net-ETW-Daten beginnen. Die Option "-yo" gibt hier an, dass wir nur Yara-Übereinstimmungen auf die Festplatte schreiben sollen!
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
Wir können zur Laufzeit sehen, dass unsere Yara-Regel getroffen wurde.

Beachten Sie auch, dass wir nur eine Teilmenge der "Microsoft-Windows-DotNETRuntime"-Ereignisse (0x2038) erfassen, nämlich: JitKeyword, InteropKeyword, LoaderKeyword und NGenKeyword.
Sie können entweder die Quelle herunterladen und in Visual Studio kompilieren. Beachten Sie, dass Sie die Community Edition von Visual Studio kostenlos erhalten können. Oder Sie können die neueste vorgebaute Version von Releases herunterladen.
Einzelheiten zu versionsspezifischen Änderungen finden Sie im Änderungsprotokoll.