bariskececi/mirage
GitHub: bariskececi/mirage
Mirage 是一个低交互 OT/ICS 蜜网工具,通过模拟 Modbus 和 S7comm 工业协议诱饵来实时捕获、记录和可视化攻击者对工业设施的探测与控制尝试。
Stars: 4 | Forks: 0
# Mirage

**在 30 秒内部署一个虚假的工业工厂。在实时世界地图上观看真实攻击者对它的攻击。**
Mirage 是一个低交互的 OT/ICS 蜜网。它搭建了极具迷惑性的工业协议诱饵——扫描器和入侵组织每天都在探测的 Modbus TCP 和 Siemens S7——为它们提供了一个看似*活跃*的虚假进程进行探测,并将每一次交互实时流式传输到带有实时攻击地图的 SCADA 风格控制台上。
没有任何真实设备会被暴露。诱饵使用合成的进程数值响应读取请求,并确认写入操作,但**绝对不会应用这些写入**,因此当攻击者试图停止水泵时,会得到一个完全正常的“OK”响应,而你 meanwhile 可以准确记录他们试图执行的操作。
```
recon ─▶ [ Modbus :502 ] ─┐
├─▶ capture + enrich ─▶ SQLite ─▶ live console
recon ─▶ [ S7 :102 ] ─┘ (world map)
```
## 为什么需要
互联网上到处都是 HTTP 蜜罐,但对于运行自来水厂、变电站和工厂的协议却几乎没有。与此同时,Modbus/502 和 S7/102 端口日夜都在被扫描。Mirage 的存在让部署 ICS 传感器变得轻而易举:只需一条命令,就能拥有一个可信的工厂,以及一张将背景噪音转化为你可以实际观察、简报和学习的地图。
它专为蓝队、OT 安全研究人员以及任何想要确切知道谁在敲门(探测工业端口)的人而构建。
## 快速开始
**Docker(推荐):**
```
docker compose up --build
# dashboard: http://localhost:3000
# modbus decoy: tcp/502
# s7 decoy: tcp/102
```
**从源码构建:**
```
pip install -r requirements.txt
python run.py
```
想在暴露任何东西之前看看它是如何填充数据的吗?注入演示数据并打开控制台:
```
python scripts/seed_demo.py --count 600 # fabricated events, presentation only
python run.py --dash-only
```
或者在本地驱动实时诱饵:
```
python run.py & # start everything
python scripts/attacker_sim.py # trickle real protocol traffic at 127.0.0.1
```
## 它能捕获什么
每一次交互都会记录其时间戳、源 IP、地理位置、解码后的动作以及原始字节。三种严重程度让信号一目了然:
| 严重程度 | 含义 | 示例 |
|----------|---------|----------|
| `info` | 被动侦察 | 寄存器/线圈轮询 |
| `notice` | 主动指纹识别与会话 | 连接、设备 ID 读取、S7 设置、SZL 查询 |
| `high` | 控制尝试 | 对寄存器、线圈或数据块的任何写入操作 |
`high` 事件意味着有人超越了单纯的查看,并试图*改变*进程。这些才是值得引起警觉的事件。
## 诱饵
**Modbus TCP** — 完整的 MBAP 帧;响应来自实时寄存器映射的读取功能;像真实的 PLC 一样回显写入操作但实际上将其丢弃;响应*读取设备标识* (FC 0x2B/0x0E),以便扫描器将其指纹识别为特定供应商。
**Siemens S7comm** — 真实的 ISO-on-TCP 协议栈 (TPKT → COTP → S7)。完成连接握手,协商设置通信,并响应 SZL 识别查询,返回一个可信的模块订单号。
诱饵的*身份*来自于一个 **persona**。内置的身份是一个市政污水处理厂,具有液位、泵状态、加氯、浊度和 pH 值——这些数值会随时间漂移,因此返回的扫描器会看到一个活跃的进程,而不是一个静态的桩程序。Persona 存放在 `mirage/personas/` 中;你可以添加自己的配置来模拟变电站、包装线或楼宇自动化控制器。
## 控制台

