-
-
[原创]看我如何挖到国产工控软件的十几个漏洞
-
2020-9-25 10:19
12185
-
背景
在工控系统安全越来越重要的今天,工业自主可控化成了越来越重要的方向,为了提前发现现在存在国产工控软件存在的安全漏洞并且进行修复,所以这次选取了中国市场占有率最大的SCADA软件进行漏洞挖掘,在该产品上面发现了十几个严重的安全问题后,并第一时间上报给CNVD,现在所有漏洞已经得到了及时的修复。本文从实战出发,以该款软件作为例子,来介绍安全评估思路。
研究方法
能够远程触发的漏洞往往比能被本地触发的危害性要高,所以为了尽最大可能挖掘危害性高的漏洞,应该先从暴露的端口出发,分析对应的服务以及协议:
从上面可以看到,该SCADA软件暴露出多个端口,可以说每个端口都是一个攻击面,除了一个http端口外,其他都是私有的协议。
逆向分析
为了了解每个端口对应的服务,需要调试分析,但是有些数据包往往需要在特定的环境架构中才能产生,譬如说历史数据库的协议数据包必须设置数据库地址才能产生,而其他的官方未披露的服务只能通过逆向调试确定。在调试之前,可以编写并运行一个测试脚本,该测试脚本会向指定端口发送一个数据包,在服务端通过下recv之类的断点就能找到解析的地方。
fuzz测试+手动审计
1.手动对危险函数进行审计,分析每个功能码对应的处理逻辑,即可在审计阶段把能够用肉眼看到的漏洞挖掘出来。
2.通过对抓取的数据包进行变异,结合逆向出来的报文格式,编写模糊测试模块进行模糊测试(Fuzz),模糊测试的效果取决于种子数据的好坏和协议的复杂度。
漏洞挖掘
通过上面提到的研究方法发现了十几个严重的安全漏洞,超过半数都是远程拒绝服务漏洞。这里选取了几个典型例子,来简单介绍一下相关的安全问题。
工程密码绕过
为了防止其他人员对工程进行修改,在该系统中可以对多个工程进行分别加密。当进入一个有密码的工程时,必须输入正确密码方可进入开发系统,否则不能打开该工程并进行修改,从而实现了该软件的安全管理。
在分析工程加密功能的时候发现该加密机制存在缺陷,可以很简单地绕过密码保护机制:
远程拒绝服务
通过几个小时的Fuzz测试,发现了存在于该软件网络中间件S**A.dll中的栈溢出漏洞。经过分析,该漏洞无法劫持控制流,只能造成远程的拒绝服务。
该组件在校验长度字段时没有考虑负数的情况,就导致攻击者可以恶意构造长度字段,绕过长度检查。
该漏洞发生在网络中间件,由于该厂商旗下几乎所有的软件都使用了该组件,影响会非常大,该漏洞会直接导致产品可用性完全丧失,这个可以称为工业系统“核弹级”漏洞,破坏力巨大。
目录穿越
该软件中并不是所有组件都用C/C++编写,还有一部分使用了nodejs来提供http访问的能力,然而在获取文件路径时,没有对恶意字符”..”进行过滤,出现了目录穿越漏洞,导致任意文件读取。
通过该漏洞,可以读取配置文件,攻击者可以通过该配置文件登陆系统来获取工业控制系统的控制权限。
未授权访问
在进行手动审计的时候,发现一个对外端口提供了读/写变量的能力,而且没有任何登陆校验。攻击者可以远程读取/修改SCADA系统中的变量值(例如温度、压力、开关阀门等),严重危害工业生产安全。
原来关闭的开关,经过修改之后,开关变成打开:
总结
在CNVD通报的大约两周之后,软件厂商对上报的漏洞都出了相应的补丁。国内对工控系统软件的漏洞挖掘文章寥寥无几,本文绝对是为数不多对国产工控软件的漏洞挖掘文章,希望给大家带来一些漏洞挖掘的启发。
[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法
最后于 2020-9-25 10:26
被wmsuper编辑
,原因: