SilkETW y SilkService son contenedores C# flexibles para ETW, están destinados a abstraer las complejidades de ETW y brindar a las personas una interfaz simple para realizar investigaciones e introspección. Si bien ambos proyectos tienen aplicaciones defensivas (y ofensivas) obvias, deberían considerarse principalmente como herramientas de investigación.
Para facilitar el consumo, los datos de salida se serializan en JSON. Los datos JSON pueden escribirse en un archivo y analizarse localmente usando PowerShell, almacenarse en el registro de eventos de Windows o enviarse a una 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 información sobre SilkETW y SilkService, consulte los siguientes recursos.
SilkETW está construido en .Net v4.5 y utiliza varias bibliotecas de terceros, como se muestra a continuación. Consulte LICENCIA DE TERCEROS 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 de la línea de comandos es bastante sencillo y la entrada del usuario se valida en el prólogo de ejecución. Vea la imagen a continuación para más detalles.
SilkService se creó porque una gran cantidad de personas querían ejecutar SilkETW sin cabeza y realizar la recopilación de ETW para múltiples fuentes al mismo tiempo. Si bien 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 emitiendo el siguiente comando desde un símbolo elevado.
sc create SillkService binPath= "C:PathToSilkService.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 archivo de configuración de ejemplo.
< 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 >
Tenga en cuenta que cada elemento de ETWCollector debe tener un GUID aleatorio, que se utiliza para fines de registro y seguimiento interno. 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 "Registros" para registrar la información del tiempo de ejecución del servicio. Este es un recurso invaluable para sondear el estado del servicio, verificar la validación de los parámetros del servicio y revisar la información de errores. SilkService tiene preferencia por cerrarse correctamente si encuentra algún tipo de error, incluso si dicho error no requiere estrictamente la terminación. Esta decisión de diseño se tomó a propósito ya que no es una buena estrategia tener colectores colgantes o una operatividad parcial.
¡Consulte siempre el registro de servicio si el servicio se cierra solo!
Siempre es posible que algo salga mal. Consulte el registro de servicio para obtener más detalles. Si bien SilkService está configurado para finalizar y limpiar los recopiladores o errores de ETW, es posible que un recopilador obsoleto permanezca registrado después de la finalización del proceso. Para enumerar los recopiladores en ejecución, puede utilizar el siguiente comando.
logman -ets
Si se identifica algún recopilador obsoleto, se puede eliminar emitiendo los siguientes comandos desde un mensaje 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, según el proveedor y el tipo de evento, tendrá datos variables en la tabla hash XmlEventData. A continuación se puede ver 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 salida JSON desde 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 siguiente ejemplo, recopilaremos datos de eventos de proceso del proveedor del 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:Usersb33fDesktopmimikatz.json
Con los datos en la mano, es fácil ordenar, agrupar y filtrar las propiedades que nos interesan.
SilkETW incluye la funcionalidad de Yara para filtrar o etiquetar datos de eventos. Nuevamente, esto tiene capacidades defensivas obvias, pero puede usarse con la misma facilidad para aumentar su investigación ETW.
En este ejemplo usaremos la siguiente regla de Yara para detectar la ejecución del cinturón de seguridad en la memoria a través del ensamblaje de ejecución 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 de .Net ETW con el siguiente comando. ¡La opción "-yo" aquí indica que solo debemos escribir coincidencias de Yara en el disco!
SilkETW.exe -t user -pn Microsoft-Windows-DotNETRuntime -uk 0x2038 -l verbose -y C:Usersb33fDesktopyara -yo matches -ot file -p C:Usersb33fDesktopyara.json
Podemos ver en tiempo de ejecución que nuestra regla de Yara se vio afectada.
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 prediseñada de los lanzamientos.
Para obtener detalles sobre los cambios específicos de la versión, consulte el Registro de cambios.