一个深色风格的 SCADA 单页面:
- **实时攻击地图** — 每一个源都以弧线指向工厂;颜色编码了意图(侦察 / 指纹识别 / 写入尝试)。世界底图已内置,因此地图不会发起任何外部调用。
- **交互信息流** — 一个实时运行、带有颜色编码的流,精确显示每个源做了什么。
- **进程模拟** — 诱饵工厂自有的仪表和泵指示灯,实时更新。你可以并排观察攻击者以及他们自以为正在接触的虚假进程。
## 架构
```
┌───────────────────────────────┐
attacker ──▶ :502 ──▶ │ Modbus decoy │
attacker ──▶ :102 ──▶ │ S7 decoy │──▶ event bus ─┬─▶ SQLite
│ (asyncio listeners) │ │
└───────────────────────────────┘ │
▼
┌───────────────────────────────┐ websocket ┌──────────┐
│ dashboard (FastAPI) │ ◀────────── │ console │
│ REST + /ws live feed │ ───────────▶ │ (browser)│
└───────────────────────────────┘ └──────────┘
```
所有操作都在单个进程中的单个 asyncio 循环上运行。没有外部服务,没有消息代理,没有云依赖。存储仅使用单个 SQLite 文件,你可以将其复制出来进行分析。
## 部署说明
- 将诱饵部署在侦察可能会合理触及的地方——OT DMZ、屏蔽网段,或预留作为传感器的公共 IP。**切勿将其直接串联**在真实设备上。
- 标准端口 (502/102) 让陷阱更具说服力。绑定它们需要特权;Docker 设置会为你处理端口映射。要以非特权运行,请将 `MIRAGE_MODBUS_PORT` / `MIRAGE_S7_PORT` 设置为高端口,并在防火墙进行重映射。
- 该传感器在**设计上属于低交互**。它永远不会代理、转发或执行攻击者发送的任何内容——它只会使用合成数据进行回复。
## 配置
全部通过环境变量进行配置(参见 `mirage/config.py`):
| 变量 | 默认值 | 用途 |
|----------|---------|---------|
| `MIRAGE_BIND` | `0.0.0.0` | 诱饵绑定地址 |
| `MIRAGE_MODBUS_PORT` / `MIRAGE_S7_PORT` | `502` / `102` | 诱饵端口 |
| `MIRAGE_DASH_PORT` | `3000` | 仪表板端口 |
| `MIRAGE_PERSONA` | `water_treatment` | 要呈现的虚假工厂类型 |
| `MIRAGE_GEOIP` | `1` | 使用地理位置信息丰富数据源 |
| `MIRAGE_DB` | `mirage.db` | SQLite 路径 |
## 负责任的使用
蜜罐是欺骗工具。仅在你拥有或获得明确授权的基础设施上运行 Mirage,仅捕获发往你自己传感器的流量,并在收集或保留源数据之前检查你所在司法管辖区的法律法规。
Mirage 是被动的:它等待被探测并记录接收到的内容。不要将其指向任何人,也不要将其用于诱饵或设局陷害。
## 路线图
- 更多诱饵:DNP3、EtherNet/IP (CIP)、BACnet、IEC 60870-5-104
- 威胁情报导出:从捕获的源生成 STIX 2.1 和 MISP 订阅源
- Persona 构建器:从真实设备的身份配置文件生成诱饵
- 为物理隔离的分析员工作站提供可选的完全内置 UI
- `high` 事件的告警钩子 (syslog / webhook)
## 许可证
MIT — 查看 [LICENSE](LICENSE)。
标签:Docker, HTTP/HTTPS抓包, OT/ICS, PKINIT, 威胁情报, 安全防御评估, 实时处理, 密码管理, 工控安全, 开发者工具, 态势感知, 插件系统, 蜜罐, 计算机取证, 证书利用, 请求拦截, 逆向工具