bariskececi/mirage

GitHub: bariskececi/mirage

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

Stars: 4 | Forks: 0

# Mirage ![Mirage 演示](https://static.pigsec.cn/wp-content/uploads/repos/cas/80/8069b1fc5a080bc3579e179e2a05202dea240d2661c16e16b326f1549f1edaa7.gif) **在 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/` 中;你可以添加自己的配置来模拟变电站、包装线或楼宇自动化控制器。 ## 控制台 ![Mirage 控制台](https://static.pigsec.cn/wp-content/uploads/repos/cas/36/36433c094686ec8b21f059de0984013c435a17eca7bb94d7ff3a835aa0148572.png) 一个深色风格的 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, 威胁情报, 安全防御评估, 实时处理, 密码管理, 工控安全, 开发者工具, 态势感知, 插件系统, 蜜罐, 计算机取证, 证书利用, 请求拦截, 逆向工具