diagonalciso/wazuh-soc-training

GitHub: diagonalciso/wazuh-soc-training

一个基于 Wazuh 的 SOC 分析师实战培训平台,通过向真实管理器注入随机化攻击告警让学员进行盲测分诊并自动评分。

Stars: 3 | Forks: 1

# wazuh-soc-training 一个用于 [Wazuh](https://wazuh.com) 的独立 SOC 分析师培训平台。它可以端到端地驱动真实演练: 1. 学员选择一个**难度级别**(初级 / 中级 / 高级)。他们将获得该级别下的一个**随机的、未标记的事件**——攻击类型事先*不会*被透露,因此他们必须自己对其进行分类(盲测分诊)。 2. 开始演练会通过 analysisd 队列 socket 将**带有标签的攻击**注入到实时的 Wazuh manager 中——真实的告警将出现在**真实的 Wazuh 仪表板**中。每次运行都是**随机化**的:每次都会重新提取新的源 IP、目标主机和事件量,因此每次启动时答案都会改变(无法死记硬背)。 3. 学员在**实际仪表板**中进行分诊(提供链接),然后回答该事件的分诊问题。 4. 答案会根据该次运行的真实情况进行**自动评分*,并提供针对每个问题的复盘(在此揭示攻击内容)、分数以及**排行榜**(基于 SQLite)。 由于这些告警是真实的 Wazuh 告警,分析员所学到的一切——Discover 查询、`rule.groups`、`data.srcip` 数据透视、agent 关联——都可以直接应用到实际工作中。 演练涵盖**混合环境**:Linux/Web 主机(SSH 暴力破解、Web 攻击)**以及** Windows/Active-Directory 主机(RDP 暴力破解、Kerberoasting、AS-REP roasting、PowerShell cradle、LOLBins、LSASS 转储、勒索软件前兆、C2 beaconing、横向移动 + 日志擦除)。Windows 主机在仪表板中会显示真实的 **Windows OS** 身份,并且 Windows 演练仅在 Windows agent 上生效。 纯 Python 3 **标准库**。无需 pip,无需 Node,无需外部服务。 ## 工作原理 ``` scenario JSON (labeled attack + ground truth + questions) │ ▼ injector.py ──► analysisd queue socket ──► Wazuh rules ──► wazuh-alerts-* │ │ │ real Wazuh dashboard ▼ │ app.py (web UI) briefing + questions ◄── trainee triages ──────┘ │ ▼ scoring.py grade vs ground_truth ──► debrief + leaderboard (SQLite) ``` 注入器**必须在 Wazuh manager 上运行**——队列 socket (`/var/ossec/queue/sockets/queue`) 是一个由 `wazuh:wazuh` 拥有的本地 UNIX socket。 ## 已验证的规则覆盖范围 **Linux / Web** 场景使用的事件模板已被确认能在实时 manager 上触发,**并且**带有 `data.srcip`(以便源 IP 能在分诊和攻击地图中显示): | 模板 | 触发规则 | 类别 | |----------|-----------|--------| | `sshd_invalid` / `sshd_failed` | 5710 / 5716 (`authentication_failed`) | 暴力破解 | | `web_sqli` / `web_xss` / `web_traversal` / `web_cmdinj` | 31106 (`web,accesslog,attack`, HTTP 200) | Web 攻击 | **Windows / Sysmon** 场景注入 EventChannel JSON(Security + Sysmon),并触发一个内置的自定义规则包 `rules/training_rules.xml`(ID 为 **100100–100161**,由 `bootstrap.sh` 安装): | 注入事件 | 触发规则 | 涵盖内容 | |----------------|-----------|--------| | 4625 (+ type 10 / freq) | 100110–100112 | 暴力破解、密码喷洒、RDP 暴力破解 | | 4740 | 100113 | 账户锁定 | | 4769 RC4 / 4768 preauth-0 | 100120 / 100121 | Kerberoasting / AS-REP roasting | | 4720 / 4728·4732 | 100130 / 100131 | 流氓账户 + 添加到特权组 | | 1102 / 4624 type 3 | 100133 / 100134 | 日志清除 / 横向移动 | | Sysmon 1 (命令行) | 100141–100144 | 加密的 PowerShell, LOLBins, LSASS 转储, 卷影副本删除 | | Sysmon 3 / 11 (频率) | 100151 / 100161 | C2 beaconing / 勒索软件大范围加密 | 添加新模板:在将其接入场景之前,请使用 `wazuh-logtest` 验证规则是否触发(以及对于网络攻击,`srcip` 是否被成功解码)。 ## 场景 跨越三个级别的 30 个演练;该工具会在所选级别中随机提供一个。 标题对学员隐藏(仅在复盘时显示)。 **Linux / Web**(内置规则 5710/5716/31106): | 文件 | 级别 | 教学内容 | |------|-------|---------| | `scenarios/01-ssh-bruteforce.json` | 初级 | 源 IP + 主机识别,遏制基础 | | `scenarios/04-distributed-ssh-bruteforce.json` | 初级 | 枚举*所有*源 IP(4 个以上),避免遗漏封禁列表 | | `scenarios/02-web-app-attack.json` | 中级 | 载荷分类,解读 HTTP 200 = 成功,Web 响应 | | `scenarios/05-ssh-password-spray.json` | 中级 | 喷洒与暴力破解对比,T1110.003,MFA/锁定响应 | | `scenarios/03-multistage-intrusion.json` | 高级 | 区分攻击者,杀伤链进展,确定优先级 | | `scenarios/06-web-rce-attempt.json` | 高级 | 命令注入 / RCE,200 = 潜在失陷,IR 响应 | **Windows / Sysmon**(自定义规则包 100100–100161,仅限 Windows agent): | 文件 | 级别 | 事件 | 教学内容 | |------|-------|----------|---------| | `scenarios/07-win-rdp-bruteforce.json` | 初级 | 4625 type 10 | RDP 暴力破解,T1110.001 | | `scenarios/08-win-account-lockout.json` | 初级 | 4625 → 4740 | 单账户猜测 + 锁定 | | `scenarios/09-win-password-spray-dc.json` | 中级 | 4625 (多用户) | 喷洒特征,追踪成功事件,T1110.003 | | `scenarios/10-win-kerberoasting.json` | 中级 | 4769 RC4 | Kerberoasting,RC4 特征,T1558.003 | | `scenarios/11-win-powershell-cradle.json` | 中级 | Sysmon 1 | 加密的 PowerShell 下载 cradle,T1059.001 | | `scenarios/12-win-lolbin-exec.json` | 中级 | Sysmon 1 | LOLBin 滥用,T1218 | | `scenarios/13-win-rogue-admin.json` | 中级 | 4720 + 4732 | 流氓特权账户,T1136.002 / T1098 | | `scenarios/14-win-asrep-roasting.json` | 高级 | 4768 preauth 0 | AS-REP roasting,T1558.004 | | `scenarios/15-win-cred-dump-lsass.json` | 高级 | Sysmon 1 | 通过 comsvcs 进行 LSASS 转储,T1003.001 | | `scenarios/16-win-ransomware-preencryption.json` | 高级 | Sysmon 1 + 11 | 卷影副本删除 + 大规模重写,T1486 / T1490 | | `scenarios/17-win-c2-beacon.json` | 高级 | Sysmon 3 | 周期性 C2 beacon,T1071.001 | | `scenarios/18-win-lateral-log-cleared.json` | 高级 | 4624 type 3 + 1102 | 横向移动 + 日志擦除,T1021 / T1070.001 | **Linux 假设失陷**(攻击者已通过窃取的凭证 / 有效的会话潜入——内置规则 5715/5402-5403/5902 + 自定义包 100209–100215,仅限 Linux agent): | 文件 | 级别 | 事件 | 教学内容 | |------|-------|----------|---------| | `scenarios/19-linux-stolen-cred-login.json` | 中级 | 5715 (Accepted password) | 有效账户滥用与暴力破解对比——一个没有失败记录的纯粹成功登录,T1078 | | `scenarios/20-linux-hands-on-keyboard.json` | 高级 | 5715 → 5402/5403 → 100212 → 100211 | 实时操作者:登录 → sudo → 下载 → 反弹 shell,T1078/T1548/T1105/T1059.004 | | `scenarios/21-linux-persistence-implant.json` | 高级 | 5715 + 5902 + 100210 + 100215 | 三个据点(流氓用户,后门密钥,cron);为什么仅重置密码是不够的,T1136/T1098.004/T1053.003 | | `scenarios/22-linux-antiforensics.json` | 高级 | 5715 + 100213 + 100214 | history + 系统日志擦除;本地日志不可信,应转向转发的副本进行追踪,T1070.003/.002 | | `scenarios/23-linux-lateral-session.json` | 高级 | 5715 (内部 srcip) + 5402/5403 | 复用密钥的东向西向移动;内部 RFC1918 源地址是破绽,T1021.004 | | `scenarios/24-linux-full-breach.json` | 高级 | 完整的 5715→5402/5403→100210→100212→100211→100214 链条 | 综合测试:凭证访问到反取证;完整的驱逐计划,T1078→T1070.002 | **Windows 假设失陷**(窃取的凭证 / 劫持的会话——内置规则 100100 基础 + 自定义包 100135–100139 / 100170,仅限 Windows agent): | 文件 | 级别 | 事件 | 教学内容 | |------|-------|----------|---------| | `scenarios/25-win-pass-the-hash.json` | 中级 | 4624 type 3 NTLM | Pass-the-Hash:重用 NTLM 哈希,无 Kerberos,异常工作站,T1550.002 | | `scenarios/26-win-pass-the-ticket.json` | 中级 | 4624 type 9 explicit | 通过 runas /netonly 进行的 Pass-the-Ticket / overpass-the-hash,T1550.003 | | `scenarios/27-win-rdp-session-hijack.json` | 中级 | 4778 session reconnect | 来自未知客户端的实时 RDP 会话接管,T1563.002 | | `scenarios/28-win-dcsync.json` | 高级 | 4662 replication rights | DCSync:非 DC 主体复制机密,krbtgt 影响范围,T1003.006 | | `scenarios/29-win-persistence-evasion.json` | 中级 | 4698 + Defender 5001 | 计划任务持久化 + 终止 Defender;伪装特征,T1053.005 / T1562.001 | | `scenarios/30-win-full-breach.json` | 高级 | 完整的 100135→100136→100138→100139→100170 链条 | 综合测试:PtH/PtT → DCSync → 持久化 → 逃避;假设域控失陷,T1550→T1003.006 | 主机上的后渗透命令(反弹 shell,日志擦除,密钥植入,cron)没有可靠的内置规则,因此它们被作为 `snoopy` 命令审计行注入,并由训练包通过 `full_log` 进行匹配——命令本身就是分析员审查的证据。 一个场景就是一个 JSON 文件:包含 `briefing`、`dashboard_hint`、`inject.steps`(模板 + agent + srcips + 数量/节奏)、`ground_truth`、`questions`(类型:`choice`、`multi`、`ipset`、`text`),以及一个可选的 `randomize` 块。 在 `scenarios/` 中放入一个新文件并重启即可——无需修改代码。 ### 单次运行随机化 `randomizer.py` 在开始时会将模板“具象化”为一次具体的运行: ``` "randomize": { "ips": {"SRC1": "bruteforce", "SRC2": "bruteforce"}, "users": {"USER1": true}, "services": {"SVC1": true}, "targets": {"TARGET": {"question": "target", "os": "windows"}} } ``` 在场景中的任何地方以 `$TOKENS` 引用。`ips` 从命名池中提取不同的 IP;`users` / `services` 提取账户和 SPN/服务名称(用于带有 AD 特色的 Windows 练);`targets` 从现有的主机群中提取不同的主机,并重建命名选择题的选项(正确主机 + 随机干扰项)。 在目标上可选的 `"os"` 过滤器(`windows` / `linux`)将提取范围——及其干扰项——限制在该操作系统系列内,这样 Windows 演练就只会落在 Windows 主机上,永远不会提供 Linux 主机作为答案。步骤的 `count` 可以是一个 `[min, max]` 范围。评分常数(攻击类别,MITRE id,严重程度)**不进行**随机化——它们是学习的目标。具象化后的运行会按 `run_id` 存储,因此评分会使用注入时的确切标准答案。 ## 运行 ``` cp wazuh-soc-training.env.example /etc/wazuh-soc-training.env # edit it sudo env $(grep -v '^#' /etc/wazuh-soc-training.env | xargs) python3 app.py # http://:8101/ ``` 需要对队列 socket 的写权限 → 使用 `root` 或 `wazuh` 用户运行。有关运维信息,请参阅 [docs/ADMIN.md](docs/ADMIN.md)。 ## 从零开始搭建完整实验室——只需一条命令 你**唯一需要提供的实际东西就是一台 Linux 机器**。端点和 agent 都是**纯数据库模式**的——在 manager 中注册,并通过 keepalive 模拟器保持 **Active** 状态(无需为每个端点设置容器,无需 VM,无需嵌套虚拟化)。 ``` git clone https://github.com/diagonalciso/wazuh-soc-training cd wazuh-soc-training sudo ./bootstrap.sh # installs Wazuh AIO + enrolls fleet + simulator + tool ``` 执行完毕后,它会打印出仪表板 URL、培训 URL 和主机群信息。想要一个一次性的 VM?`vagrant up` 会启动一个并在其内部运行相同的 bootstrap。 纯数据库主机群的工作原理:`lab/enroll-fleet.sh` 通过 authd (:1515) 注册每个 agent;`lab/agent_sim.py` 使用 Wazuh 加密的 1514 协议发送 keepalive,使它们在没有实际端点的情况下显示为 **Active** 状态;队列 socket 注入器负责输入它们的告警。每条主机群信息都带有一个 **`os`** 列(`linux | windows-server | windows-10 | windows-11`)——模拟器会在 keepalive 中报告它,因此 Windows 主机(dc01, ws01, fs01...)在仪表板中会显示真实的 **Windows OS**,并且 `TRAIN_AGENTS`(`id:name:os`)会告知该工具每个主机可以运行哪些演练。`lab/fleet.example.txt` 中提供了一个逼真的 AD + Linux DMZ 混合环境。完整的操作手册 + 手动阶段 + 可选的*真实 agent 容器*路径:**[docs/DEPLOY.md](docs/DEPLOY.md)**。 ## 路由 | 路由 | 描述 | |-------|-------------| | `/` | 场景选择器 + 排行榜 | | `/scenario?id=&trainee=` | **启动演练**(注入)+ 简报 + 提问 | | `/submit` | 评分答案 → 复盘 | | `/run?id=` | 注入进度 (JSON) | | `/api/scenarios` | 场景 ID (JSON) | | `/healthz` | `{"ok":true}` | ## 安全 / 注意事项 - 它**会向 Wazuh 注入事件**。请使用实验室/培训环境的 manager。测试告警已被明确标记为针对环境中配置的真实 agent 名称的攻击。 - 默认情况下没有页面身份验证(实验室工具)。如果需要,请绑定到内部接口 / 使用反向代理作为前端。每次响应都会设置安全标头(CSP、nosniff、frame-options、no-referrer)。 - 对 indexer 是只读的;注入是唯一的写入路径,并且仅进入告警管道。 状态:概念验证,按原样提供。 ## 许可证 **[PolyForm Noncommercial License 1.0.0](LICENSE)** — © CisoDiagonal. 你可以**仅出于非商业目的**使用、复制、修改和共享此软件。允许个人、研究、教育、政府和其他非营利性使用。**不允许商业用途**——包括出售该软件、出售对其的访问权限、在付费产品或服务中使用它,或将其用于商业优势。如需商业许可证,请联系作者。
标签:PE 加载器, Wazuh, 子域名变形, 安全培训, 安全运营, 扫描框架, 模拟器