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