专栏名称: 看雪学苑
致力于移动与安全研究的开发者社区,看雪学院(kanxue.com)官方微信公众帐号。
目录
51好读  ›  专栏  ›  看雪学苑

工控安全入门之Modbus

看雪学苑  · 公众号  · 互联网安全  · 2017-07-07 17:58

正文

请到「今天看啥」查看全文


图5‑3 Modbus 功能码

作为较旧的协议,Modbus 缺少大多数现代化的安全功能,甚至无法抵御诸如未经身份验证的命令发送和数据包重放之类微不足道的攻击。使用每个功能代码,数据包的数据部分发生变化,因此它包含正在请求的适当信息。作为示例,在功能码1的 Modbus 线圈的读取请求中,数据包的数据部分包含参考号,即开始读取的点和要读取的线圈数。图5‑4是 Wireshark 中的一个示例 数据包:

图5‑4 Modbus 请求响应示例

有多种读写Modebus线圈和寄存器的技术。你可以使用像Python这样的编程语言来手工处理数据包,因为数据包非常简单,而且有pymodbus这样的库来帮助你构建,接收和解析数据包。另一个使数据包操作变得简单的工具是scapy(http://www.secdev.org/projects/scapy/)。当然,在大多数情况下,最简单和快速的方法是使用已经实现Modbus协议的客户端工具。这里推荐一个适合渗透测试人员使用的工具,modbus-cli(https://github.com/tallakt/modbus-cli)。它允许你使用简单的命令来读写线圈和寄存器,如下图5‑5所示:

对Modbus设备进行渗透测试的一个难点,是需要找出每个线圈和寄存器对应的功能是什么。与很多协议不同,Modbus协议不会记录读写的值的意义。根据你的目标,你可以执行更多的测试,来收集更多设备执行逻辑的信息。利用CybatiWorks(https://cybati.org/cybatiworks)等模拟器系统,您可以尝试在非生产系统上执行测试和收集信息。通过使用人机界面(HMI),更改线圈和寄存器的影响变得更加明显。下面我们使用CybatiWorks模拟一个交通灯控制面板的示例,它的HMI非常简单,您可以看到系统处于自动模式。

图5‑5 查看寄存器

图5‑6 存储模式信息的寄存器

图5‑7 Cybatiworks模拟器

通过修改设置和遍历查询寄存器的值,你可以定位哪个寄存器与系统的模式设置相关联(这个过程比较像做游戏破解时CE的行为)。这个过程会花一些时间,而且当你查询系统中无效的地址时还会导致错误。如下图5‑7所示,通过上述步骤,我们发现设置寄存器%MW4的值为1,令系统处于自动模式,以使指示灯以给定的频率发生变化。

你可能想要更改系统的模式,从而使设备不会定时的改变交通指示灯。为了达到这个效果,你可能想要修改寄存器%MW4的值为零。但在这个例子中,这个设备并不能通过一次数据写来关闭自动模式。通过测试,我们认为这种现象可能是设备的内部逻辑导致的。要想关闭自动模式,一个特定的指示灯需要先被打开。我们使用写入命令,反转所有寄存器的值,但除了%MW3。之所以保留%MW3,是因为%MW3映射到了HMI上的闪烁按钮,无论其它寄存器是什么状态,只要%MW3被置位,所有指示灯将闪烁。完成上述步骤后,再将%MW4置为零,将禁用HMI中的设置。下图5‑8显示了写命令发出后,值的修改状况







请到「今天看啥」查看全文