MintKangaroo/Cyber-Offensive-and-Defensive-Exercise
GitHub: MintKangaroo/Cyber-Offensive-and-Defensive-Exercise
面向ICS/OT关键基础设施的攻防一体化网络靶场平台,通过11个行业数字孪生与集成的EDR/SIEM系统,提供贴近实战的网络安全攻防训练和竞赛环境。
Stars: 0 | Forks: 0
# 🛡️ Cyber Range Platform — 攻防一体化训练平台
=true` 环境变量
或在指导员控制台进行无停机补丁切换来单独停用,并可通过 `python3 shared/safe_probe.py` 一次性判定全部60项的 patched/vulnerable 状态。
## 快速入门
### 环境要求
- Docker + Docker Compose v2
- (如需运行 Dashboard 开发服务器)Node.js 20+
### 1) 启动平台
```
cd cyber-range-platform
docker compose up -d --build
# 集成 E2E smoke (默认 35/35 PASS)
bash scripts/smoke_test.sh
```
### 2) 运行 Dashboard
不同角色访问的 Dashboard 各不相同。**请注意各端口并不一样**:
| 角色 | Dashboard | 端口 | 运行命令 |
|---|---|---|---|
| 🔴 **Red(攻击)** | **Red Portal** — 挑战列表·artifact·提交 flag | **5176** | `cd dashboards/redportal && npm install && npm run dev` |
| 🔵 **Blue(防御)** | **Blue Portal** — 事件·补丁·提交检测规则 | **5177** | `cd dashboards/blueportal && npm install && npm run dev` |
| 🔵 Blue | EDR 控制台 — 进程隔离/kill | 5173 | `cd services/edr/console && npm install && npm run dev` |
| 🔵 Blue | SIEM 控制台 — 日志检索·检测 | 5175 | `cd dashboards/siem && npm install && npm run dev` |
| 🎓 管理/观察 | Live Fire — 态势感知板·得分·场景 | 5174 | `cd dashboards/livefire && npm install && npm run dev` |
**Red/Blue Portal 需要后端支持** — `challenge_portal`(端口 8060):提供挑战目录·生成
artifact·服务端评分·记分板。运行 `docker compose up -d challenge_portal` 或
`INSTRUCTOR_TOKEN=$INSTRUCTOR_TOKEN uvicorn services.challenge_portal.main:app --host 0.0.0.0 --port 8060`。
(可通过 Live Fire 顶部的 `🚩 RED PORTAL` / `🛡️ BLUE PORTAL` 按钮直接跳转。)
### 3) 验证挑战 (示例)
```
# 服务型(docker) — 实际部署→exploit→评分→teardown
python3 infra/challenge_qa/run_all.py --challenge AI-007
# 制品型 — 生成→solve→评分
python3 infra/challenge_qa/run_all.py --challenge FOR-007
python3 infra/challenge_qa/run_all.py --challenge NET-007
```
## 验证 · 质量门禁
本项目的原则是**“展示实际通过的结果,而不是仅凭代码定论”**。
- **72个单元测试** (`python -m pytest tests/`) — 契约验证 + 针对过往已修复 bug 的回归测试。
- **35/35 集成冒烟测试** (`scripts/smoke_test.sh`) — 涵盖健康检查 → Twin 攻击 → SIEM 摄取 → 评分 →
场景 → EDR 检测 → AAR/PDF → 网络隔离的 E2E 流程。
- **C-QA 流水线** (`infra/challenge_qa/run_all.py`) — 针对不同挑战类型使用正确的门禁来验证全部69项:
- **服务型**: `deploy_up → intended_solve → blank_submit → flag_determinism → teardown`
- **Artifact 型**: `artifact_solve` (生成 → 特征分支解题 → 评分 + 拒绝空提交)
- **检测型**: `detection_solve` (生成数据集 → **由真实 SIEM DetectionEngine 评分** + 拒绝无效规则)
- **GitHub Actions CI** (`.github/workflows/ci.yml`) — 包含3个 job:
- `unit`: 单元/契约测试(**72个**)。
- `challenges`: 全部挑战 schema + artifact/检测门禁实际评分(无需 docker,使用 `scripts/validate_challenges.sh`)。
- `integration`: 完整 docker 栈 build+up → `SMOKE_RECOVERY=1` 冒烟测试 → teardown。
## RBAC (基于角色的访问控制)
Token 到角色的映射 (`shared/rbac.py`)。本地开发中若未设置 token 则会宽容放行(向后兼容)。
| 端点 | 无 Token | red | blue | observer | instructor |
|---|---|---|---|---|---|
| config `/instructor/patch/toggle` | 401 | 403 | 403 | 403 | ✅ 200 |
| instructor_api `/scenario/start` | 401 | 403 | 403 | 403 | ✅ 200 |
| edr `/isolate` · `/kill` (防御操作) | 401 | 403 | ✅ 200 | 403 | ✅ 200 |
| scoring `/score/adjust` (手动加减分) | 401 | 403 | 403 | 403 | ✅ 200 |
| **读取**: scoring `/scores`, edr `/edr/hosts`·`/edr/alerts` | 401\* | ✅ | ✅ | ✅ | ✅ |
## 实战运营 (多团队 · 初始化 · 安全管控)
为满足实战比赛运营需求的 P1 运营功能。**由 `range_control` 服务(8055)** 统一进行编排,并通过
指导员控制台(Live Fire INSTRUCTOR)提供 UI 界面。详见:[docs/MULTI-TENANT.md](docs/MULTI-TENANT.md) ·
[services/range_control/README.md](services/range_control/README.md)。
### #9 多团队租户隔离 — Range → Match → Team → Twin Set
```
Range ─ Match A ─ {Red A, Blue A, Twin Set A} (scenario_id=match_a)
└ Match B ─ {Red B, Blue B, Twin Set B} (scenario_id=match_b)
```
所有数据均标记为 `range_id·match_id·team_id`。**Match 注册表**(`/matches`) 作为唯一事实来源。
| 隔离维度 | 实现方式 | 实测验证 |
|---|---|---|
| 事件/得分 | 根据 `scenario_id` 分区 (`/replay/events?scenario_id=` · `/scores?scenario_id=`) | 按比赛隔离 ✓ |
| Flag | 团队专属 HMAC + **按比赛轮换**(Portal 的 `match_id`→组合键 `match::team`) | 每场比赛不同·拒绝跨比赛访问 ✓ |
| 网络(物理) | **按比赛分配 Twin 集**: 通过独立的 compose project 复制11个部门的 Twin 实例 | 阻断跨比赛访问 `gaierror`·egress `OSError` ✓ |
| 端口/域名 | 动态端口(base+1~+11) + **vhost**(`match_proxy` 8088, `..range.local`) | 11个部门路由分发 ✓ |
| 观察者 | 公开信息**延迟队列**(`/events/delayed`, Live Fire observer 延迟 30s) | 隐藏实时事件 ✓ |
```
# 按比赛部署物理 twin 集合(由教官在 host 上执行 — 服务不暴露 docker socket)
scripts/deploy_match.sh match_a 8300 # 11섹터 8301~8311, scenario=match_a
scripts/deploy_match.sh match_b 8400 # 8401~8411, scenario=match_b
scripts/teardown_match.sh match_a
```
### #10 可复现的初始化 (Snapshot · Reset · Rollback)
采用 `Baseline Snapshot → 训练 → Reset → Verify-Baseline` 循环。对每个有状态服务的
`/admin/reset`(instructor) 接口进行编排(重置事件·得分·solve状态·补丁)。
| 端点 | 描述 |
|---|---|
| `POST /ranges/{id}/snapshot` | 将当前状态保存为 baseline |
| `POST /ranges/{id}/reset` | 重置事件·得分·solve状态·补丁 |
| `GET /ranges/{id}/drift` | 对比 baseline 的变化量 |
| `POST /ranges/{id}/verify-baseline` | 检查全局服务 health + safe_probe 全量状态为 VULNERABLE + 事件清空 → 必须通过才能开始下一次训练 |
### #11 指导员安全管控
`GET /safety/status` — 在指导员 Dashboard 中显示隔离/安全状态:
```
Safety Status containment 100%
├─ Internet egress: BLOCKED (11 트윈 internal 네트워크)
├─ Cross-team traffic: BLOCKED (per-twin/매치 네트워크 격리)
├─ Docker socket: NONE (compose 미마운트)
├─ Active emergency stop: false
└─ Unauthorized dst: 0
```
`POST /safety/emergency-stop [/release]` 全局紧急停止(killswitch) · `POST /safety/team-pause` 停止特定团队。
## 仓库结构
```
cyber-range-platform/
├── services/ # 17개 마이크로서비스(트윈3 + 코어 + EDR/SIEM/AAR/센서)
│ ├── ground_station/ power_plant/ defense_network/ # 디지털 트윈
│ ├── edr/ (+ console/) siem/ scenario_engine/ scoring_engine/
│ ├── event_collector/ config_service/ instructor_api/ noc_monitor/ aar_report/
│ └── core/ # 복구 판정(recovery_watcher) 등 공용 코어
├── dashboards/ # livefire/ · siem/ (Vite+React)
├── challenges/ # web/ forensics/ network/ reversing/ detection/ ai/ ics/ (59종)
├── infra/challenge_qa/ # C-QA 파이프라인(run_all + 게이트들)
├── scenarios/ # 코드로 정의된 킬체인 시나리오
├── scripts/smoke_test.sh
├── shared/ # rbac.py, event_schema.py 등 공용 모듈
├── tests/ # unit/ + 계약 테스트 (pytest)
├── docs/ # 설계/구현 문서 + images/
├── CONTRACTS.md # 공통 계약(스키마/인터페이스) 단일 진실원
└── docker-compose.yml
```
## 许可证 · 注意事项
本平台仅供训练和教学使用。**所有漏洞、flag 和凭证均为合成的虚拟数据**,不包含任何真实
系统或真实数据。挑战容器已通过 `read_only`/`cap_drop`/`mem_limit` 等配置进行安全加固,
Twin 也实现了网络隔离,从而阻断流量流出和横向移动。请务必仅在获批的受控训练环境中使用。
Live Fire Range — 네트워크 토폴로지 · 팀별 실시간 점수 · 공격/방어 이벤트 피드 · 플래그 트래커
Process Impact(실제 event_collector 이벤트로 렌더) — 전력망 트립 · 정유 SIS 해제 ·
데이터센터 냉방 오버라이드가 사보타주로, 수도·LNG는 교란, 철도는 블루팀 복구중으로 표시.
각 이벤트의 phase(objective·data_exfiltration)까지 반영
EDR 콘솔 — 11개 ICS/OT 섹터 자산이 온라인으로 관측되는 모습
🌐 Web (8)
| ID | 标题 | 难度 | ATT&CK | 得分 | |---|---|---|---|---| | WEB-000 | 暴露的调试配置 | easy | T1592 | 50/50 | | WEB-001 | 网络诊断命令注入 | medium | T1059 | 150/60 | | WEB-002 | 伪造的指挥权 — JWT Forgery | medium | T1078,T1552.001 | 150/150 | | WEB-003 | 无查阅权限 — Mission Plan IDOR | medium | T1083,T1213 | 120/120 | | WEB-004 | 文件下载路径遍历 | medium | T1083 | 120/50 | | WEB-007 | 伪装成图片 — Upload Filter Bypass | medium | T1190,T1505.003 | 150/150 | | WEB-005 | 恢复的代价 — Historian 反序列化 RCE | hard | T1059,T1203 | 250/250 | | WEB-009 | WAF 绕过 + 盲注 SQL Injection | insane | T1190 | 300/150 |🔬 Forensics (9)
| ID | 标题 | 难度 | ATT&CK | 得分 | |---|---|---|---|---| | FOR-000 | 明文凭证挖掘 | easy | T1552.001 | 50/30 | | FOR-001 | 命令历史取证 — 追踪数据泄露 | easy | T1048 | 50/30 | | FOR-004 | 电子邮件头取证 — 追踪钓鱼发件源 | easy | T1566 | 50/30 | | FOR-005 | 内存转储字符串分析 — 凭证恢复 | easy | T1003 | 50/30 | | FOR-006 | 持久化痕迹分析 — 恶意计划任务 | easy | T1053 | 50/35 | | FOR-002 | 沉默的地面站 — 重构入侵过程 | medium | T1190,T1046,T1041 | 200/0 | | FOR-003 | 会话劫持痕迹 — 调查访问日志 | medium | T1539 | 55/35 | | **FOR-007** | **内存注入检测 — 进程空洞化** | **hard** | T1055.012 | 180/0 | | FOR-009 | 反取证多阶段攻击(时间戳篡改→隐蔽通道→解密) | insane | T1070.006,T1564.004,T1027 | 300/0 |🌐 Network (9)
| ID | 标题 | 难度 | ATT&CK | 得分 | |---|---|---|---|---| | NET-000 | 明文协议嗅探 | easy | T1040 | 50/30 | | NET-004 | ARP 欺骗检测 — 追踪中间人攻击 | easy | T1557 | 50/40 | | NET-001 | DNS 隧道分析 — 还原隐蔽通道外泄 | medium | T1071.004 | 60/40 | | NET-002 | 跨越边界 — Lateral Pivot | medium | T1021,T1090 | 150/100 | | NET-003 | C2 信标间隔分析 | medium | T1071 | 55/40 | | NET-005 | 还原端口敲门序列 | medium | T1205 | 50/35 | | NET-006 | TCP 分段重组 — 还原分片外泄数据 | medium | T1041 | 50/35 | | **NET-007** | **追踪多跳 Pivot 链路关联** | **hard** | T1090.003 | 180/0 | | NET-009 | 重构 OT 破坏痕迹 | insane | T0836,T0855,T0831 | 300/0 |🔩 Reversing (8)
| ID | 标题 | 难度 | ATT&CK | 得分 | |---|---|---|---|---| | REV-000 | 被隐藏的信号 — XOR Decode | easy | T1027 | 100/50 | | REV-001 | 混淆的许可证校验 | medium | T1027 | 150/0 | | REV-002 | 重复密钥 XOR 还原 | medium | T1027 | 120/0 | | REV-003 | 多阶段编码还原 | medium | T1140 | 130/0 | | REV-006 | 位旋转密码解密 | medium | T1027 | 130/0 | | REV-004 | 栈式 VM 逆向 | hard | T1027 | 140/0 | | REV-005 | LCG 流密码解密 | hard | T1027 | 130/0 | | REV-009 | 自定义 VM 混淆(Handler Table) | insane | T1027.007 | 300/0 |🕵️ Detection (13) — Blue 专属,由真正的 SIEM 引擎评分
| ID | 标题 | 难度 | ATT&CK | 得分 | |---|---|---|---|---| | DET-000 | 首个暴力破解规则 | easy | T1110 | 0/60 | | DET-002 | 检测 Web 日志中的 SQL Injection | easy | T1190 | 0/80 | | DET-001 | 噪声中的扫描 — Threshold Tuning | medium | T1046 | 0/100 | | DET-003 | Web shell kill chain 检测 — 上传后执行序列 | medium | T1505.003 | 0/90 | | DET-005 | Log4Shell(JNDI) 注入检测 | medium | T1190 | 0/80 | | DET-006 | DNS DGA 检测 — 大量域名查询 | medium | T1568.002 | 0/90 | | DET-007 | BACnet 未授权 WriteProperty(制冷覆盖) 检测 | medium | T0855,T0836 | 0/80 | | DET-010 | EtherNet/IP CIP 安全 assembly 未授权 SetAttribute 检测 | medium | T0836,T0855 | 0/80 | | DET-011 | S7comm 安全 DB(62) 未授权 WRITE_VAR 检测 | medium | T0836,T0855 | 0/80 | | DET-012 | MQTT Sparkplug B 未授权执行器 DCMD 检测 | medium | T0855,T0831 | 0/80 | | DET-004 | C2 信标周期性检测 | hard |1071 | 0/90 | | DET-008 | Foundation Fieldbus MODE_BLK O/S(控制回路停止) 检测 | hard | T0836,T0855,T0831 | 0/90 | | DET-009 | APT Low-and-Slow 信标狩猎(噪声率 90%) | insane | T1071.004,T1029 | 0/200 |🤖 AI Security (9)
| ID | 标题 | 难度 | ATT&CK | 得分 | |---|---|---|---|---| | AI-000 | 特征空间规避 — Feature-Space Evasion | easy | T1027 | 60/40 | | AI-002 | Prompt Injection 痕迹分析 | easy | T1059 | 60/40 | | AI-005 | 模型提取 API 滥用检测 | easy | T1595 | 50/40 | | AI-001 | 影子模型 — Model Extraction | medium | T1587.001 | 150/100 | | AI-003 | 数据投毒痕迹分析 — Backdoor Trigger | medium | T1195 | 55/40 | | AI-004 | RAG 间接 Prompt Injection 痕迹 | medium | T1059 | 55/40 | | AI-006 | 训练数据 memorization 泄露 | medium | T1552 | 55/40 | | **AI-007** | **预算约束对抗规避 — PGD Evasion (基于真实 ML)** | **hard** | T1027 | 220/100 | | AI-009 | 重构对抗规避安全事件(迁移攻击) | insane | T1027,T1551 | 300/0 |🏭 ICS/OT (13) — 基于 OT 协议 (服务型 2 + 流量分析型 11)
| ID | 标题 | 难度 | ATT&CK | 类型 | 得分 | |---|---|---|---|---|---| | ICS-001 | OPC UA 匿名 Tag 读取 | easy | T0886 | full docker | 70/40 | | ICS-000 | 安全联锁绕过 — Modbus Safety Interlock | medium | T0836,T0858 | full docker | 120/60 | | ICS-002 | Modbus 破坏分析 — 未授权写入安全寄存器 | medium | T0836,T0855 | artifact | 120/0 | | ICS-003 | DNP3 未授权控制命令检测 | medium | T0855 | artifact | 120/0 | | ICS-004 | 追踪 IEC 104 ASDU 篡改 | medium | T0855 | artifact | 120/0 | | ICS-005 | Profinet DCP 欺骗分析 — Station Identity Spoof | medium | T0842,T0830 | artifact | 120/0 | | ICS-007 | HART 命令注入分析 — Transmitter Range Tamper | medium | T0836,T0855 | artifact | 120/0 | | ICS-008 | BACnet 未授权 WriteProperty 分析 — Priority Override | medium | T0855,T0836 | artifact | 120/0 | | ICS-012 | MQTT Sparkplug B 未授权执行器命令 — DCMD Injection | medium | T0855,T0831 | artifact | 120/0 | | ICS-006 | IEC 61850 GOOSE 伪造分析 — Spoofed Trip | hard | T0832,T0855 | artifact | 130/0 | | ICS-009 | Foundation Fieldbus 块 MODE 篡改 — PID OOS Sabotage | hard | T0836,T0855,T0831 | artifact | 140/0 | | ICS-010 | EtherNet/IP CIP 未授权控制 — Safety Assembly Tamper | hard | T0836,T0855,T0831 | artifact | 140/0 | | ICS-011 | S7comm 安全 DB 未授权写入 — Safety DB Write | hard | T0836,T0855 | artifact | 140/0 |标签:Metaprompt, OPA, PKINIT, 工控安全, 数字孪生, 网络安全, 网络靶场, 请求拦截, 逆向工具, 隐私保护, 靶场