
Envoltorio en C# para ETW que serializa datos de eventos de kernel y modo usuario a JSON para caza de amenazas, análisis de malware y respuesta a incidentes, con integración de Yara y envío a Elasticsearch.
SilkETW y SilkService son envoltorios flexibles en C# para ETW, diseñados para abstraer las complejidades de ETW y ofrecer a los usuarios una interfaz simple para realizar investigación e introspección. Aunque ambos proyectos tienen aplicaciones defensivas (y ofensivas) obvias, deben considerarse principalmente como herramientas de investigación.
Para un consumo sencillo, los datos de salida se serializan en JSON. Los datos JSON pueden escribirse en un archivo y analizarse localmente mediante PowerShell, almacenarse en el registro de eventos de Windows o enviarse a infraestructura de terceros como Elasticsearch.
Para obtener más información sobre el futuro de SilkETW y SilkService, consulte la sección Hoja de Ruta.
Para obtener más antecedentes sobre SilkETW y SilkService, consulte los siguientes recursos.
SilkETW está construido sobre .Net v4.5 y utiliza varias bibliotecas de terceros, como se muestra a continuación. Consulte LICENSE-3RD-PARTY para obtener más detalles.
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
El uso desde la línea de comandos es bastante sencillo y la entrada del usuario se valida en el prólogo de ejecución. Consulte la imagen a continuación para obtener más detalles.

SilkService fue creado porque muchas personas querían ejecutar SilkETW sin interfaz gráfica y realizar la recolección de ETW de múltiples fuentes al mismo tiempo. Aunque esto tiene un atractivo obvio, se deben tener en cuenta los siguientes puntos.
Después de compilar o descargar el paquete de lanzamiento, puede instalar el servicio ejecutando el siguiente comando desde un símbolo del sistema elevado.
sc create SillkService binPath= "C:\Path\To\SilkService.exe" start= demand
SilkService ingiere un archivo de configuración XML, "SilkServiceConfig.xml", que debe colocarse en el mismo directorio que el binario del servicio. A continuación se puede ver un ejemplo de archivo de configuración.
<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>
Tenga en cuenta que cada elemento ETWCollector debe tener un GUID aleatorio; esto se utiliza para el seguimiento interno y fines de registro. Puede generar GUID en PowerShell usando el siguiente comando:
PS C:\> [guid]::NewGuid()
Guid
----
eee52b87-3f32-4651-b0c3-e7bb9af334aa
En tiempo de ejecución, SilkService creará una subcarpeta "Logs" para registrar información de ejecución del servicio. Este es un recurso invaluable para consultar el estado del servicio, verificar la validación de parámetros del servicio y revisar información de errores. SilkService prefiere cerrarse sin problemas si encuentra cualquier tipo de error, incluso si dicho error no requiere estrictamente terminación. Esta decisión de diseño se tomó deliberadamente, ya que no es una estrategia sólida tener recolectores colgantes u operabilidad parcial.
¡Consulte siempre el registro del servicio si el servicio se apaga solo!
Siempre es posible que algo salga mal. Consulte el registro del servicio para obtener más detalles. Si bien SilkService está configurado para terminar y limpiar los recolectores ETW o error, es posible que un recolector obsoleto permanezca registrado después de la terminación del proceso. Para listar los recolectores en ejecución, puede usar el siguiente comando.
logman -ets
Si se identifican recolectores obsoletos, se pueden eliminar ejecutando los siguientes comandos desde un símbolo del sistema elevado.
Get-EtwTraceProvider |Where-Object {$.SessionName -like "SilkService*"} |ForEach-Object {Stop-EtwTraceSession -Name $.SessionName}
Get-EtwTraceProvider |Where-Object {$_.SessionName -like "SilkService*"} |Remove-EtwTraceProvider
La salida JSON, antes de la serialización, se formatea según la siguiente estructura de 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;
}
Tenga en cuenta que, dependiendo del proveedor y del tipo de evento, tendrá datos variables en la tabla hash XmlEventData. A continuación se muestra un ejemplo de salida JSON para "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"
}
}
Puede importar la salida JSON de SilkETW en PowerShell usando la siguiente función simple.
function Get-SilkData {
param($Path)
$JSONObject = @()
Get-Content $Path | ForEach-Object {
$JSONObject += $_ | ConvertFrom-Json
}
$JSONObject
}
En el ejemplo a continuación, recopilaremos datos de eventos de proceso del proveedor Kernel y usaremos cargas de imágenes para identificar la ejecución de Mimikatz. Podemos recopilar los datos requeridos con el siguiente comando.
SilkETW.exe -t kernel -kk ImageLoad -ot file -p C:\Users\b33f\Desktop\mimikatz.json
Con los datos en mano, es fácil ordenar, grep y filtrar para las propiedades que nos interesan.

SilkETW incluye funcionalidad Yara para filtrar o etiquetar datos de eventos. Nuevamente, esto tiene capacidades defensivas obvias, pero también se puede utilizar para mejorar su investigación de ETW.
En este ejemplo, usaremos la siguiente regla Yara para detectar la ejecución de Seatbelt en memoria a través de execute-assembly de 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*)
}
Podemos comenzar a recopilar datos ETW de .Net con el siguiente comando. ¡La opción "-yo" aquí indica que solo debemos escribir las coincidencias de Yara en el 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
Podemos ver en tiempo de ejecución que nuestra regla Yara fue alcanzada.

Tenga en cuenta también que solo estamos capturando un subconjunto de los eventos "Microsoft-Windows-DotNETRuntime" (0x2038), específicamente: JitKeyword, InteropKeyword, LoaderKeyword y NGenKeyword.
Puede descargar el código fuente y compilarlo en Visual Studio. Tenga en cuenta que puede obtener la edición comunitaria de Visual Studio de forma gratuita. O puede obtener la última versión precompilada desde lanzamientos.
Para obtener detalles sobre los cambios específicos de la versión, consulte el Registro de cambios.