h0ru/mbrecon
GitHub: h0ru/mbrecon
针对 OT/ICS 环境的 Modbus TCP 侦察工具,无需事先了解设备寄存器映射即可枚举功能码、发现可写线圈与保持寄存器,并生成带严重等级的结构化安全报告。
Stars: 0 | Forks: 0
# mbrecon
用于 OT/ICS 环境的 Modbus TCP 侦察和安全评估工具。
枚举暴露的 Function Code,映射可写入的线圈,发现保持寄存器,并生成结构化的安全报告,所有这些均无需事先了解目标设备的寄存器映射。
## 为什么
Modbus TCP 没有原生的身份验证。同一网络上的任何主机都可以在无需凭据的情况下读取传感器数据并发送写入命令。`mbrecon` 使这种暴露可见且可衡量,从而为工业控制系统的安全评估生成可操作的发现结果。
## 免责声明
## 功能
- **连接检查** — 在继续之前确认 Modbus 服务是否处于活动状态
- **Function Code 枚举** — 测试 FC01–FC16 并报告哪些被允许或拒绝,包括异常代码
- **线圈映射** — 通过 FC05 识别可写入的数字输出
- **寄存器发现** — 以 125 个为一块对地址 0–999 进行暴力破解,当块读取失败时自动逐地址回退
- **值推断** — 按值范围(摄氏度、开尔文、比率或原始值)对发现的寄存器进行分类
- **安全发现** — 带有严重级别(Critical / High / Medium)和修复建议的结构化报告
- **交互式流程** — 每个阶段均为选择加入,允许针对性运行
## 安装
```
curl -sSL https://raw.githubusercontent.com/h0ru/mbrecon/refs/heads/main/install.sh | bash
```
安装程序将:
1. 检查 Python >= 3.8
2. 通过 pip 安装 `pymodbus`
3. 下载并验证 `mbrecon.py` 到当前目录
### 手动安装
```
pip install pymodbus --break-system-packages
curl -sSL https://raw.githubusercontent.com/h0ru/mbrecon/refs/heads/main/mbrecon.py -o mbrecon.py
python3 mbrecon.py
```
## 依赖项
- Python 3.8+
- [pymodbus](https://github.com/pymodbus-dev/pymodbus)
## 使用方法
```
python3 mbrecon.py [options]
```
### 参数
| 参数 | 简写 | 默认值 | 描述 |
|---|---|---|---|
| `host` | — | 必填 | 目标 IP 或主机名 |
| `--port` | `-p` | `502` | Modbus TCP 端口 |
| `--device-id` | `-d` | `1` | Unit ID / Device ID |
| `--probe` | — | `74` | 用于连接探测的寄存器地址 |
| `--scan-range` | — | `1000` | 寄存器发现的上限(0 到 N-1) |
### 示例
```
# 基础扫描
python3 mbrecon.py x.x.x.x
# 自定义端口和 device ID
python3 mbrecon.py x.x.x.x --port 502 --device-id 2
# 扩展发现范围
python3 mbrecon.py x.x.x.x --scan-range 2000
```
## 输出
```
════════════════════════════════════════════════════════════
MBRECON
OT Security Assessment Tool
════════════════════════════════════════════════════════════
Target : x.x.x.x:502
Device ID : 1
[STEP 1/4] Checking Modbus connectivity...
[✓] Modbus service is ACTIVE at x.x.x.x:502
[STEP 2/4] Function Code Enumeration
[✗] FC01 — Read Coils DENIED (exception code: 2)
[✓] FC03 — Read Holding Registers ALLOWED
[✓] FC05 — Write Single Coil ALLOWED
...
[STEP 3/4] Coil Mapping
[✓] Coil 000: exists and accepts write
[ SUMMARY ]
Allowed FCs : 2/8 — FC03, FC05
Writable Coils : [0]
Authentication : NONE
ADDR INFERRED LABEL VALUE RAW
[0074] Temp_C_01 (C) 27.61 0x41dc 0xdd2e
[0142] Temp_K_01 (Kelvin) 390.42 K (117.27C)
...
[ SECURITY FINDINGS ]
[CRITICAL] No authentication mechanism
[CRITICAL] Unauthenticated write to digital output (FC05 / Coil 0)
[HIGH] Full sensor data exposed without access control
...
```
## 扫描流程
```
mbrecon.py
├── Step 1 Connectivity check → confirm Modbus is responding
├── Step 2 Function Code enumeration → FC01 through FC16
├── Step 3 Coil mapping → writable outputs via FC05 (range 0–31)
├── Step 4 Summary
├── [opt] Register discovery scan → brute-force 0 to scan-range
└── [opt] Security findings & report
```
标签:ICS, impacket, NTLM Relay, OT安全, PKINIT, pymodbus, Python, SCADA, 侦察工具, 关键基础设施, 功能码枚举, 协议分析, 反取证, 哈希传递, 安全评估, 寄存器发现, 工业互联网, 工控安全, 插件系统, 无后门, 权限提升, 检测规则, 线圈映射, 网络安全, 网络资产发现, 逆向工具, 隐私保护