Wrapper C# pour ETW qui sérialise les données d'événements du noyau et du mode utilisateur en JSON pour la chasse aux menaces, l'analyse de logiciels malveillants et la réponse aux incidents, avec intégration Yara et envoi vers Elasticsearch.
SilkETW & SilkService sont des wrappers C# flexibles pour ETW, conçus pour abstraire les complexités d'ETW et offrir une interface simple pour effectuer des recherches et de l'introspection. Bien que les deux projets aient des applications défensives (et offensives) évidentes, ils doivent avant tout être considérés comme des outils de recherche.
Pour une consommation facile, les données de sortie sont sérialisées en JSON. Les données JSON peuvent être écrites dans un fichier et analysées localement avec PowerShell, stockées dans le journal des événements Windows ou envoyées vers une infrastructure tierce comme Elasticsearch.
Pour plus d'informations sur l'avenir de SilkETW & SilkService, consultez la section Roadmap.
Pour plus de contexte sur SilkETW et SilkService, veuillez consulter les ressources suivantes.
SilkETW est construit sur .Net v4.5 et utilise un certain nombre de bibliothèques tierces, comme indiqué ci-dessous. Veuillez consulter LICENSE-3RD-PARTY pour plus de détails.
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'utilisation en ligne de commande est assez simple et les entrées utilisateur sont validées dans le prologue d'exécution. Voir l'image ci-dessous pour plus de détails.

SilkService a été créé parce qu'un grand nombre de personnes voulaient exécuter SilkETW sans interface et collecter des données ETW pour plusieurs sources simultanément. Bien que cela présente un attrait évident, les points suivants doivent être gardés à l'esprit.
Après avoir compilé ou téléchargé le package de version, vous pouvez installer le service en exécutant la commande suivante à partir d'une invite élevée.
sc create SillkService binPath= "C:\Path\To\SilkService.exe" start= demand
SilkService ingère un fichier de configuration XML, "SilkServiceConfig.xml", qui doit être placé dans le même répertoire que le binaire du service. Un exemple de fichier de configuration est présenté ci-dessous.
<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>
Notez que chaque élément ETWCollector doit avoir un GUID aléatoire, utilisé à des fins de suivi interne et de journalisation. Vous pouvez générer des GUID dans PowerShell à l'aide de la commande suivante :
PS C:\> [guid]::NewGuid()
Guid
----
eee52b87-3f32-4651-b0c3-e7bb9af334aa
Au moment de l'exécution, SilkService crée un sous-dossier "Logs" pour enregistrer les informations d'exécution du service. C'est une ressource inestimable pour interroger l'état du service, vérifier la validation des paramètres du service et examiner les informations d'erreur. SilkService a tendance à s'arrêter proprement s'il rencontre tout type d'erreur, même si cette erreur n'exige pas strictement l'arrêt. Cette décision de conception a été prise délibérément car il n'est pas judicieux d'avoir des collecteurs en suspens ou une opérabilité partielle.
Consultez toujours le journal du service si le service s'arrête de lui-même !
Il est toujours possible que quelque chose se passe mal. Consultez le journal du service pour plus de détails. Bien que SilkService soit configuré pour se terminer et nettoyer les collecteurs ETW en cas d'erreur, il est possible qu'un collecteur obsolète reste enregistré après la fin du processus. Pour lister les collecteurs en cours d'exécution, vous pouvez utiliser la commande suivante.
logman -ets
Si des collecteurs obsolètes sont identifiés, ils peuvent être supprimés en exécutant les commandes suivantes à partir d'une invite élevée.
Get-EtwTraceProvider |Where-Object {$.SessionName -like "SilkService*"} |ForEach-Object {Stop-EtwTraceSession -Name $.SessionName}
Get-EtwTraceProvider |Where-Object {$_.SessionName -like "SilkService*"} |Remove-EtwTraceProvider
La sortie JSON, avant sérialisation, est formatée selon la structure C# suivante.