jeremiah-onyema/windows-detection-research
GitHub: jeremiah-onyema/windows-detection-research
通过实测 Windows 持久化与规避技术,评估 Wazuh 默认检测规则的覆盖盲区,并发布附带原始告警证据的改进检测规则。
Stars: 0 | Forks: 0
# Windows 检测研究
我想弄清楚表象之下究竟发生了什么。不仅仅是攻击是如何生效的,更是为什么生效。Windows 内部究竟做了什么。什么留下了痕迹,什么没有。操作系统设计的初衷是什么,而攻击者又迫使它做了什么。
这个实验室就是我建立这种理解的方式。
我选择一种技术,运行它,并阅读它生成的每一个原始事件。然后检查默认的 SIEM 规则实际捕获到了什么。通常从中会发现一些有趣的东西。
## 让我着迷的发现
“不应该基于工具名称进行检测”这一观点至少在 2019 年就已被提出。关注行为,而不是二进制文件。这并不是什么新鲜事。
因此,我想看看人们如今实际运行的默认规则是否做到了这一点。
我使用 secedit 向 Run 键写入了一个值。Wazuh 的 92302 规则毫无反应。什么都没有触发。
写入成功执行了。我能看到该值存在于注册表中。但执行写入的进程既不是 secedit,也不是 reg.exe。而是以 SYSTEM 身份运行的 services.exe。即 Service Control Manager。secedit 本身并不直接操作注册表;写入是通过 SCM 完成的,因此 secedit 从未作为写入者出现。
规则 92302 只查找 reg.exe。我找到的针对此技术的公开 Sigma 规则也是如此:reg.exe、powershell.exe、regedit.exe。
所以这个观点虽然早已存在,但默认的检测覆盖范围却未能跟上它的步伐。
这件事还有另一面。如果你的团队运行了 EDR,但没有将 Windows 日志转发到 SIEM,那么就根本没有任何机制能捕获到它。services.exe 写入注册表只是 Windows 的常规行为,EDR 没有理由对其进行标记。如果 Sysmon 事件从未到达你的 SIEM,也没有人会看到这次写入。持久化机制就这样悄无声息地潜伏着。
这正是我正在寻找的那种情况。
## 当前覆盖范围
| 技术 | 名称 | 核心发现 |
|-----------|------|-------------|
| T1027 | 混淆的 PowerShell (八进制) | Script Block Logging 捕获了外层代码块,但从未捕获到反混淆后的 payload。这是任何规则都无法弥补的 Windows 限制。 |
| T1053.005 | 计划任务创建 | taskContent 在 Wazuh 中是 HTML 编码的,因此原始正则表达式会失效 |
| T1546.003 | WMI 事件订阅 | consumer 和 filter 绑定可以在 Sysmon 中捕获;默认的 Wazuh 会漏掉它们 |
| T1547.001 | 注册表 Run 键持久化 | secedit 通过 services.exe 写入。基于工具的规则会漏掉它,而仅依赖 EDR 的架构则完全看不见它。 |
| T1547.009 | 启动文件夹持久化 | Olaf Hartong 的 sysmon-modular 将 .lnk 文件标记为 T1187,这是错误的技术 |
| T1071.004 | DNS C2 | dnscat2 使用原始 UDP 绕过了 Windows DNS 客户端,因此 event.dns.request 中没有任何记录 |
更多技术正在测试中。
## 仓库包含内容
- `sigma/` - 规则,按 ATT&CK 战术和技术分组
- `evidence/` - 每条规则生成的实际 Wazuh 告警,从 indexer 中提取并经过脱敏处理,以便你查看触发了什么以及它匹配了哪些字段
- `wazuh-rules/` - 运行这些规则的 local_rules.xml 文件
## 技术栈
Wazuh 4.14.3、Sysmon (Olaf Hartong 配置)、LimaCharlie EDR、Atomic Red Team、Security Onion、Kali Linux、Windows 11、Ubuntu 24.04。
## 关于作者
我是 NinjaOne 的安全工程师。我的工作领域是 DFIR、威胁狩猎和紫队演练,而构建检测正是源于这些工作。
大多数检测侧重于攻击者可以随意更改的攻击部分:工具名称、哈希值、路径。因此,一旦他们重命名了二进制文件,检测就会失效。我则寻找相反的情况。即一种技术中如果不破坏该技术本身就无法更改的那一部分,以及该部分在日志中出现的位置。随你怎么重命名 dnscat2,它仍然必须说明它连接回哪里的地址。无论你怎么称呼 secedit,它仍然通过 services.exe 进行写入。我在实验室中对此进行测试,围绕不可变的部分构建规则,并发布原始证据。
有时,最真实的发现是:你希望捕获到的东西根本没有被记录下来。我也会把这些写下来。
[LinkedIn](https://linkedin.com/in/jeremiahonyema)
标签:DNS 反向解析, Wazuh, 私有化部署, 防御规避