wazuh-soc/wazuh-soc-training

GitHub: wazuh-soc/wazuh-soc-training

该平台为 Wazuh 打造了端到端的 SOC 分析师实战培训系统,通过向实时管理器注入真实攻击告警实现盲测分诊与自动评分。

Stars: 0 | Forks: 0

# wazuh-soc-training 一个为 [Wazuh](https://wazuh.com) 打造的自包含 SOC 分析师培训平台。它会端到端地驱动真实的演练流程: 1. 学员选择一个**难度等级**(初级 / 中级 / 高级)。他们将获得该级别下**随机的、无标签的安全事件**——攻击类型*事先不会*透露,因此他们必须自己进行分类(盲测分诊)。 2. 启动演练会通过 `analysisd` 队列 socket 将**带标签的攻击**注入到实时的 Wazuh manager 中——真实的告警会出现在**真实的 Wazuh dashboard** 中。每次运行都是**随机化的**:每次都会重新抽取新的源 IP、目标主机和事件数量,因此每次启动时答案都会变化(无法死记硬背)。 3. 学员在**实际的 dashboard 中进行分诊**(提供链接),然后回答该事件的分诊问题。 4. 答案会根据该次运行的真实情况进行**自动评分**,并附带针对每个问题的复盘(攻击类型会在此揭晓)、得分以及一个**排行榜**(SQLite)。 由于这些都是真实的 Wazuh 告警,分析师所学的一切——Discover 查询、`rule.groups`、`data.srcip` 关联分析、agent 关联——都可以直接应用到实际工作中。 演练涵盖了**混合环境**:Linux/Web 主机(SSH 暴力破解、Web 攻击)**以及** Windows/Active-Directory 主机(RDP 暴力破解、Kerberoasting、AS-REP roasting、PowerShell cradles、LOLBins、LSASS 转储、勒索软件前兆行为、C2 beaconing、横向移动 + 日志擦除)。Windows 主机会在 dashboard 中显示真实的 **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 (+ 类型 10 / 频率) | 100110–100112 | 暴力破解、密码喷洒、RDP 暴力破解 | | 4740 | 100113 | 账户锁定 | | 4769 RC4 / 4768 preauth-0 | 100120 / 100121 | Kerberoasting / AS-REP roasting | | 4720 / 4728·4732 | 100130 / 100131 | 非法账户 + 特权组添加 | | 1102 / 4624 类型 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` | 初级 | 枚举*所有*源(4 个以上),避免遗漏封禁列表 | | `scenarios/02-web-app-attack.json` | 中级 | payload 分类,理解 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 = 可能已被攻陷,应急响应 | **Windows / Sysmon**(自定义规则包 100100–100161,仅限 Windows agent): | 文件 | 级别 | 事件 | 教学内容 | |------|-------|----------|---------| | `scenarios/07-win-rdp-bruteforce.json` | 初级 | 4625 类型 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 类型 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 | 历史记录 + 系统日志擦除;本地日志不可信,应转向转发的副本进行追踪,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 类型 3 NTLM | Pass-the-Hash:复用 NTLM 哈希,无 Kerberos,异常工作站,T1550.002 | | `scenarios/26-win-pass-the-ticket.json` | 中级 | 4624 类型 9 (显式) | 通过 runas /netonly 进行的 Pass-the-Ticket / overpass-the-hash,T1550.003 | | `scenarios/27-win-rdp-session-hijack.json` | 中级 | 4778 会话重连 | 来自未知客户端的实时 RDP 会话接管,T1563.002 | | `scenarios/28-win-dcsync.json` | 高级 | 4662 复制权限 | 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 中注册,并通过保活模拟器保持 **Active** 状态(无需为每个端点配置容器、虚拟机或嵌套虚拟化)。 ``` git clone https://github.com/wazuh-soc/wazuh-soc-training cd wazuh-soc-training sudo ./bootstrap.sh # installs Wazuh AIO + enrolls fleet + simulator + tool ``` 执行完毕后,它会打印出 dashboard URL、培训 URL 以及环境列表。想要用一次性的虚拟机?`vagrant up` 会启动一个虚拟机并在其中运行相同的引导脚本。 仅基于数据库的环境列表的工作原理是:`lab/enroll-fleet.sh` 通过 authd (:1515) 注册每个 agent;`lab/agent_sim.py` 使用 Wazuh 加密的 1514 协议发送保活信号,使它们在没有真实端点的情况下显示为 **Active**;队列 socket 注入器负责输入它们的告警。环境列表中的每一行都包含一个 **`os`** 列(`linux | windows-server | windows-10 | windows-11`)——模拟器会在保活信号中上报该信息,因此 Windows 主机会在 dashboard 中显示真实的 **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)** — © wazuh-soc. 你可以**仅出于非商业目的**使用、复制、修改和分享本软件。允许个人、研究、教育、政府和其他非盈利性目的的使用。**不允许商业用途**——包括出售本软件、出售对其的访问权限、在付费产品或服务中使用,或将其用于商业竞争优势。如需商业授权,请联系作者。
标签:CISA项目, DNS 反向解析, IP 地址批量处理, Python, SOC分析, Wazuh, 子域名变形, 安全培训, 无后门, 模拟器, 蓝队训练