
Wrapper C# per ETW che serializza i dati degli eventi in modalità kernel e utente in JSON per la caccia alle minacce, l'analisi malware e la risposta agli incidenti, con integrazione Yara e invio a Elasticsearch.
SilkETW e SilkService sono wrapper flessibili in C# per ETW, progettati per astrarre le complessità di ETW e fornire alle persone un'interfaccia semplice per effettuare ricerca e introspezione. Sebbene entrambi i progetti abbiano ovvie applicazioni difensive (e offensive), dovrebbero essere considerati principalmente come strumenti di ricerca.
Per un consumo facile, i dati di output sono serializzati in JSON. I dati JSON possono essere scritti su file e analizzati localmente usando PowerShell, archiviati nel registro eventi di Windows o inviati a infrastrutture di terze parti come Elasticsearch.
Per maggiori informazioni sul futuro di SilkETW e SilkService, consulta la sezione Roadmap.
Per ulteriori informazioni su SilkETW e SilkService, consulta le seguenti risorse.
SilkETW è costruito su .Net v4.5 e utilizza diverse librerie di terze parti, come mostrato sotto. Consulta LICENSE-3RD-PARTY per ulteriori dettagli.
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
L'utilizzo da riga di comando è abbastanza semplice e l'input utente viene validato nel prologo di esecuzione. Vedi l'immagine sotto per ulteriori dettagli.

SilkService è stato creato perché molte persone volevano eseguire SilkETW in modalità headless e raccogliere ETW da più fonti contemporaneamente. Sebbene ciò sia ovviamente interessante, i seguenti punti dovrebbero essere tenuti a mente.
Dopo aver compilato o scaricato il pacchetto di rilascio, puoi installare il servizio eseguendo il seguente comando da un prompt dei comandi elevato.
sc create SillkService binPath= "C:\Path\To\SilkService.exe" start= demand
SilkService legge un file di configurazione XML, "SilkServiceConfig.xml", che dovrebbe essere posizionato nella stessa directory del binario del servizio. Un esempio di file di configurazione è mostrato sotto.
<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>
Nota che ogni elemento ETWCollector dovrebbe avere un GUID casuale, utilizzato per monitoraggio e registrazione interni. Puoi generare GUID in PowerShell usando il seguente comando:
PS C:\> [guid]::NewGuid()
Guid
----
eee52b87-3f32-4651-b0c3-e7bb9af334aa
Durante l'esecuzione, SilkService creerà una sottocartella "Logs" per registrare le informazioni di runtime del servizio. Questa è una risorsa inestimabile per interrogare lo stato del servizio, verificare la validazione dei parametri e rivedere le informazioni sugli errori. SilkService preferisce arrestarsi in modo pulito se incontra qualsiasi tipo di errore, anche se tale errore non richiede strettamente la terminazione. Questa decisione di design è stata presa intenzionalmente poiché non è una strategia valida avere collector pendenti o operatività parziale.
Consulta sempre il log del servizio se il servizio si arresta da solo!
È sempre possibile che qualcosa vada storto. Consulta il log del servizio per maggiori dettagli. Sebbene SilkService sia configurato per terminare e pulire i collector ETW in caso di errore, è possibile che un collector obsoleto rimanga registrato dopo la terminazione del processo. Per elencare i collector in esecuzione, puoi usare il seguente comando.
logman -ets
Se vengono identificati collector obsoleti, possono essere rimossi eseguendo i seguenti comandi da un prompt elevato.
Get-EtwTraceProvider |Where-Object {$.SessionName -like "SilkService*"} |ForEach-Object {Stop-EtwTraceSession -Name $.SessionName}
Get-EtwTraceProvider |Where-Object {$_.SessionName -like "SilkService*"} |Remove-EtwTraceProvider
L'output JSON, prima della serializzazione, è formattato secondo la seguente struct 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;
}
Nota che, a seconda del provider e del tipo di evento, avrai dati variabili nella tabella hash XmlEventData. Un esempio di output JSON è mostrato sotto per "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"
}
}
Puoi importare l'output JSON di SilkETW in PowerShell usando la seguente semplice funzione.
function Get-SilkData {
param($Path)
$JSONObject = @()
Get-Content $Path | ForEach-Object {
$JSONObject += $_ | ConvertFrom-Json
}
$JSONObject
}
Nell'esempio seguente raccoglieremo dati sugli eventi di processo dal provider Kernel e useremo i caricamenti di immagini per identificare l'esecuzione di Mimikatz. Possiamo raccogliere i dati richiesti con il seguente comando.
SilkETW.exe -t kernel -kk ImageLoad -ot file -p C:\Users\b33f\Desktop\mimikatz.json
Con i dati in mano è facile ordinare, cercare e filtrare per le proprietà che ci interessano.

SilkETW include funzionalità Yara per filtrare o etichettare i dati degli eventi. Anche questo ha ovvie capacità difensive, ma può essere facilmente utilizzato per potenziare la tua ricerca ETW.
In questo esempio utilizzeremo la seguente regola Yara per rilevare l'esecuzione di Seatbelt in memoria tramite execute-assembly di 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*)
}
Possiamo iniziare a raccogliere dati ETW .Net con il seguente comando. L'opzione "-yo" qui indica che dovremmo scrivere solo i match Yara su disco!
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
Possiamo vedere in esecuzione che la nostra regola Yara è stata attivata.

Nota anche che stiamo catturando solo un sottoinsieme degli eventi "Microsoft-Windows-DotNETRuntime" (0x2038), in particolare: JitKeyword, InteropKeyword, LoaderKeyword e NGenKeyword.
Puoi scaricare il codice sorgente e compilarlo in Visual Studio. Nota che puoi ottenere la versione Community di Visual Studio gratuitamente. Oppure puoi scaricare l'ultima versione precompilata dai releases.
Per dettagli sulle modifiche specifiche delle versioni, consulta il Changelog.