声明:Tide安全团队原创文章,转载请声明出处!文中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途以及盈利等目的,否则后果自行承担!

Fuzzing简介

工控设备主要指PLC、DCS、RTU等控制类硬件设备。工控设备大多是封闭的嵌入式系统,采用专用操作系统(如定制VxWorks、嵌入式Linux等)和特定应用软件,通常对外提供网络接口或串口,不提供任何调试功能。作为一个黑盒系统,工控设备的漏洞检测技术主要有2种:模糊测试和固件分析。

Fuzzing测试是一种通过向目标系统输入大量非预期数据,并监测异常结果来发现安全漏洞的技术,在漏洞挖掘领域有广泛应用。工控设备的模糊测试主要是对设备所使用的网络通信协议进行健壮性测试,以此来发现工控设备的协议组件和功能组件在软件实现中存在的安全隐患和漏洞。

工控设备的通信协议可分为3类:基础通信协议(ARP、IP、ICMP、TCP、UDP等)、通用服务协议(HTTP、FTP、SNMP等)和工业控制协议(ModbusTCP、Ethemet/IP、S7等)。对于基础通信协议和通用服务协议的测试,可采用传统的网络协议模糊测试工具,如Peach、Sulley等。由于工控设备自身的脆弱性,往往在基础通信协议和通用协议测试中就能发现不少问题。

针对工控协议的测试可分为以下2种情况:

(1)对于标准公开的工控协议主要采用基于生成的模糊测试方法,测试人员可根据协议标准和规约,基于特定模糊测试框架开发测试脚本,通过对协议字段进行错误注入、对报文结构进行变异、对报文序列(标识上下文状态)进行变换来检测设备在处理各种异常时可能存在的漏洞。此种方式下,模糊测试的效率和代码覆盖率取决于测试脚本编制人员对工控协议的理解程度以及所使用模糊测试框架的优劣;

(2)对于私有工控协议,一般采用基于变异的模糊测试方法,以捕获的私有协议正常交互数据作为样本,在其基础上进行变异,使生成的测试数据充分不同于有效数据从而导致异常问题的出现。但如果测试数据过于失效,会导致大部分测试数据被系统的浅层,逻辑所丢弃,达不到深入测试的目的。基于变异的模糊测试不需要对协议规约有很深的理解,其效率主要取决于测试样本的丰富程度以及所选用的变异算法。本文将以Modbus协议为例,使用peach进行Fuzzing测试。

下图为工控协议安全分析具体流程图:

Modbus协议解读

1、使用软件ModSim32.exe作为Modbus协议仿真器

2、使用Modbus协议采集工具进行连接,并使用Wireshark抓包

3、查看Wireshark抓到的返回包

数据包的Modbus功能码为03,功能:读取保持寄存器,在一个或多个保持寄存器中取得当前的二进制值。

通过该数据包也可以清晰的看到各个寄存器的值。

4、修改一个寄存器的值,抓取modbus协议数据包,查看写入过程。

数据包功能码:06,其功能为预置寄存器,把具体二进制值装入一个保持寄存器。

MODBUS协议整理—功能码简述

  • Modbus功能码简述

下表列出MODBUS支持的部分功能代码:以十进制表示。

  • 功能码说明:功能码可以分为位操作和字操作两类。位操作的最小单位为BIT,字操作的最小单位为两个字节。

【位操作指令】 读线圈状态01H,读(离散)输入状态02H,写单个线圈06H和写多个线圈0FH。

【字操作指令】 读保持寄存器03H,写单个寄存器06H,写多个保持寄存器10H。

  • 寄存器地址分配

  • 寄存器种类说明

  • PLC地址和协议地址区别

PLC地址可以理解为协议地址的变种,在触摸屏和PLC编程中应用较为广泛。

  • 寄存器PLC地址

寄存器PLC地址指存放于控制器中的地址,这些控制器可以是PLC,也可以是触摸屏,或是文本显示器。PLC地址一般采用10进制描述,共有5位,其中第一位代码寄存器类型。第一位数字和寄存器类型的对应关系如表1所示。PLC地址例如40001、30002等。

  • 寄存器协议地址

寄存器协议地址指指通信时使用的寄存器地址,例如PLC地址40001对应寻址地址0x0000,40002对应寻址地址0x0001,寄存器寻址地址一般使用16进制描述。再如,PLC寄存器地址40003对应协议地址0002,PLC寄存器地址30003对应协议地址0002,虽然两个PLC寄存器寄存器通信时使用相同的地址,但是需要使用不同的命令访问,所以访问时不存在冲突。

S7协议

1、开启S7-PLC仿真器

2、首先尝试读取寄存器的值,发现S7协议的“读取数据”功能码为0x04。

3、尝试写入一个数据,分析其数据包的功能码等信息。

Modbus协议模糊测试

由上面的报文格式可以组包为:4e 00 00 00 00 60 01 06 00 01 00 02

对modbus协议可以组包之后通过peach框架编写Peach Pit配置文件:

设置设备监听模式,有socks模式和ping模式两种。

针对执行过程,通过wireshark抓包可以获取通信数据流量,如图所示:

再次实验,在1:20分开始进行Fuzzing测试,由于使用仿真器进行Fuzzing,所以于1:25分手动将Modbus协议仿真器关闭,查看peach日志。

已标记出现Fuzzing失败的时间点。

总结

工控协议使用不当可能会导致目标 PLC、DCS、RTU 等设备出现宕机、不可重启等问题,采用基于 Fuzz 的方法可以快速高效发现 PLC 宕机类漏洞。

声明:本文来自TideSec安全团队,版权归作者所有。文章内容仅代表作者独立观点,不代表安全内参立场,转载目的在于传递更多信息。如有侵权,请联系 anquanneican@163.com。