SorinTolbaru/wazuh-ad-detection-lab
GitHub: SorinTolbaru/wazuh-ad-detection-lab
一个用于端到端验证 Wazuh SIEM 自定义检测规则的隔离 Active Directory 紫队实验室,通过模拟真实攻击链来驱动检测工程。
Stars: 0 | Forks: 0
# 迷你 SOC 家庭实验室 - 使用 Wazuh 进行 AD 攻击链检测
   
一个完全隔离的 Active Directory 实验室,旨在端到端地**检测真实的攻击链**,从恶意的 Office 宏到 Kerberoasting 和 SMB 数据窃取。其攻击方的存在仅仅是为了验证防御方:每一个攻击者行为都被映射到一条**自定义的 Wazuh 检测规则**,并根据真实的遥测数据进行调优,且经过了实时确认。
本项目作为我硕士论文《*用于安全事件收集与关联的 SIEM 平台*》(网络安全专业,ULBS 锡比乌分校)的实践核心部分而构建。
## 目录
- [演示内容](#what-this-demonstrates)
- [架构](#architecture)
- [威胁场景 - 攻击链](#threat-scenario---the-attack-chain)
- [检测工程](#detection-engineering)
- [响应剧本](#response-playbooks)
- [加固与审计策略 (GPO)](#hardening--audit-policy-gpo)
- [网络安全 - pfSense 最小权限](#network-security---pfsense-least-privilege)
- [告警](#alerting)
- [验证与可复现性](#validation--reproducibility)
- [未来工作](#future-work)
- [文档](#documentation)
## 演示内容
- **检测工程** - 根据真实的事件遥测数据编写、调优和验证 SIEM 规则,而不是照搬博客上的特征码。
- **MITRE ATT&CK 映射** - 每条规则都与特定的技术和具体的 Windows/Sysmon Event ID 相关联。
- **Windows / AD 安全** - 高级审核策略、PowerShell Script Block Logging、Sysmon、Kerberos 内部原理。
- **网络分段** - 具有显式默认拒绝的最小权限防火墙设计。
- **紫队验证** - 每个检测都可以按需复现,便于实时演示。
**技术栈:** Wazuh 4.14、Sysmon、pfSense 2.7.2、Windows Server 2022 (AD/DNS)、Windows 11、Ubuntu Server、Slack 告警、VirtualBox
## 架构
pfSense 后端的三个隔离网段,其中 SOC 网络与企业网络分离,因此代理以单向方式推送遥测数据,并且分析师永远不会与他们监控的资产处于同一个广播域中。

| 主机 | IP | 网段 | 角色 | 遥测数据 |
|------|----|---------|------|-----------|
| DC-01 | 10.10.10.10 | CORP | 域控制器、DNS (`aztek.com`) | Wazuh 代理,`domain-controllers` 组 |
| HR-CLIENT01 | 10.10.10.11 | CORP | 工作站 - 初始立足点 | Wazuh 代理,`windows-workstations` 组,通过 `agent.conf` 配置 Sysmon + PowerShell |
| SOC-CLIENT01 | 10.10.20.x | SOC | 分析师工作站 - 通过 Web 访问 Wazuh + pfSense | 无(无需监控;按设计不在范围内) |
| SIEM | 10.10.20.11 | SOC | Wazuh 4.14 管理器 | - |
**Active Directory:** 域 `aztek.com`;OUs `HR / PAYROLL / SOC`;可被 Kerberoasting 的服务账号 `svc-payroll`(SPN `HTTP/payroll.aztek.com`);通过 AGDLP 组(`Payroll-Access`)授予对 `\\DC-01\Payroll\salaries.xlsx` 的访问权限。

## 威胁场景 - 攻击链
一个模拟工资单数据窃取的六阶段入侵,纯粹用于生成触发检测的遥测数据。完整的分步演练位于 [`docs/guide/Mini-SOC-Home-Lab_Guide`](docs/guide/Mini-SOC-Home-Lab_Guide.pdf) 中;下方的截图展示了关键时刻。
| # | 阶段 | 技术 (MITRE ATT&CK) |
|---|-------|--------------------------|
| 1 | 恶意的 Word 宏 -> 通过 443 端口的 Meterpreter C2 | T1566.001, T1204.002, T1059.001 |
| 2 | PowerView 域侦察 (`Get-DomainUser`, `Get-NetShare`, `Get-NetUser -SPN`) | T1087.002, T1069.002, T1135 |
| 3 | 使用 Rubeus 对 `svc-payroll` 进行 Kerberoasting(RC4 票据) | T1558.003 |
| 4 | 使用 Hashcat 进行离线哈希破解 | T1110.002 |
| 5 | 使用破解的凭据进行 SMB 横向移动 (`net use`) | T1078.002, T1021.002 |
| 6 | 从网络共享中窃取 `salaries.xlsx` | T1039 |
**阶段 1 - 建立 Meterpreter 会话,随后迁移到稳定的宿主进程:**

**阶段 2 - PowerView 侦察发现 SPN (`svc-payroll`) 和 Payroll 共享:**



**阶段 3 - Rubeus 请求 RC4 服务票据并写入哈希:**

**阶段 4 - Hashcat 离线破解服务账号密码:**

**阶段 5-6 - 通过认证的 SMB 访问共享并窃取 `salaries.xlsx`:**

## 检测工程
在 `/var/ossec/etc/rules/local_rules.xml` 中的四条自定义 Wazuh 规则,均为 **level 12**。每一条都是根据 Wazuh Discover 中捕获的真实事件构建的:`full_log` -> `wazuh-logtest` -> 规则 -> 实时测试。这四条规则均已验证可实时触发,并可根据需要复现。
### 检测覆盖率
每个攻击阶段都映射到其对应的遥测数据、规则和告警。检测缺口已被特意标记出来。

| 规则 | ID | 触发条件 | 检测阶段 | MITRE |
|------|----|----------|---------------|-------|
| **R1** | 100100 | Sysmon **EID 1** - `parentImage` = WINWORD/EXCEL/POWERPNT 派生 `cmd`/`powershell`/`wscript` | 1 - 宏执行 | T1566.001, T1059.001 |
| **R2** | 100200 | PowerShell **EID 4104** - `scriptBlockText` 匹配到 PowerView cmdlet (PCRE2) | 2 - 侦察 | T1059.001, T1087.002 |
| **R3** | 100300 | Kerberos **EID 4769** - `serviceName=svc-payroll`, `ticketEncryptionType=0x17`, `status=0x0` | 3 - Kerberoasting | T1558.003 |
| **R4** | 100400 | 登录 **EID 4624** - `targetUserName=svc-payroll`, `logonType=3` | 5 - SMB 横向移动 | T1021.002, T1078.002 |




**覆盖率与缺口(按设计):**
- **阶段 4(离线破解)** 不产生主机遥测数据 - 这是一个故意的检测缺口。防御对策是*预防*,在此通过密码策略(最少 14 个字符)来强制执行,这增加了破解截获的 RC4 哈希的成本。
- **阶段 6(数据窃取)** 目前是通过 R4(SMB 会话)推断出来的。文件级的 FIM / 出口监控已列为未来的工作。
### 规则说明
- **R1** 依赖于父子进程关系,而不是 payload 特征码,因此它能捕获任何由 Office 派生的解释器,而不受特定宏的影响。
- **R2** 依赖于通过 GPO 启用的 Script Block Logging (EID 4104),并通过 PCRE2 匹配 cmdlet 名称 - 能够抵御普通字符串匹配会漏掉的变量/空格混淆。
- **R3** 是价值最高的检测:对服务账号发起的 RC4 (`0x17`) 服务票据请求是极强的 Kerberoasting 信号 - 这是整条链中保真度最高的环节。
- **R4** 检测的是*新登录会话的建立*,而不是单次文件访问 - 在现有的交互式会话中重新进行身份验证会重用该 SMB 会话,并且理应**不会**再次触发规则。需要全新的登录会话才能再次触发。
## 响应剧本
每个检测都有完整的 SOC 响应剧本 - 分流、调查、遏制、补救和 IOCs:
| 剧本 | 涵盖范围 |
|----------|--------|
| [R1 - Office 宏](docs/playbooks/R1-office-macro.md) | Office 派生命令解释器(初始访问) |
| [R2 - PowerView 侦察](docs/playbooks/R2-powerview-recon.md) | 通过 PowerShell 进行域枚举 |
| [R3 - Kerberoasting](docs/playbooks/R3-kerberoasting.md) | 针对 `svc-payroll` 的 RC4 服务票据请求 |
| [R4 - 横向移动](docs/playbooks/R4-lateral-movement.md) | 服务账号网络登录 / SMB 访问 |
## 加固与审计策略 (GPO)
三个自定义的 GPO 使得上述遥测数据得以生成:
- **SOC - DC 审计策略** (Domain Controllers OU) - Kerberos 服务票据操作 -> 成功;审核登录 -> 成功。加上用于 Kerberos 身份验证服务 + 凭据验证的 `auditpol` -> 成功/失败。
- **SOC - PowerShell 日志记录** (HR OU) - Script Block Logging + 模块日志记录 -> 已启用 (EID 4104)。
- **SOC - 账号策略** (域根) - 密码历史记录 24,最长使用期限 90 天,最短长度 14,开启复杂度要求;5 次尝试后锁定,持续/重置时间为 15 分钟。
## 网络安全 - pfSense 最小权限
每个网段的显式允许规则,并以默认拒绝结尾。禁止全部放通。
**防火墙别名**
主机:`DC_01 = 10.10.10.10`,`WAZUH = 10.10.20.11`
端口:`AD_PORTS = 53, 88, 389, 445, 636` | `WAZUH_PORTS = 1514, 1515` | `WEB_PORTS = 80, 443`
**CORP (em1)**
| # | 动作 | 协议 | 源地址 | 目标地址 | 端口 | 描述 |
|---|--------|----------|--------|-------------|------|-------------|
| 1 | Pass | UDP | CORP 子网 | any | 53 | DNS |
| 2 | Pass | TCP/UDP | CORP 子网 | DC_01 | AD_PORTS | AD: DNS, Kerberos, LDAP, SMB, LDAPS |
| 3 | Pass | TCP | CORP 子网 | WAZUH | WAZUH_PORTS | 代理 -> Wazuh |
| 4 | Pass | UDP | CORP 子 | 10.10.10.1 | 123 | NTP |
| 5 | Pass | TCP | CORP 子网 | any | WEB_PORTS | 互联网 |
| 6 | Block | TCP | CORP 子网 | WAZUH | 443 | 阻断 Wazuh Dashboard |
| 7 | Block | * | CORP 子网 | * | * | 默认拒绝 |
**SOC (em2)**
| # | 动作 | 协议 | 源地址 | 目标地址 | 端口 | 描述 |
|---|--------|----------|--------|-------------|------|-------------|
| 1 | Pass | UDP | SOC 子网 | any | 53 | DNS |
| 2 | Pass | TCP | SOC 子网 | any | WEB_PORTS | Slack,更新 |
| 3 | Pass | UDP | SOC 子网 | 10.10.20.1 | 123 | NTP |
| 4 | Block | * | SOC 子网 | * | * | 默认拒绝 |
NTP 集中在 pfSense 上,以确保事件时间戳在各主机之间保持关联。
## 告警
在 `ossec.conf` 中集成了 Slack webhook(`level >= 12`)。所有四个检测均已确认能发送告警至 SOC 频道。




## 验证与可复现性
每条规则都经过实时验证,并可根据需要重新触发 - 非常适合用于演练或面试演示:
| 规则 | 重新触发方式 |
|------|-----------|
| R1 | 打开宏文档 + Meterpreter `migrate` |
| R2 | 加载 PowerView + `Get-DomainUser` |
| R3 | `klist purge`,然后请求服务票据(purge 会强制生成新的 4769) |
| R4 | 新的 HR 登录会话(注销/登录或 `runas`),然后执行 `net use` |
## 未来工作
这是一个功能完备的 v1 版本。按优先级排序的后续计划迭代:
- 在 Payroll 共享上进行 **文件完整性监控 (FIM)**,以直接填补阶段 6 的数据窃取缺口,而不是从 R4 中推断。
- **工单系统集成** (TheHive / Jira),使得 level-12 告警能够自动创建案例 - 模拟真实的 SOC 分流流程。
- **出口 / 网络检测**(在 pfSense 上运行 Suricata),在网络层捕获 C2 beaconing,作为主机遥测的补充。
- **检测即代码** - 使用 CI 检查(在 pipeline 中运行 `wazuh-logtest`)对规则进行版本控制,以便在部署前验证每一次规则更改。
## 文档
完整的分步构建文档位于 `/docs/guide` 中。README 是概述;这些是具体步骤。
[完整的分步指南](docs/guide/Mini-SOC-Home-Lab_Guide.pdf)
## 作者
**Tolbaru Constantin Sorin** - 网络安全硕士,ULBS 锡比乌分校,CompTIA Security+
求职目标为初级 SOC / 安全分析师岗位。
标签:Active Directory, AI合规, PE 加载器, Plaso, Wazuh, 搜索语句(dork), 模拟器, 紫队