一、背景
在如今的工业系统漏洞挖掘中,大规模自动化的Fuzz技术越来越流行,Fuzz技术成为挖掘工业系统漏洞的有利工具。然而,这种技术往往针对的是服务端,例如Fuzz目标为PLC、模拟器、HMI、上位机的服务等。而针对客户端的Fuzz技术确很少人提及。本文从实战出发,以施耐德的上位机软件Unity Pro作为例子,通过被动式Fuzz技术发现存在UMAS客户端协议栈中的漏洞。
1.1 Unity Pro
Unity Pro是M340/M580对应的上位机软件,通过该上位机软件可以进行PLC编程,上传和下载工程。该软件和PLC之间是通过施耐德私有的UMAS协议进行通信,由于该协议比传统的modbus复杂得多,有可能在协议栈的实现会出现安全性问题。
1.2 UMAS协议
UMAS协议是modbus协议的上层协议,使用的是90功能码,也称“施耐德90功能码”协议。该协议比普通的modbus协议权限要大,能执行更多敏感操作,比如启动或者停止等。对于施耐德PLC来说,曾经爆出很多个存在于UMAS协议上的问题,然而基本上是服务端协议处理导致的拒绝服务。对于服务端的Fuzz,最简单就是使用boofuzz一类工具进行Fuzz,但是对于客户端,就需要另一种方法进行Fuzz。UMAS协议如下图所示:
二、Fuzz实战
2.1 主动Fuzz
顾名思义,主动Fuzz是针对服务端主动发包,通过预定义的一些协议字段填充变异值进行Fuzz,或者直接变异发送的数据。
2.2 被动Fuzz
之所以叫被动Fuzz,是因为是在服务器对客户端发数据包响应的时候,通过中间人攻击的方式修改响应包数据,而不是主动变异数据包来发送。通过这种方法可以直接Fuzz客户端,发现客户端在处理数据的时候的安全性问题。
三、被动式Fuzz实战
3.1 中间人
前面介绍了被动式Fuzz是通过中间人来实现的,那么在unity pro中如何进行中间人攻击?通过简单设置连接IP为127.0.0.1。
然后在本机上运行中间人攻击脚本,只需要修改响应数据,发送数据不需要修改。
3.2 变异
变异策略可以是多种多样的,比如最简单的比特位反转。这里采用最简单的单比特反转,随机修改某一位,值得注意的是应该修改UMAS协议中的payload部分,而不是数据包头。
3.3 自动化
最简单的方法就是使用一些模拟按键的方法触发客户端的操作,执行一些读/写值,上载和下载工作等这些操作,这样可以完全实现自动化而不需要人工操作。当然,如果为了追求更高的Fuzz速度,可以通过注入dll的方法调用不同的发包函数来自动化该流程,不过这种方法需要大量的逆向工程。为了简单起见,这里选取最简单的模拟按键,编写按键脚本进行自动化操作。
四、发现漏洞
在不到5分钟的情况下,通过被动式Fuzz使得unity pro客户端直接崩溃。
通过调试分析发现该漏洞是堆缓冲区溢出,可能会导致拒绝服务甚至远程代码执行,总得来说这个漏洞危害是比较大的。该漏洞已经上报给施耐德官方,目前施耐德已经确认了该漏洞的存在。
五、利用场景
在实际的攻击中,可以在以下不同场景中利用该漏洞:
- 当攻击者控制了网关之后,可以通过该漏洞对unity pro客户端发起攻击。
- 当攻击者通过内网中的IP劫持,如ARP攻击来劫持会话从而发起攻击。
- 通过社工的方法欺骗受害者连接恶意的PLC服务端也可以对该漏洞进行利用。
六、结语
本文通过施耐德unity pro作为例子,详细介绍了使用被动式技术发掘客户端漏洞的技术。可以看到出来,虽然施耐德在服务端修复了很多漏洞,但是客户端由于很少人去进行深入研究,所以客户端仍存在着相对较多潜在的安全问题。本文是为数不多的对工控软件使用被动Fuzz技术的文章,希望给大家带来一些技术上的启发。