mandiant/SilkETW
GitHub: mandiant/SilkETW
Mandiant 开源的 C# ETW 封装工具,将 Windows ETW 事件采集与 Yara 扫描整合为简单的命令行和服务接口,以 JSON 格式输出数据,服务于安全研究和威胁狩猎。
Stars: 843 | Forks: 137
# SilkETW & SilkService
SilkETW & SilkService 是灵活的 C# ETW 包装器,旨在将 ETW 的复杂性抽象化,为人们提供一个简单的界面来进行研究和内省。虽然这两个项目都有明显的防御(和攻击)应用,但它们主要应被视为研究工具。
为了方便使用,输出数据被序列化为 JSON。这些 JSON 数据可以写入文件并使用 PowerShell 在本地进行分析,可以存储在 Windows 事件日志中,也可以发送到如 [Elasticsearch](https://www.elastic.co/) 这样的第三方基础设施。
有关 SilkETW & SilkService 未来的更多信息,请参阅 [路线图](#roadmap) 部分。
## 媒体报道
有关 SilkETW 和 SilkService 的更多背景信息,请查阅以下资源。
* SilkETW: Because Free Telemetry is … Free! - [链接](https://www.fireeye.com/blog/threat-research/2019/03/silketw-because-free-telemetry-is-free.html)
* SilkETW & SilkService BlackHat Arsenal 2019 - [链接](https://github.com/FuzzySecurity/BH-Arsenal-2019)
* 使用 ETW 事件和 HELK 进行威胁狩猎 — 第 1 部分:安装 SilkETW (作者 [@Cyb3rWard0g](https://twitter.com/Cyb3rWard0g)) - [链接](https://medium.com/threat-hunters-forge/threat-hunting-with-etw-events-and-helk-part-1-installing-silketw-6eb74815e4a0)
* 使用 ETW 事件和 HELK 进行威胁狩猎 — 第 2 部分:将 ETW 事件发送至 HELK (作者 [@Cyb3rWard0g](https://twitter.com/Cyb3rWard0g)) - [链接](https://medium.com/threat-hunters-forge/threat-hunting-with-etw-events-and-helk-part-2-shipping-etw-events-to-helk-16837116d2f5)
* Windows 10 各版本中所有基于 manifest 和基于 mof 的 ETW 提供程序的事件 (作者 [@jdu2600](https://twitter.com/jdu2600)) - [链接](https://github.com/jdu2600/Windows10EtwEvents)
* 使用 SilkETW 和 Yara 搜索可疑的 LDAP 活动 - [链接](https://riccardoancarani.github.io/2019-10-19-hunting-for-domain-enumeration/)
## 实现细节
### 库
SilkETW 基于 .Net v4.5 构建,并使用了大量第三方库,如下所示。有关更多详细信息,请参阅 [LICENSE-3RD-PARTY](LICENSE-3RD-PARTY.txt)。
```
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
```
## SilkETW
### 命令行选项
命令行用法非常直接,用户输入会在执行序言阶段进行验证。有关更多详细信息,请参见下图。

## SilkService
### 注意事项
SilkService 的创建是因为很多人希望以无头模式运行 SilkETW,并同时执行多个来源的 ETW 收集。虽然这显然很有吸引力,但应牢记以下几点。
* SilkETW & SilkService 由一人组成的工程团队 ([@FuzzySec](https://twitter.com/fuzzysec)) 创建,它们没有庞大的开发部门作为后盾,因此可能包含 bug。如果您确实遇到 bug 或发现了改进这些项目的方法,我们强烈建议您提交工单和/或提交 pull request。
* ETW 收集可能会消耗大量资源。如果没有进行彻底的性能测试,请不要在大量主机上广泛部署 SilkService。请确保该配置能够在您性能最低的机器上稳定运行。
### 安装
编译或下载发布包后,您可以在具有管理员权限的命令行提示符中执行以下命令来安装该服务。
```
sc create SillkService binPath= "C:\Path\To\SilkService.exe" start= demand
```
### 配置
SilkService 会读取 XML 配置文件 "SilkServiceConfig.xml",该文件应与服务二进制文件放在同一目录中。下面是一个配置文件示例。
```
45c82358-c52d-4892-8237-ba001d396fb4
user
e13c0d23-ccbc-4e12-931b-d9cc2eee27e4
0x2038
url
https://some.elk:9200/NetETW/_doc/
6720babc-dedc-4906-86b9-d0bc0089ec50
user
Microsoft-Windows-DNS-Client
eventlog
C:\Some\Path\RuleFolder
Matches
21ac2393-3bbb-4702-a01c-b593e21913dc
kernel
Process
file
C:\Users\b33f\Desktop\kproc.json
```
请注意,每个 ETWCollector 元素都应具有一个随机的 GUID,这用于内部跟踪和记录日志。您可以在 PowerShell 中使用以下命令生成 GUID:
```
PS C:\> [guid]::NewGuid()
Guid
----
eee52b87-3f32-4651-b0c3-e7bb9af334aa
```
### 审计
在运行时,SilkService 将创建一个 "Logs" 子文件夹来记录服务运行时信息。这对于轮询服务状态、验证服务参数验证和查看错误信息来说是非常宝贵的资源。如果遇到任何类型的错误,即使这种错误并不严格要求终止,SilkService 也会倾向于优雅地关闭。这个设计决定是有意为之,因为让收集器挂起或处于部分可运行状态并不是一个合理的策略。
**如果服务自行关闭,请务必查阅服务日志!**
### 出现问题了?
出现问题总是有可能的。请查阅服务日志以获取更多详细信息。虽然 SilkService 被配置为在出错时终止并清理 ETW 收集器,但在进程终止后仍可能残留已注册的过期收集器。您可以使用以下命令列出正在运行的收集器。
```
logman -ets
```
如果发现任何过期的收集器,可以在具有管理员权限的命令行提示符下执行以下命令将其删除。
```
Get-EtwTraceProvider |Where-Object {$.SessionName -like "SilkService*"} |ForEach-Object {Stop-EtwTraceSession -Name $.SessionName}
Get-EtwTraceProvider |Where-Object {$_.SessionName -like "SilkService*"} |Remove-EtwTraceProvider
```
## 输出格式
### JSON 输出结构
JSON 输出在序列化之前,会根据以下 C# struct 进行格式化。
```
public struct EventRecordStruct
{
public Guid ProviderGuid;
public List 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;
}
```
请注意,根据提供程序和事件类型的不同,XmlEventData hash table 中的数据会有所不同。下面是 "Microsoft-Windows-Kernel-Process" -> "ThreadStop/Stop" 的 JSON 输出示例。
```
{
"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"
}
}
```
## 收集后处理
### 在 PowerShell 中过滤数据
您可以使用以下简单的函数在 PowerShell 中导入来自 SilkETW 的 JSON 输出。
```
function Get-SilkData {
param($Path)
$JSONObject = @()
Get-Content $Path | ForEach-Object {
$JSONObject += $_ | ConvertFrom-Json
}
$JSONObject
}
```
在下面的示例中,我们将从 Kernel 提供程序收集进程事件数据,并使用镜像加载来识别 Mimikatz 的执行。我们可以使用以下命令收集所需的数据。
```
SilkETW.exe -t kernel -kk ImageLoad -ot file -p C:\Users\b33f\Desktop\mimikatz.json
```
有了数据后,就可以轻松地对我们感兴趣的属性进行排序、grep 和过滤。

### Yara
SilkETW 包含 Yara 功能,可用于过滤或标记事件数据。同样,这具有明显的防御能力,但它同样可以轻松地用于增强您的 ETW 研究。
在此示例中,我们将使用以下 Yara 规则来检测通过 Cobalt Strike 的 execute-assembly 在内存中执行的 Seatbelt。
```
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*)
}
```
我们可以使用以下命令开始收集 .Net ETW 数据。此处的 "-yo" 选项表示我们应仅将 Yara 匹配项写入磁盘!
```
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
```
我们可以在运行时看到我们的 Yara 规则命中了。

还需注意的是,我们只捕获了 "Microsoft-Windows-DotNETRuntime" 事件 (0x2038) 的一个子集,具体包括:JitKeyword、InteropKeyword、LoaderKeyword 和 NGenKeyword。
## 如何获取 SilkETW & SilkService?
您可以下载源代码并在 Visual Studio 中进行编译。请注意,您可以免费获取 Visual Studio 的社区版。或者,您也可以从 [releases](https://github.com/fireeye/SilkETW/releases) 获取最新的预编译版本。
## 后续工作
### 更新日志
有关特定版本的更改详细信息,请参阅 [更新日志](Changelog.txt)。
### 路线图
* 为用户提供将 trace 数据写入磁盘作为 *.etl 文件的选项。
* ~~为用户提供将 trace 数据写入 Windows 事件日志的选项。~~ **(v0.5+)**
* ~~为用户提供预编译的 release 版本。~~ **(v0.6+)**
* ~~创建一个单独的实例,该实例可以作为带有配置文件的服务进行部署。~~ **(v0.7+)**
* 欢迎提出建议!
标签:AI合规, ETW, 子域名变形, 日志收集