urjasec/ot-security-lab-scripts
GitHub: urjasec/ot-security-lab-scripts
基于 pymodbus 和 OpenPLC 的 Modbus TCP 安全实验脚本集,用于搭建 OT 安全实验室并复现商用 HMI 对 PLC 的读写操作。
Stars: 0 | Forks: 0
# OT 安全实验室脚本
**第 20a 部分:构建你的 OT 安全实验室** 的配套脚本 —— 这是一份使用 OpenPLC Runtime v4 和 pymodbus 搭建 Modbus TCP 实验室的实操指南。
这些脚本完全实现了商用 HMI(Ignition、WinCC、FactoryTalk)在底层的操作 —— 通过 Modbus TCP 读写 PLC 寄存器。在本系列的后续部分中,同样的脚本将化身为攻击工具。
## 实验室架构
```
┌──────────────────────┐ ┌──────────────────────┐
│ Ubuntu Server VM │ │ Kali Linux VM │
│ OpenPLC Runtime v4 │◄─Modbus──►│ These scripts │
│ 192.168.186.102 │ TCP:502│ 192.168.186.101 │
│ :8443 (API) │ │ │
└──────────────────────┘ └──────────────────────┘
```
## 脚本
| 脚本 | Modbus FC | 功能 |
|--------|-----------|-------------|
| `modbus_read.py` | FC1, FC3 | 读取线圈和保持寄存器(单次执行) |
| `modbus_write.py` | FC5, FC6 | 写入线圈或寄存器(通过 CLI 参数) |
| `modbus_poll.py` | FC1, FC3 | 连续轮询循环 —— 类似于真实的 HMI |
| `motor_start_stop.st` | — | 用于 OpenPLC 的 PLC 程序(结构化文本) |
## 设置
```
pip install -r requirements.txt
```
修改每个脚本顶部的 `PLC_IP`,使其与你的 PLC 的 IP 地址相匹配。
## 用法
```
# 读取所有寄存器和线圈
python3 modbus_read.py
# 启动电机 (写入线圈 0 = ON)
python3 modbus_write.py coil 0 1
# 停止电机 (写入线圈 0 = OFF)
python3 modbus_write.py coil 0 0
# 将保持寄存器 0 设置为 500
python3 modbus_write.py register 0 500
# Continuous polling (Ctrl+C 停止)
python3 modbus_poll.py
```
## PLC 地址映射
| OpenPLC 地址 | Modbus 类型 | FC | 变量 |
|----------------|-------------|-----|----------|
| `%IX0.0` | 离散输入 | FC2 | StartButton |
| `%IX0.1` | 离散输入 | FC2 | StopButton |
| `%QX0.0` | 线圈 | FC1/FC5 | Motor |
| `%MW0` | 保持寄存器 | FC3/FC6 | Setpoint |
| `%MW1` | 保持寄存器 | FC3/FC6 | Speed |
## 博客系列
**https://medium.com/@urjasec**
属于 OT/ICS 安全博客系列的一部分,涵盖工业协议、攻击技术和防御策略。
## 许可证
MIT
标签:HMI仿真, ICS安全, Modbus TCP, OpenPLC, OT安全, PKINIT, PLC编程, PLC通信, pymodbus, SCADA安全, 寄存器读写, 工业控制系统, 工业网络协议, 工控安全, 工控靶场, 操作技术(OT), 数据展示, 红队, 线圈操作, 结构化文本(ST), 网络攻击模拟, 逆向工具