案例1基础的mobus数据篡改
学习并测试了下 相关内容
mobus协议基本知识
mobus 对象类型 (形象点就是接口类型)
对象类型 | 访问权限 | 大小 |
---|---|---|
Coil | Read-write | 1 bit |
Discrete input | Read-only | 1 bit |
Input register | Read-only | 16 bits |
Holding register | Read-write | 16 bits |
- 协议版本有很多基本都是各种魔改
- 串行和MB +网络中,只有指定为主节点的节点才能发起命令
- 在以太网上,任何设备都可以发送Modbus命令,正常是只有一个节点做这个
- Modbus命令包含设备的Modbus地址(1到247)。只有预期的设备才会对该命令起作用,指定地址才行,对0地址广播就不行,且mobus命令包含校验信息
- Modbus可以自定RTU进行寄存器值控制更改和读取I/o接口
mobus 数据帧 有RTU 等格式,暂时只看TCP 帧格式
Modbus TCP帧格式(主要用于以太网)
名称 | 长度(字节) | 功能 |
---|---|---|
交易标识符(Transaction identifier) | 2 | 用于服务器和客户端的消息之间的同步 |
协议标识符(Protocol identifier) | 2 | 0表示Modbus / TCP |
长度字段(Length field) | 2 | 此帧中的剩余字节数 |
单位标识符(Unit identifier) | 1 | 从站地址(如果不使用则为255) |
功能代码 (Function code) | 1 | 功能代码与其他变体一样 |
数据字节(Data bytes) | ñ | 数据作为响应或命令 |
数据帧中为大端序(网络字节序为大端序)
功能码:
同时wiki 上也有多种协议交互过程
案例一
基于Slave节点仿真模拟程序 对其采用 mbtget工具进行 内存指令篡改
Slave仿真程序
ModbusPal是一个开发基于PC的Modbus模拟器的项目。它的目标是重现一个真实的环境,有许多奴隶和动画寄存器值。ModbusPal中的几乎所有内容都可以通过脚本进行自定义和控制。
特征
- 通过“学习”自动创建模拟环境
- 可以使用Python脚本实现复杂的行为
- 本机支持TCP / IP,RXTX支持SERIAL
- 可嵌入作为第三方库
该程序的基本功能可以模拟mobus slave 进行数据通信运行
通过添加slave 从站 模拟 工控设备
mbtget
mbtget - 用于从命令行进行一些modbus事务的简单perl脚本。
Modbus是一种标准的串行通信协议,用于互连工业PLC(以及许多其他东西)。此模块允许您通过MBclient对象访问此协议的TCP和RTU版本。
安装方法:
git clone https://github.com/sourceperl/mbtget.git
cd mbtget
perl Makefile.PL
make
sudo make install
参数:
-h help
-a 地址选择出 access 访问
-n 读取数量
-r read
-w 写入
-d 转储模式下的
最后需注明 地址
在modbus服务器127.0.0.1上读取地址1000处的字数据
pi@raspberrypi ~ $ mbtget -a 1000 127.0.0.1
values:
1 (ad 01000): 52544.
在modbus服务器plc-1.domaine.net上读取地址1000处的10个字数据
pi@raspberrypi ~ $ mbtget -n 10 -a 1000 plc-1.domaine.net
values:
1 (ad 01000): 52544
2 (ad 01001): 33619
3 (ad 01002): 61010
4 (ad 01003): 11878
5 (ad 01004): 60142
6 (ad 01005): 21714
7 (ad 01006): 14182
8 (ad 01007): 64342
9 (ad 01008): 18511
10 (ad 01009): 59909
在转储模式处于活动状态时,在modbus服务器127.0.0.1上的地址1000处写入333的字值
pi@raspberrypi ~ $ mbtget -w6 333 -a 1000 -d 127.0.0.1
Tx
[10 01 00 00 00 06 01] 06 03 E8 01 4D
Rx
[10 01 00 00 00 06 01] 06 03 E8 01 4D
word write ok
基础案例篡改数据
场景 在 slave 设备 如下控制状态
Coils value 为1值 系统启动正常
其Holding registers 对象 value 9位存储值为 741 当前记录设备运行正常运行次数值
通过脚本 访问其端口可以轻易获取其 Coils 对象 状态值
通过脚本 访问其端口可以轻易获取其Holding registers 对象 9位值
通过脚本 访问502端口对其数据进行篡改
篡改 Coils 对象 1位值为 0
篡改 Holding registers 对象 3位值为 855
常规系统在该操作下会造成故障