Zeltoc/wazuh-brute-force-detection-lab
GitHub: Zeltoc/wazuh-brute-force-detection-lab
基于Wazuh SIEM的NTLM暴力破解检测实验环境,提供从攻击模拟到自定义规则编写的完整检测链参考与实战规则集。
Stars: 1 | Forks: 0
# Wazuh SIEM 实验环境 - 暴力破解与凭证访问检测
**工具:** Wazuh 4.x, Sysmon (SwiftOnSecurity 配置), NetExec (nxc), Hydra
**平台:** Proxmox 家庭实验室 - Ubuntu 22.04 (Wazuh 管理端), Windows 11 (受监控终端)
**MITRE ATT&CK:** T1110.001, T1550.002, T1531, T1078
## 目标
搭建 SIEM 环境以检测针对 Windows 终端的暴力破解攻击,确认内置检测规则能正确触发,然后编写自定义规则以减少噪音并提高默认设置的准确度。记录从攻击者的首次 NTLM 握手到账户锁定的完整检测链。
## 环境
| VM | OS | 角色 | IP |
|---|---|---|---|
| wazuh-manager | Ubuntu 22.04 | Wazuh 服务器 + 仪表盘 | 192.168.1.x |
| DESKTOP-72VLLG0 | Windows 11 | 受监控终端 (Wazuh agent + Sysmon) | 192.168.1.162 |
| kali | Kali Linux | 攻击者 | 192.168.1.36 |
Windows 虚拟机上使用 [SwiftOnSecurity 配置](https://github.com/SwiftOnSecurity/sysmon-config)部署了 Sysmon。Wazuh agent 配置为同时收集 Security 事件通道和 Sysmon Operational 通道的数据。
## 攻击模拟
### 场景 1 - 通过 SMB 进行 NTLM 暴力破解 (T1110.001)
```
nxc smb 192.168.1.162 -u Administrator -p ~/big-list.txt
```
NetExec 在尝试凭证之前会执行 NTLM 认证握手。这在记录任何失败尝试*之前*表现为一次匿名 NTLM 登录(事件 ID 4624,登录类型 3,目标:ANONYMOUS LOGON)——这一特征本身就是非常有用的检测信号(见下文规则 100004)。
握手完成后,每次密码尝试都会生成一个 4625(登录失败)事件,包含:
- `logonType: 3` - 网络登录,非交互式
- `authenticationPackageName: NTLM`
- `subStatus: 0xc000006a` - 账户存在,密码错误
- `ipAddress: 192.168.1.36` - 攻击者来源
`subStatus` 的区分非常重要。`0xc000006a` 表示账户存在但密码错误。`0xc0000064` 表示账户根本不存在。攻击者利用这一点在发起全面暴力破解之前确认有效的用户名。在真实环境中,如果在密集的失败尝试中持续观察到 `0xc000006a`,说明攻击者已经知道该账户是有效的。
最终该账户被锁定,生成一个 4740 事件。
## 检测结果 - 内置规则
以下 Wazuh 内置规则在没有任何自定义配置的情况下被触发:
| 规则 ID | 级别 | 描述 | 事件 |
|---|---|---|---|
| 60122 | 5 | 登录失败 - 未知用户或密码错误 | 4625(每次尝试) |
| 60204 | 10 | 多次 Windows 登录失败 | 4625 密集爆发(聚合) |
| 60115 | 9 | 用户账户已锁定(多次登录错误) | 4740 |
| 92652 | 6 | 远程登录成功 - ANONYMOUS LOGON,可能是哈希传递攻击 | 4624 (NTLM 握手) |
| 60118 | 3 | Windows 工作站登录成功 | 4624(本地 UAC 提权 - 良性) |
### 意外发现 - 规则 92652
在任何 4625 失败事件出现之前,Wazuh 对来自 `192.168.1.36` 的 ANONYMOUS LOGON 触发了规则 92652。这是 NetExec 正在执行其 NTLM 协商握手。Windows 将其记录为一次成功的匿名登录(4624),Wazuh 正确地将其标记为潜在的哈希传递攻击预备指标。
在真实的 SOC 中,此警报会在暴力破解量警报*之前*触发——根据您的环境,这是一个更早且可能具有更高置信度的信号。来自外部主机的匿名 NTLM 登录在非常特定的遗留配置之外是极不寻常的。
### 发现的误报 - 规则 60118
在 22:05 出现了两次 60118 "Windows 工作站登录成功"事件。审查原始事件数据显示,这些事件来自 `consent.exe`,通过 `::1`(本地主机)用于本地账户——这是机器上的 UAC 提升提示,而非成功的暴力破解。攻击者从未得逞;Administrator 账户在任何密码尝试成功之前就已锁定。
这值得记录,因为它代表了真实的分析师工作:在暴力破解序列中间出现的登录成功警报看起来很惊人,直到您阅读了源 IP 和进程名称。
## 自定义检测规则
内置规则涵盖了基本场景,但存在一些值得解决的盲区:
- **60122** 会对级别为 5 的*任何*失败登录触发 - 设计宽泛,但会因服务账户、本地身份验证失败等产生噪音。
- **60204** 聚合了失败事件,但未限定于特定的攻击特征,如仅限 NTLM 或针对特权账户。
- **92652** 会对*所有*匿名 NTLM 登录触发,包括来自 `::1` 的良性本地主机事件——这在正常 Windows 操作中会频繁产生误报。
下面的自定义规则针对上述每一点进行了收紧。
### 规则文件:`local_rules.xml`
```
60122
(?i)administrator
3
NTLM
NTLM network authentication failure targeting Administrator account from $(win.eventdata.ipAddress)
T1110.001
brute_force,authentication_failed,
100002
CRITICAL: Brute force attack - 5+ NTLM failures against Administrator within 120s [T1110.001]
T1110.001
brute_force,authentication_failed,
92652
^(?!::1$|127\.0\.0\.1$|-).*
NTLM
Anonymous NTLM remote logon from external host $(win.eventdata.ipAddress) - brute force handshake or pass-the-hash staging [T1550.002]
T1110.001
T1550.002
brute_force,authentication_success,pth_staging,
```
## 检测结果 - 自定义规则
| 规则 ID | 级别 | 描述 | 触发情况 |
|---|---|---|---|
| 100004 | 10 | 来自外部主机的匿名 NTLM 握手 | 在失败开始前的首个警报 |
| 100002 | 6 | 来自 192.168.1.36 针对 Administrator 的 NTLM 失败 | 每次尝试 |
| 100003 | 12 | 严重 (CRITICAL) - 120 秒内出现 5 次以上失败 | 触发并在攻击持续期间重新触发 |
规则 100003 在攻击时间窗口内触发了两次,因为频率计数器会重置并在新事件到达时重新触发。在生产环境中,这使得不断升级的警报在持续攻击期间保持活跃,而不是触发一次后就归于平静。
## 完整攻击链时间轴
```
22:20:00.413 100004 (lvl 10) - Anonymous NTLM logon from 192.168.1.36
NetExec NTLM handshake, pre-auth recon
MITRE: T1550.002
22:20:05 100002 (lvl 6) - 4625 failure #1, Administrator, NTLM, logonType 3
22:20:07 100002 (lvl 6) - 4625 failure #2
22:20:09 100002 (lvl 6) - 4625 failure #3
22:20:11 100002 (lvl 6) - 4625 failure #4
22:20:13 100003 (lvl 12) - CRITICAL: 5th failure, frequency threshold hit
MITRE: T1110.001
22:20:15–21 100002 (lvl 6) - Continued failures
22:20:23 100003 (lvl 12) - CRITICAL: re-triggered
60115 (lvl 9) - Account lockout (4740), Administrator
MITRE: T1531
```
## subStatus 参考
4625 事件中的 `subStatus` 字段对分类非常有用,值得了解:
| subStatus | 含义 | 分析师备注 |
|---|---|---|
| `0xc000006a` | 账户存在,密码错误 | 本实验中的所有失败均属此情况 - 确认攻击者正在针对真实账户 |
| `0xc0000064` | 账户不存在 | 用户名枚举,攻击者正在猜测账户 |
| `0xc0000234` | 账户已锁定 | 攻击已触发锁定策略 |
| `0xc0000072` | 账户已禁用 | 账户存在但已被禁用 |
## 经验教训
**匿名登录是最早的信号。** 规则 100004 在任何 4625 事件之前触发。在真实环境中,针对此模式(外部 NTLM 匿名登录)进行调优,能让您在基于数量的规则有时间聚合之前,在暴力破解检测中抢占先机。
**subStatus 提供的信息比警报描述更多。** 内置警报显示“未知用户或密码错误”——而 subStatus 会具体说明是哪一种。这种区别会影响分类优先级,并有助于判断您正在处理的是枚举攻击还是针对性的凭证攻击。
**误报意识很重要。** 暴力破解序列中间出现的 60118 登录成功起初看起来很可疑。通过阅读原始事件数据——`consent.exe`,来源 `::1`,本地账户——立刻澄清了事实。习惯阅读原始事件数据而不仅仅是警报描述,正是区分有价值分类与噪音的关键。
**规则链比单事件检测更有用。** 仅 100002 就会生成大量警报。而以它为基础并带有频率阈值的 100003 才使检测具有可操作性——这就是“有一些失败”和“现在有东西正在主动攻击此账户”之间的区别。
## 仓库结构
```
wazuh-brute-force-detection-lab/
├── README.md
├── alerts/
│ └── wazuh-alerts-4.x-2026.05.06#*.json
├── rules/
│ └── local_rules.xml
└── screenshots/
├── 01-dashboard-overview.png
├── 02-4625-flood-filtered.png
├── 03-full-event-timeline.png
├── 04-attack-chain-closeup.png
└── 05-custom-rules-firing.png
```
## 参考
- [Wazuh 规则语法](https://documentation.wazuh.com/current/user-manual/ruleset/ruleset-xml-syntax/rules.html)
- [SwiftOnSecurity Sysmon 配置](https://github.com/SwiftOnSecurity/sysmon-config)
- [MITRE ATT&CK T1110.001 - 暴力破解:密码猜测](https://attack.mitre.org/techniques/T1110/001/)
- [MITRE ATT&CK T1550.002 - 哈希传递攻击](https://attack.mitre.org/techniques/T1550/002/)
- [Windows 安全事件 ID 参考 - Ultimate Windows Security](https://www.ultimatewindowssecurity.com/securitylog/encyclopedia/)
标签:AMSI绕过, Cloudflare, Conpot, Hydra, MITRE ATT&CK, NetExec, NTLM暴力破解, Proxmox家庭实验室, SMB协议, Sysmon, Wazuh SIEM, Windows安全, 事件日志分析, 凭证获取, 威胁检测, 安全实验, 安全运营, 扫描框架, 攻击模拟, 攻击溯源, 日志降噪, 网络认证, 自定义检测规则, 蓝队建设, 驱动签名利用, 高保真检测