
Wrapper em C# para ETW que serializa dados de eventos do kernel e modo de usuário para JSON para caça a ameaças, análise de malware e resposta a incidentes, com integração Yara e envio para Elasticsearch.
SilkETW & SilkService são wrappers flexíveis em C# para ETW, criados para abstrair as complexidades do ETW e fornecer uma interface simples para pesquisa e introspecção. Embora ambos os projetos tenham aplicações defensivas (e ofensivas) óbvias, devem ser considerados principalmente como ferramentas de pesquisa.
Para facilitar o consumo, os dados de saída são serializados em JSON. Os dados JSON podem ser gravados em arquivo e analisados localmente usando PowerShell, armazenados no log de eventos do Windows ou enviados para infraestrutura de terceiros, como Elasticsearch.
Para mais informações sobre o futuro do SilkETW & SilkService, consulte a seção Roadmap.
Para mais contexto sobre o SilkETW e o SilkService, consulte os seguintes recursos.
SilkETW é construído em .Net v4.5 e utiliza várias bibliotecas de terceiros, conforme mostrado abaixo. Consulte LICENSE-3RD-PARTY para mais detalhes.
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
O uso da linha de comando é bastante direto e a entrada do usuário é validada no prólogo de execução. Veja a imagem abaixo para mais detalhes.

O SilkService foi criado porque muitas pessoas queriam executar o SilkETW sem interface gráfica e realizar a coleta de ETW de várias fontes simultaneamente. Embora isso tenha um apelo óbvio, os seguintes pontos devem ser considerados.
Após compilar ou baixar o pacote de release, você pode instalar o serviço emitindo o seguinte comando de um prompt elevado.
sc create SillkService binPath= "C:\Path\To\SilkService.exe" start= demand
SilkService ingere um arquivo de configuração XML, "SilkServiceConfig.xml", que deve ser colocado no mesmo diretório do binário do serviço. Um exemplo de arquivo de configuração pode ser visto abaixo.
<SilkServiceConfig>
<!--
Este é um coletor de usuário
-> Microsoft-Windows-DotNETRuntime
-> Nome baseado em GUID ou string
-->
<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>
<!--
Este é um coletor de usuário
-->
<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>
<!--
Este é um coletor de kernel
-->
<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>
Observe que cada elemento ETWCollector deve ter um GUID aleatório, usado para rastreamento interno e fins de registro. Você pode gerar GUIDs no PowerShell usando o seguinte comando:
PS C:\> [guid]::NewGuid()
Guid
----
eee52b87-3f32-4651-b0c3-e7bb9af334aa
Em tempo de execução, o SilkService criará uma subpasta "Logs" para registrar informações de tempo de execução do serviço. Este é um recurso inestimável para consultar o estado do serviço, verificar a validação dos parâmetros do serviço e revisar informações de erro. O SilkService prefere desligar-se graciosamente se encontrar qualquer tipo de erro, mesmo que tal erro não exija estritamente a interrupção. Essa decisão de design foi tomada propositalmente, pois não é uma estratégia sólida ter coletores pendentes ou operacionalidade parcial.
Consulte sempre o log do serviço se o serviço desligar sozinho!
É sempre possível que algo dê errado. Consulte o log do serviço para mais detalhes. Embora o SilkService seja configurado para encerrar e limpar coletores ETW em caso de erro, é possível que um coletor obsoleto permaneça registrado após o término do processo. Para listar os coletores em execução, você pode usar o seguinte comando.
logman -ets
Se algum coletor obsoleto for identificado, eles podem ser removidos emitindo os seguintes comandos de um prompt elevado.
Get-EtwTraceProvider |Where-Object {$.SessionName -like "SilkService*"} |ForEach-Object {Stop-EtwTraceSession -Name $.SessionName}
Get-EtwTraceProvider |Where-Object {$_.SessionName -like "SilkService*"} |Remove-EtwTraceProvider
A saída JSON, antes da serialização, é formatada de acordo com a seguinte struct C#.