na8877waf-cmd/Wazuh-SOC-Detection-Lab
GitHub: na8877waf-cmd/Wazuh-SOC-Detection-Lab
基于 Wazuh SIEM 构建的家庭 SOC 实验室,通过自定义 MITRE ATT&CK 映射规则检测暴力破解和 Web 扫描攻击,提供完整的部署与验证方案。
Stars: 0 | Forks: 0
# Wazuh SOC 检测实验室
一个基于虚拟机构建的家庭安全运营中心 (SOC) 实验室。它部署了一个单节点
**Wazuh** SIEM,接入两个实时日志源(Linux 身份验证日志和 Apache Web 服务器
日志),并使用**映射到 MITRE ATT&CK 的自定义检测规则**来对攻击者行为发出告警 ——
每条规则均通过安全模拟攻击并确认触发了告警来进行验证。
## 架构
```
NAT Network (internet + VM-to-VM communication)
┌──────────────────────────────────────────────────────────────┐
│ │
│ ┌───────────────────────────┐ │
│ │ Ubuntu (10.0.2.15) │ WAZUH SERVER (SIEM) │
│ │ Wazuh manager │ - manager + indexer + │
│ │ Wazuh indexer │ dashboard (single node) │
│ │ Wazuh dashboard │ - receives agent logs │
│ └─────────────▲─────────────┘ on ports 1514 / 1515 │
│ │ agent reports up │
│ ┌─────────────┴─────────────┐ │
│ │ Kali Linux │ MONITORED ENDPOINT │
│ │ Wazuh agent │ - /var/log/auth.log (auth) │
│ │ rsyslog │ - /var/log/syslog │
│ │ Apache2 │ - Apache access/error logs │
│ └───────────────────────────┘ │
└──────────────────────────────────────────────────────────────┘
```
| 虚拟机 | 角色 | 组件 |
|--------|------------------|-------------------------------------------------------|
| Ubuntu | Wazuh **服务器** | Wazuh manager, indexer, dashboard (all-in-one) |
| Kali | 终端 + Web | Wazuh agent, rsyslog, Apache2 (auth + web 日志源) |
**Hypervisor:** Oracle VirtualBox · **网络:** NAT Network (确保所有虚拟机都能接入互联网 *并且*
可以相互访问)。
## 技术栈
- **Wazuh 4.14** — 开源 SIEM / XDR (manager, indexer, dashboard)
- **rsyslog** — 生成 `/var/log/auth.log` 和 `/var/log/syslog` 用于日志收集
- **Apache2** — 提供 access/error 日志的 Web 服务器
- **MITRE ATT&CK** — 检测到技术的映射
- **VirtualBox** — 虚拟化
## 自定义检测规则
自定义规则位于 Wazuh 服务器的 `/var/ossec/etc/rules/local_rules.xml` 中,并基于
Wazuh 的内置规则集构建。(自定义规则 ID 使用 `1001xx` 范围,以避免与
`100001`–`100002` 处的内置示例规则发生冲突。)
### 规则 1 — 暴力破解身份验证 (MITRE T1110)
当在短时间窗口内发生多次身份验证失败时触发。
```
5557
Multiple failed login attempts - possible brute force (custom)
T1110
```
### 规则 2 — Web 扫描 / HTTP 4xx 爆发 (MITRE T1595)
当来自同一活动的大量 HTTP 4xx 错误时触发 —— 这是扫描器探测
隐藏路径(`/admin`, `/phpmyadmin`, `/.env` 等)的典型特征。
```
31101
Possible web scanning - burst of HTTP 4xx errors (custom)
T1595
```
## 结果 — 已验证的检测
每条自定义规则均通过模拟匹配的活动并在
Wazuh dashboard (Threat Hunting) 中观察告警来确认已被触发。
| 规则 ID | 检测 | MITRE | 日志源 | 触发方式 | 状态 |
|---------|----------------------------------------|--------|-------------------------|---------------------------------------------|--------|
| 100100 | 多次登录失败 (暴力破解) | T1110 | Kali `/var/log/auth.log`| 重复的失败 `sudo` 密码尝试 | ✅ 已验证 |
| 100101 | Web 扫描 (HTTP 4xx 爆发) | T1595 | Kali Apache `access.log`| 对大量不存在的路径执行 `curl` | ✅ 已验证 |
**测试期间还观察到了内置的 Wazuh 检测**(表明 pipeline 端到端运行
正常):`5404` 三次失败的 sudo 尝试,`5503` PAM 登录失败,`5557` 密码检查
失败,`5902` 添加了新用户,`5903` 删除了用户/组,`31101` Web 服务器 4xx 错误,
`510` 基于主机的异常 (rootcheck)。
## 复现步骤
### 1. 实验室准备
- 在 VirtualBox 中创建一个 **NAT Network**,以便所有虚拟机都能接入互联网 *并且*
可以相互访问。
- 为 Ubuntu 服务器分配至少 **4 GB 内存 / 2 个 CPU** 以及约 **40 GB 磁盘**。
### 2. 安装 Wazuh 服务器 (Ubuntu)
```
curl -sO https://packages.wazuh.com/4.14/wazuh-install.sh
sudo bash ./wazuh-install.sh -a
```
从 `wazuh-install-files.tar` 获取管理员密码,然后通过
`https://` 打开 dashboard。
### 3. 注册 Kali 终端
```
curl -s https://packages.wazuh.com/key/GPG-KEY-WAZUH | sudo gpg --no-default-keyring \
--keyring gnupg-ring:/usr/share/keyrings/wazuh.gpg --import
sudo chmod 644 /usr/share/keyrings/wazuh.gpg
echo "deb [signed-by=/usr/share/keyrings/wazuh.gpg] https://packages.wazuh.com/4.x/apt/ stable main" \
| sudo tee /etc/apt/sources.list.d/wazuh.list
sudo apt-get update
sudo WAZUH_MANAGER="" apt-get install -y wazuh-agent
sudo systemctl enable --now wazuh-agent
```
### 4. 添加日志源 (Kali)
```
# Kali 默认使用 journald;安装 rsyslog 以使文本日志存在
sudo apt-get install -y rsyslog apache2
sudo systemctl enable --now rsyslog apache2
```
将这些内容添加到 `/var/ossec/etc/ossec.conf` 中的 `` 内,然后重启 agent:
```
syslog /var/log/auth.log
syslog /var/log/syslog
apache /var/log/apache2/access.log
```
### 5. 添加自定义规则 (Ubuntu)
将上述两条规则添加到 `/var/ossec/etc/rules/local_rules.xml` 中,然后:
```
sudo systemctl restart wazuh-manager
```
### 6. 测试
```
# brute force -> rule 100100
sudo -k; sudo ls # enter wrong password repeatedly
# web scan -> rule 100101
for p in admin login phpmyadmin .env wp-login.php config backup .git secret api; do
curl -s -o /dev/null http://localhost/$p; done
```
在 dashboard 的 **Threat Hunting** 视图中,按 `rule.id:100100` 和 `rule.id:100101` 进行过滤。
## 经验总结 / 故障排除
在构建此项目时遇到的实际问题及其解决方法 —— 这正是该
工作实际涉及的问题解决类型:
- **VirtualBox 网络:** 普通 NAT 会隔离每个虚拟机,而 Host-Only 无法接入互联网。需要一个 **NAT
Network** 才能同时获得互联网访问权限(用于安装)和虚拟机之间的流量(用于
agents)。
- **磁盘容量规划:** Wazuh dashboard 在磁盘已满时安装失败。调整了虚拟机的虚拟
磁盘大小(`growpart` + `resize2fs`)—— indexer 需要增长空间。
- **Indexer 在重启后无法启动:** 必须将 `vm.max_map_count` 设置为 ≥262144 并且*将其持久化*
在 `/etc/sysctl.conf` 中,否则 OpenSearch 在引导时会无法通过 bootstrap 检查。
- **失败的密码工具运行:** 留下了一个属于 root 的 `/etc/wazuh-indexer/backup` 目录,它
阻止了 indexer 启动(`AccessDeniedException`)。删除该目录修复了启动问题。
- **Kali 日志:** Kali 默认使用 systemd-journald,没有 `/var/log/auth.log`。安装
`rsyslog` 可重新创建 Wazuh 监控的文本日志。
- **自定义规则 ID 必须唯一:** 重用 `100001`(一个内置的示例规则 ID)会悄无声息地
掩盖自定义规则。移至 `1001xx` 范围即可解决此问题。
- **调优以适应实际触发的信号:** 失败的 `sudo` 产生规则 `5557` 的频率远高于
`5503`,因此在阅读实时告警后,将暴力破解规则重新关联到了 `5557`。
## 仓库结构
```
wazuh-soc-lab/
├── README.md
├── rules/
│ └── local_rules.xml # the 2 custom detection rules
└── screenshots/
├── dashboard.png
├── rule-100100-bruteforce.png
└── rule-100101-webscan.png
```
## 后续工作 (v2)
- 添加一个带有 **Sysmon** 的 **Windows 11 终端**,以获得更丰富的遥测数据。
- 再增加三条自定义规则:多次 Windows 登录失败 (T1110)、编码的 PowerShell
(T1059.001) 以及向 Administrators 组添加新用户 (T1098)。
- 进行一次误报调优,并导出检测的 Sigma rule。
## 作者
作为一个实践性的蓝队 / 检测工程作品集项目而构建。
标签:Wazuh, 安全实验环境, 安全运营中心, 密码管理, 红队行动, 网络映射