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), 网络攻击模拟, 逆向工具