ishehzadanwar/detection-engineering-lab
GitHub: ishehzadanwar/detection-engineering-lab
一个基于 Wazuh + Sigma + Atomic Red Team 的检测工程实践项目,演示如何从攻击模拟中提炼、编写并调优可用的 SIEM 检测规则。
Stars: 0 | Forks: 0





**模拟真实的攻击者技术,然后编写、部署、测试并调优能够捕获这些攻击的检测规则。**
## 📌 概述
阅读告警是一项技能。*编写*告警才是助你获得工作的关键。在这个项目中,我
挑选了三种 MITRE ATT&CK 技术,使用 **Atomic Red Team** 在我的实验室中分别执行了它们,研究了
遥测数据,然后编写了 **Sigma** 规则并将它们转换为原生的 **Wazuh** 规则 —— 让每一条规则都经历了
完整的 编写 → 测试 → 调优 循环。它直接建立在我的
[使用 Wazuh 搭建家庭 SOC](https://github.com/ishehzadanwar/home-soc-wazuh) 实验室基础之上。
| | |
|---|---|
| **实验室** | Wazuh 4.14.6 SIEM · Windows 11 endpoint · Sysmon (SwiftOnSecurity) · VMware,隔离网络 |
| **模拟** | Atomic Red Team (`Invoke-AtomicRedTeam`) |
| **检测** | 3 条自定义 Wazuh 规则 + 可移植的 Sigma 等效规则 |
| **故事线** | 执行 → 持久化 → 凭据访问 |
## 🔁 方法论
对于每一项技术:运行攻击,寻找它产生的事件,编写一条针对能够区分恶意与正常行为的字段的规则,
部署它,重新运行以确认它被触发,然后生成正常活动并调整以排除误报。
## 🎯 检测覆盖范围
| # | 技术 | ATT&CK | 规则 | 级别 | 数据源 | 详细说明 |
|---|-----------|--------|------|:-----:|-------------|----------|
| 1 | PowerShell — 编码命令 | [T1059.001](https://attack.mitre.org/techniques/T1059/001/) | `100100` | 🔴 12 | Sysmon EID 1 | [→](writeups/t1059_001_powershell_encoded.md) |
| 2 | 计划任务 — 持久化 | [T1053.005](https://attack.mitre.org/techniques/T1053/005/) | `100101` | 🔴 12 | Sysmon EID 1 | [→](writeups/t1053_005_scheduled_task.md) |
| 3 | LSASS 凭据转储 | [T1003.001](https://attack.mitre.org/techniques/T1003/001/) | `100102` | 🔴 14 | Sysmon EID 1 | [→](writeups/t1003_001_lsass_dumping.md) |
包含调优记录和客观缺口的完整矩阵:[`coverage/coverage-matrix.md`](coverage/coverage-matrix.md)。
## 🧪 技术 1 — PowerShell 编码命令 (T1059.001)
攻击者使用 base64 编码的 PowerShell 来隐藏 payload。我发现的坑是:PowerShell 接受
该 flag 的**任何缩写** —— `-e`、`-en`、`-enc`、`-EncodedCommand` —— 而 Wazuh 的内置
规则只在父进程是 WMI 时才会触发。我的规则可以**不论父进程为何**捕获编码的 PowerShell,并匹配每种 flag 变体。

关键正则表达式:`(?i)\s[-/]e[a-z]*\s+[A-Za-z0-9+/=]{20,}` —— 尾部的 base64 长度要求是
防止 `-ExecutionPolicy` 触发大量误报的关键。 → [完整说明](writeups/t1059_001_powershell_encoded.md)
## 🧪 技术 2 — 计划任务持久化 (T1053.005)
攻击者会创建计划任务,以便他们的代码能在重启后继续运行。使用 `schtasks /create` 进行模拟;
内置的规则集只发出了一个 **level-3** 告警。**这条规则是我自己编写的** —— 阅读事件、
形成假设、并填写字段。

检测逻辑:命令行中出现 `schtasks.exe` + `[/-]create\b` → level 12。
→ [完整说明](writeups/t1053_005_scheduled_task.md)
## 🧪 技术 3 — LSASS 凭据转储 (T1003.001)
这是最难的一个,也是最贴近现实的一个。转储 `lsass.exe` 会窃取内存中的所有凭据。
必须解决三个现实障碍 —— 而这些故障排除过程*本身*就是经验所在:
**Defender 在测试中途自动重新启用**(防篡改保护 Tamper Protection)并阻止了攻击:

**遥测数据未被收集。** Sysmon 的 ProcessAccess (Event ID 10) 默认是关闭的 ——
配置文件里字面意思是这么写的。我通过一行修改启用了它,并重新加载了 Sysmon:

**LSA Protection 阻止了转储** (`RunAsPPL = 2`) —— 这是一个真实的防御控制措施 —— 但*尝试*行为
仍然被记录了下来。在归咎于处理流水线之前,先在数据源头进行了验证:

最终的检测在 level 14 触发,目标指向 `comsvcs.dll MiniDump` 命令行 —— 这是最可靠的信号:

→ [完整说明,包含所有这三个障碍](writeups/t1003_001_lsass_dumping.md)
## 🎓 我学到了什么
- **SIEM 是一个关联引擎,它只会展示符合规则的内容。** 没有规则的原始事件是
不可见的 —— 编写规则才能让数据显现出来。
- **如果你不收集数据,你就无法检测。** 检测工程的一半工作是在任何规则生效之前,先
开启正确的遥测数据(Script Block Logging,Sysmon ProcessAccess)。
- **精准度是全部的核心。** 每一条规则都需要第二个条件来避免误报 ——
一个 base64 数据块、一个单词边界、一个特定的 DLL。一条嘈杂的规则在第一天就会被静音。
- **阅读错误信息,而不是凭感觉。** 我遇到的 bug —— 重复的规则、一个事件匹配多条规则、Defender
重新启用、转储被阻止 —— 都是靠阅读日志和检查源头来解决的。
## 🚀 下一步的改进计划
- 既然现在已经启用了 ProcessAccess,可以编写一条 Sysmon **Event ID 10** 规则,用于与工具无关的 LSASS
检测(不仅能捕获 comsvcs,还能捕获 Mimikatz)。
- 构建一个 **ATT&CK Navigator** 图层来可视化覆盖范围。
- 自动化整个循环:编写一个脚本来运行每个 atomic 并断言告警是否触发(迷你版的检测 CI)。
- 为相同的技术添加 Linux (`auditd`) 检测。
## 📂 仓库结构
```
detection-engineering-lab/
├── README.md
├── docs/ banner + loop diagram
├── rules/
│ ├── sigma/ portable Sigma rules (3)
│ └── wazuh/ native Wazuh rules deployed to the manager (3)
├── tests/
│ └── atomics-used.md exact Atomic Red Team tests + lab conditions
├── evidence/
│ └── screenshots/ alert-fired proof for every technique
├── coverage/
│ └── coverage-matrix.md technique → rule → data source → tested → FP notes
└── writeups/ full write→test→tune loop, one per technique
```
## ⚠️ 实验室与安全提示
Atomic Red Team 仅在隔离的实验室虚拟机中运行(Host-Only 网络,断开家庭局域网连接),并且
运行自干净的快照。Microsoft Defender 作为已记录在案的实验室条件被禁用,以便这些技术
能够生成遥测数据。这里的内容均不针对任何真实或生产系统。
**保持好奇,保持安全**
标签:ATT&CK评估, Wazuh, 安全运营, 扫描框架, 检测规则, 红队模拟, 网络资产发现