GiorgosNicolaides/ir-simulator
GitHub: GiorgosNicolaides/ir-simulator
一个基于 FastAPI 的事件响应决策模拟训练服务,通过真实安全场景演练并映射 MITRE ATT&CK 框架来提升防守方的 IR 实战能力。
Stars: 0 | Forks: 0
# 事件响应 Runbook 模拟器
一个用于练习事件响应 (IR) 决策的 FastAPI 服务。
玩家每次完成一个阶段的真实安全事件,
选择如何响应,并接收映射到 **MITRE ATT&CK** 框架的评分事后报告。
它是一个**防御性、教育性**工具:没有漏洞利用代码或
恶意软件——只有对健全的 IR 实践给予奖励的决策树。
## 演示的事件响应概念
该模拟器围绕经典的 IR 生命周期
(NIST SP 800-61 / SANS PICERL)构建。每个场景都会引导玩家经历以下
阶段:
| 阶段 | 含义 | 出现位置 |
| ----- | ------------- | ---------------- |
| **分类 / 识别** | 验证警报并了解发生了什么 | `initial_alert`, `initial_detection` |
| **遏制** | 在其蔓延之前限制爆炸半径 | `isolate endpoint`, `segment the network`, `isolate affected systems` |
| **根除** | 移除威胁并连根拔起持久性机制 | `reset credentials`, `block exfiltration`, `analyze variant in sandbox` |
| **恢复** | 将系统安全地恢复正常运行 | `restore from verified clean backup`, `rebuild from scratch` |
| **经验教训** | 事后审查以防重蹈覆辙 | `full forensic investigation`, `root cause analysis` |
良好的决策(在监控前进行遏制、保留证据、
在恢复前验证备份)会获得正分;而真实
攻击者会利用的捷径(支付赎金、忽略横向移动、跳过
取证)会扣分。
## 场景与 MITRE ATT&CK 映射
### 1. 钓鱼 (`phishing`)
用户点击恶意链接并提交凭据。五个阶段:
初始警报 → 凭据检查 → 横向移动 → 数据外泄 →
事后处理。
| 阶段 | IR 阶段 | MITRE ATT&CK 技术 |
| ----- | -------- | ---------------------- |
| 初始警报 | 分类 / 遏制 | **T1566** – Phishing |
| 凭据检查 | 根除 | **T1078** – Valid Accounts |
| 横向移动 | 遏制 | **T1021** – Remote Services |
| 数据外泄 | 遏制 / 根除 | **T1048** – Exfiltration Over Alternative Protocol · **T1567** – Exfiltration Over Web Service |
| 事后处理 | 经验教训 | — |
### 2. 勒索软件 (`ransomware`)
加密的文件和勒索说明出现在多个主机上。五个阶段:
初始检测 → 范围评估 → 威胁行为者 ID → 恢复决策 →
事后处理。
| 阶段 | IR 阶段 | MITRE ATT&CK 技术 |
| ----- | -------- | ---------------------- |
| 初始检测 | 分类 / 遏制 | **T1486** – Data Encrypted for Impact |
| 范围评估 | 识别 / 恢复 | **T1490** – Inhibit System Recovery |
| 威胁行为者 ID | 根除 | **T1083** – File and Directory Discovery |
| 恢复决策 | 恢复 | **T1489** – Service Stop |
| 事后处理 | 经验教训 | **T1567** – Exfiltration Over Web Service (double-extortion) |
## 评分标准
你的 `total_score` 会与 `max_possible_score`(每个场景中
**最佳**选项的总和 —— 每个场景 50 分)进行对比。百分比
映射到字母等级:
| 等级 | 百分比 |
| ----- | ---------- |
| **A** | ≥ 90% |
| **B** | ≥ 80% |
| **C** | ≥ 70% |
| **D** | ≥ 60% |
| **F** | < 60% |
报告还会列出**优势**(你选择了最佳
选项的阶段)、**改进之处**(你未选最佳选项的阶段)、遇到的 MITRE 技术以及基于成绩的建议。
## API 流程
Base URL(本地):`http://localhost:8000`。交互式文档位于
`/docs` (Swagger UI) 和 `/redoc`。
| 方法 | 路径 | 用途 |
| ------ | ---- | ------- |
| `GET` | `/health` | 存活状态 + 已加载的场景数量 |
| `GET` | `/scenarios` | 列出场景摘要 |
| `GET` | `/scenarios/{id}` | 完整场景(学习模式 —— 包含分数/反馈) |
| `POST` | `/sessions` | 开启一个新的模拟会话 |
| `GET` | `/sessions/{id}` | 当前会话状态(下一阶段 + 选项) |
| `POST` | `/sessions/{id}/decide` | 为当前阶段提交决策 |
| `GET` | `/sessions/{id}/report` | 事后报告(完成后) |
### 使用 curl 的演练
```
# 1. 检查 service 是否已启动
curl -s http://localhost:8000/health
# {"status":"ok","version":"1.0.0","scenarios_loaded":2}
# 2. 浏览可用的 scenarios
curl -s http://localhost:8000/scenarios
# 3. 启动一个 phishing session(保存返回的 session_id)
SESSION=$(curl -s -X POST http://localhost:8000/sessions \
-H 'Content-Type: application/json' \
-d '{"scenario_id": "phishing"}' | python -c 'import sys,json;print(json.load(sys.stdin)["session_id"])')
# 4. 检查当前 stage 及其选项
curl -s http://localhost:8000/sessions/$SESSION
# 5. 做出决定(对每个 stage 重复此操作)
curl -s -X POST http://localhost:8000/sessions/$SESSION/decide \
-H 'Content-Type: application/json' \
-d '{"decision_id": "isolate_endpoint"}'
# {"feedback":"Correct...","score_delta":10,"total_score":10,
# "next_stage_id":"credential_check","completed":false,"percentage":20.0}
# ...继续使用:reset_all, segment_network, block_and_preserve, full_forensics
# 6. 完成后,获取 post-incident report
curl -s http://localhost:8000/sessions/$SESSION/report
```
对未知选项或已完成会话做出的决策,
返回 `400`。在会话完成之前请求报告会返回
`400`;未知的会话返回 `404`。
## 在本地运行
需要 Python 3.11+。
```
# 1. 创建一个虚拟环境并安装依赖
python -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
# 2. (可选)配置环境
cp .env.example .env
# 3. 运行 API(带有 hot reload)
uvicorn main:app --reload --port 8000
```
然后打开 http://localhost:8000/docs。
### 运行测试
```
pytest -q
```
## 使用 Docker 运行
```
# Build image
docker build -t ir-simulator .
# 运行它(将 container 的端口 8000 映射到 localhost:8000)
docker run --rm -p 8000:8000 ir-simulator
# 或者覆盖端口
docker run --rm -e PORT=9000 -p 9000:9000 ir-simulator
```
容器启动绑定到 `0.0.0.0:$PORT` 的 uvicorn,因此它可以直接
在注入 `$PORT` 的平台(Cloud Run, Render, Heroku)上运行。
## 项目结构
```
ir-simulator/
├── main.py # FastAPI app: lifespan, CORS, rate limiting, routers
├── api/
│ ├── limiter.py # Shared slowapi Limiter
│ ├── schemas.py # Pydantic request/response models
│ └── routes/
│ ├── health.py # GET /health
│ ├── scenarios.py # GET /scenarios, GET /scenarios/{id}
│ └── sessions.py # session lifecycle + decisions + report
├── engine/
│ ├── loader.py # Scenario loading & validation
│ ├── session.py # In-memory session store & decision engine
│ └── scorer.py # Post-incident report generation
├── scenarios/
│ ├── phishing.json
│ └── ransomware.json
├── tests/ # loader, session, scorer, and API tests
├── Dockerfile
├── requirements.txt
├── README.md
└── SECURITY.md
```
有关部署加固指南,请参阅 [SECURITY.md](SECURITY.md)。
标签:AV绕过, Cloudflare, FastAPI, MITRE ATT&CK, OPA, 安全培训, 网络测绘, 请求拦截, 逆向工具, 靶场