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, 多人在线游戏, 库, 应急响应, 桌面演练, 自定义脚本