cybersecuritytraining2-cmyk/IR-Tabletop-CICD-Compromise
GitHub: cybersecuritytraining2-cmyk/IR-Tabletop-CICD-Compromise
一个基于局域网的多人事件响应桌面演练工具,让安全团队通过模拟 CI/CD 管道入侵场景进行协作式决策训练并获得即时反馈。
Stars: 0 | Forks: 0
# IR 桌面演练 — "CI/CD Pipeline 遭受入侵"
一场引导式的多人**事件响应桌面演练**。你只需在一台机器上托管它
(Ubuntu);你的团队通过同一网络下的浏览器加入,选择一个昵称,然后通过
**每次做出一个决策**的方式来处理一起真实的安全事件。
演练场景:一个带有 `pull_request_target`("Pwn Request")漏洞的代码仓库被黑客利用,并且
自托管的 Actions runner 被发现正在向一个**恶意域名**进行信标通信。团队必须主导整个
事件处理流程 —— 遏制、评估范围、轮换凭据、根除、恢复、通知和加固 —— 同时游戏会在
每次决策后展示**为什么正确答案是正确的**,以及对于错误选择,**原本会发生什么**
(token 被盗、制品被投毒、证据丢失、遭到二次利用)。
## 游戏玩法
1. 你(**引导员**)打开主机控制台并点击 **Start Sim**。
2. 每个人在各自的屏幕上阅读事件简报。
3. 在 **10 个决策点**的每一个中:玩家在自己的设备上投票 → 你会看到一个**实时计票结果** →
你点击 **Reveal** → 游戏会解释正确的行动、负责的团队,以及
错误选择的后果。
4. **团队的多数票**将驱动五个“事件结果”指标(遏制情况、证据
完整性、机密安全性、服务可用性、利益相关者信任度)。
5. **复盘总结**将展示最终裁定、决策时间线、最终指标和关键要点。
这是一个合作游戏 —— 没有个人排行榜。团队要么共同成功,要么共同失败。
## 环境要求
- **Node.js 18+** (`node --version`)
- 一台与参与者连接在相同 LAN/Wi-Fi 下的机器
无需构建步骤,无需数据库,无需互联网 —— 所有资源(Vue、Socket.IO 客户端、样式)都在
本地提供服务,因此它可以在完全隔离的网络中运行。
## 运行方式
```
cd IR-Tabletop-CICD-Compromise
npm install
npm start
```
启动时,控制台会打印出 **引导员密钥 (facilitator key)** 和访问 URL:
```
Facilitator key : 7F3A9C
Host console : http://192.168.1.50:3000/host
Players join at : http://192.168.1.50:3000/
```
- 你自己打开 **Host console** URL,输入引导员密钥。
- 将 **Players join** URL 分享给房间里的人(大声读出来,或者发到聊天群里)。
- 等待所有人都出现在大厅中,然后点击 **Start Sim**。
### 查找你的局域网地址 (Ubuntu)
服务器会自动打印该地址,但你也可以自行运行:
```
hostname -I # first address is usually your LAN IP
```
### 开放防火墙端口 (Ubuntu,如有需要)
如果参与者无法访问页面,请通过 `ufw` 允许相应端口:
```
sudo ufw allow 3000/tcp
```
### 选项
| 变量 | 默认值 | 用途 |
|----------|---------|---------|
| `PORT` | `3000` | 监听端口 |
| `HOST_KEY` | 每次启动随机生成 | 固定引导员密钥,例如 `HOST_KEY=letmein npm start` |
```
PORT=8080 HOST_KEY=warroom npm start
```
## 引导员指南
**演练开始前**
- 略读 `scenario.js` —— 它包含了完整的正确答案,以及每个选项背后的
理由/后果。主机控制台也会显示建议的答案(标有 **✓ RECOMMENDED**)和实时
计票结果,因此你无需记住任何内容即可引导讨论。
- 决定你的节奏。一场好的桌面演练通常为**每个决策预留 3–6 分钟**:阅读情况,
让全场辩论,进行投票,揭晓答案,然后讨论。
**演练进行中**
- 鼓励在投票*之前*进行讨论 —— 学习的重点在于辩论过程,而不是点击的动作。
- 在点击 **Reveal** 后,大声朗读理由,对于常见的错误答案,详细讲解其
后果。在相关的地方,将其与攻击演练联系起来。
- 使用**事件状态指标**作为叙述工具(“请注意 Evidence Integrity 刚才下降了
—— 这就是为什么我们不能直接拔电源的原因”)。
- 迟到者可以在游戏进行中加入;引导员可以随时在复盘页面点击 **Reset to lobby**。
**复盘总结**
- 总结屏幕会为你提供最终裁定、每个决策的时间线(包含团队错过问题的最佳答案),
以及关键要点。在这里多花些时间 —— 这是知识巩固的关键环节。
## 自定义演练场景
培训师可能需要修改的所有内容都位于 **`scenario.js`** 文件中,里面有大量的注释说明:
- `incident` — 组织信息、严重程度、简报文本和已知事实。
- `meters` — 五个结果指标及其起始值。
- `steps[]` — 决策点:每个选项的标签、负责的 `team`、唯一的 `correct`
答案、其 `rationale`(理由)、错误答案的 `consequence`(后果),以及如果团队
选择了该选项会触发的 `meters` 指标数值变化。
- `takeaways` 和 `verdict()` — 复盘内容以及最终裁定等级是如何决定的。
你可以自由添加、删除或修改步骤 —— 服务器和 UI 会自动适应你定义的任意数量的步骤。
## 项目结构
```
server.js Express + Socket.IO; authoritative game state machine; facilitator-key auth
scenario.js The incident content (trainer-editable)
smoke-test.js End-to-end test driving a full 10-step session (npm test)
public/
index.html Participant app shell
host.html Facilitator console shell
css/theme.css Bespoke dark "SOC war-room" theme
js/common.js Shared helpers
js/participant.js Participant Vue app
js/host.js Facilitator Vue app
assets/logo.svg Shield logo / favicon
```
## 验证
```
npm test # boots the server and drives host + 2 players through all 10 steps
```
测试断言玩家绝不会在引导员揭晓前收到答案,投票会被统计并且多数票将驱动
团队决策和指标变化,错误的多数票会被判定为错误,并且复盘结果(裁定、时间线、指标)能正常生成。
## 注意事项与范围
- **专为局域网 (LAN) 设计。** 除了使用昵称加入外,没有任何参与者身份验证机制,
且主机端仅由一个打印在控制台上的密钥进行控制。不要直接将其暴露在公共
互联网上。
- 单会话,内存运行。重启服务器(或点击 **Reset**)会清除所有状态。
标签:GNU通用公共许可证, MITM代理, Node.js, Socket.IO, 多人在线游戏, 库, 应急响应, 桌面演练, 自定义脚本