工控安全漏洞挖掘之路面临万重“山”:缺乏相关设备,无工控实践环境,研究者知识储备不足,公司经费支持方面不足等。面对这些问题,议题分享者将结合过去的工业控制系统的漏洞挖掘思路,以及自身在做工业控制系统漏洞挖掘的过程中,所采取的各种探索方式、通过协议通信分析、流量抓包伪造篡改、攻击脚本编写、工控软件逆向、工控 app 逆向分析、模拟仿真、fuzz 测试等角度。
以及最终有效获取漏洞,并获得漏洞编号的方式进行阐述,并对工控软件漏洞挖掘的基本思路和方法进行描述,从工控软件采购,模拟仿真,工控梯形图的分析,逆向分析,以及工控流量分析、工控安全人才培养以及安全体系建设等角度对工控安全问题进行阐述。
下面就让我们来回顾看雪·第七届安全开发者峰会(2023 SDC)上《轻舟“难”过万重山——工控漏洞挖掘的探索实践》的精彩内容。
长期致力于工业控制系统漏洞挖掘,研究方向为移动安全、工控安全、逆向分析。具有多年攻防竞赛参赛与命题经验,挖掘过多个工业控制系统漏洞,拥有多场攻防竞赛出题经验(逆向工程、移动安全、工控安全方向)、拥有丰富的企业,院校及个人网络攻防培训经验。
各位嘉宾、专家大家上午好,我是来自山石网科安全技术研究院的刘洋,今天分享的议题叫“轻舟难过万重山-工业控制系统漏洞挖掘”,那么究竟“难”在哪里?我这里会给大家进行一个讲解,主要是我对于工控漏洞挖掘的一些探索和实践。我个人的职位是安全研究员,平时会接触一些攻防竞赛、命题、出题、比赛的参赛等,研究方向是逆向工程、工业控制系统安全,还有二进制漏洞挖掘。
整个工控安全领域的研究还是要涉及到逆向,不光涉及到工业控制系统,还涉及到移动安全,还有其他的一些知识点。
议题围绕4点,第一个是工控安全研究的基本介绍和相关研究背景,第二个是研究难点,第三个是相关解决方法和思路,最后是探索实践。
先看第一点,日常我们使用的自来水,灯光,电力设施,还有平时用的化妆品,一些医疗的药品,都是需要一些工厂,包括很多车企车辆的制造工业以及加工厂等运输系统,也包括我们的交通信号灯,汇集了我们生活的各方各面,背后都要用到工控设备。
总结来说工控系统可以分为PCS、 DCS、 SCADA这三种,我们的研究目标就是针对这三种不同的系统做一个系统的安全分析。先来看一下过去国际上出现的重大工控安全事件:2010年的时候,震网病毒问世,它就是世界上首个针对工业控制系统的病毒。蠕虫病毒造成的影响让整个伊朗国家的核设施计划瓦解掉了。
第二个就是2012年的火焰病毒,在中东地区大范围的传播。也造成了很多重大影响。紧接着就是乌克兰的电厂大规模停电,140万的居民被迫停电。2021年美国的东部石油管道被攻击,黑客把整个美国东部的石油管道勒索,造成了大量的石油供应链中断,油价大涨。以上都是工控安全领域的一些著名案例。
我们国家针对工控安全提出了诸如《关键基础设施保护条例》,《网络安全法》、《数据安全法》等法律法规,其中针对安全PLC的相关标准都有相应的出台。
随着OT系统与传统IT的融合,还有工业4.0等概念的提出,导致我们的工业控制系统网络架构非常的复杂。IT系统是传统互联网,OT就是工业控制系统。
OT、IT要融合会涉及两个问题,从我们安全企业角度来讲,我们要保护工控系统不被攻击。首先面临的第一个难点:采购研究设备困难,面临的工控设备品类非常多,比如说国际大厂诸如西门子、施耐德,三菱等,它的每一个品牌都会对应不同的产品线,作为研究员不可能为了安全研究把所有品牌都买回来一套。
第二个难点:设备单价非常高,像过去西门子S7型号的一个PLC,其二手价格基本上都在1000块钱一个,但是买回来一个单独的PLC是没有太大价值的,需要构建出整个工控网络还是比较困难的,还需要买网络模块、存储模块等,所以这是第二个面临的问题。
第三个难点:作为安全研究人员,知识面相对来说还是比较狭窄的,比如说过去最开始做安全研究,以Web安全为主,之后从事逆向、移动安全研究等,再到后来工控安全研究。那对于自动化专业该领域的知识肯定没有相关行业的专家研究更熟络。
无论是作为拥有工业控制系统的厂商,还是其它企业,都面临安全意识的薄弱的问题。第二点就是安全体系建设的单一,最开始设计的工业控制系统,由于OT系统是独立的,且跟互联网是单独隔离的,就单纯认为其整个系统是绝对安全的,这种观念是错误的,通过分析震网病毒就知道实际情况并不是预想这样。第三点就是安全开发能力不足,可能要基于原有的PLC上位机软件进行一些补充维护、赋能操作,研发人员可能会写一些未经代码审计、有安全风险的有bug的一些代码。
作为二进制安全研究人员在研究这些工控PLC固件或者其组件、工控软件时,会遇到了如下问题:第一个问题就是有的工控软件有混淆,有的软件通过LLVM这种编译器,通过优化之后,使用IDA查看伪代码难以直接逆向和还原源码。
第二个问题就是有花指令,有反调试等。第三个问题是其函数调用关系复杂,像这个龙卷风图一样,这个是火焰病毒函数调用关系图。之前,国际安全厂商分析火焰病毒,最后得到了一个函数之间调用逻辑关系图,要分析一个函数,就得抽丝剥茧,代码调用关系的上下游都要看,会发现这个函数凭一己之力短时间内将它分析出来,几乎不可能。
尤其是针对软件有OLLVM控制流平坦化这种混淆很难直接去分析。对于我们来说难度太大、工程量巨大、人力成本极高。
软件逆向方向走不通,那么从协议分析的层面来分析,目前的工控协议主要是以下三种:第一种是公开标准协议,比如国际通用标准的 modbus协议、DNP3协议、IEC104的电力系统协议。
第二种就是私有公开的协议,私有公开就是厂商他自己开发出来的协议,而且提供了开发文档,这个是便于调试以及跟其他厂商产品进行兼容的。比如三菱系统的欧姆龙FINS协议,就属于私有公开协议,厂商自己的设备,在通信过程当中会产生大量数据包文。而西门子的S7协议,虽然属于私有不公开协议,但大家可以在网上找到很多关于西门子S7协议的分析。
协议分析的难点在于针对私有不公开协议的设备。类似霍尼韦尔这种国外厂商的工控系统,研究者发现这以上三种方法都没进行测试。要进行工控安全漏洞的挖掘,想要找到霍尼韦尔或者其他厂商的一些漏洞难度较大。
首先从modbus协议开始,该协议有一定的脆弱性,起初这个协议是1979年提出来的,它是通用标准,基于以太网(TCP/IP)的分布式应用,TCP协议刚刚我们段教授也讲了,它有协议自身的一个限制性、局限性。协议头可能健壮性不够,modbus设计之初,可能一个报文只能接收500多个字节,我们可以通过Peach写Pit脚本或者使用其它模糊测试工具进行fuzz,短时间内发送大量的报文进行协议测试,就会让PLC设备 crash掉,工控设备一旦停掉,造成的拒绝服务影响就非常之大了。
我在研究霍尼韦尔的时候做以上研究实践,结果都无疾而终,没有任何成果,在霍尼韦尔这套设备是没法去直接通过协议fuzz的方式去获取漏洞的。
接着就是上位机的运行环境,既然从抓包的角度没法进行协议分析,尝试对上位机软件进行逆向。但是函数调用关系复杂,逆向工程量巨大,困难重重,短时间内没法解决。
那么Wireshark它既然能解析除了常规的协议,部分工控协议也能解析,可以使用Wireshark来解析工控协议格式中的功能码,或者参考互联网上其他安全研究人员的研究文章。
这是工控现场获取到一个数据包,协议中有功能码,其功能码就是读对应的寄存器的值,并进行赋值操作,点位对应的值都是可以直接看到,说明这个协议是没有进行任何安全加密,非常的不安全。如果黑客发送了底下这一串数据, 这个payload在互联网上可以找到,一旦发送出去,只要是对应的工控协议,工控厂商整个运行环境就会被停掉。
接着,Wireshark的源码当中,我们可以看到比较早期的诸如西门子的H1协议,这个是针对于西门子的S5设备,非常古老,可能1980年左右开发出来的一套工控系统,Wireshark也可以解析。包括电力系统的IEC104协议、西门子的S7协议。
在协议头内可以看到对应源码,Wireshark既然能解析这个协议,底层源码是C语言写的,可以看到函数调用关系,比如西门子的PLC功能码0x29,那么我们清楚的知道一旦发送0x29,在协议报文中被构造出来,它就可以对西门子PLC在进行停机操作。
很多安全厂商都把功能码操作集成在对应的安全产品中。类似于西门子的确认报文,其用户数据段的内容也是明文可见的。包括其它设备诸如电梯楼宇自动化、将来整套智慧的智能家居,在未来的研究过程中。协议层面也依旧会存在一些安全隐患,我们也可以沿用工控安全研究协议分析的这种思路去做。
开源工具ISF它对工控系统的安全测试也非常重要,该工具它可以直接对诸如S7-300型号和S7-400型号的PLC进行控制,可以执行停机指令,也可以进行重启操作。如果黑客具备MSF的使用经验,就可以去一个工控厂商去使用ISF脚本,如果是相对应的工控设备就会发生严重的问题。
起初我们通过研究modbus协议能对工控协议的脆弱性有初步的认识,且互联网上都有相关的公开研究内容,可以按照之前这种研究思路去尝试,挖掘艾默生这种设备时,其思路一致的。
还有基于TCP通讯的fuzz技术,对协议的健壮性进行测试,还有从Windows系统上的上位机软件入手,三个方向耗费了约大半年的时间进行了测试,多次结果都是失败告终,失败后又重新测试,这就是工控安全研究面临的万重“山”。
接着我就在想,是不是自己的研究思路有问题。“他山之石,可以攻玉”,就去看看国外研究人员是怎么研究漏洞的,是如何取得那么大成就的。我们都知道pwn2own大赛,汇聚了全球的一些顶级黑客,也关注到有一个pwn2own迈阿密赛事。迈阿密赛事应该是2020年左右才开始逐步的去接受选手比赛报名,pwn2own迈阿密赛场中选取工控设备及工控软件给选手作为攻击靶标。
pwn2own迈阿密它主要是让全球顶级黑客去测试工控产品当中是否存在漏洞。
ICONICS是美国的一家工业自动化供应商,1986年成立,主要是给石油、炼化、汽车、楼宇、天然气、废水处理、可再生能源等行业提供工业自动化服务。该公司的产品被作为选手测试的一个目标。在2020年的比赛中,选手针对暴露的网络服务进行漏洞测试,针对该产品进行安全测试,选手通过WCF技术,客户端执行了对应的SQL语句,通过WCF任意执行SQL命令。通过命令执行的漏洞获取到2万美金的奖金。
当时就在想,要研究工控漏洞,针对工控软件有没有一些不被别人知道的较为小众的一些组件,或者说一些其他类似这种第三方组件的技术。紧接着2022年pwn2own迈阿密赛场中的另外一个队伍,他们是从另外一个角度去挖掘漏洞的。
将工控程序安装好之后,从文件格式的角度去考虑。该程序的文件格式是一个软件ISO安装镜像,用户可以通过镜像文件进行安装,安装过程中可以生成demo文件。从镜像文件入手,去看整个系统的文件当中的代码是否存在注入漏洞、以及其它安全风险。首先第一个点看有没有这种像Java反序列化、PHP反序列化等这种序列化的风险。
发现对象在打开文件的时候会发生一个序列化,主要序列化的点主要是在以上区域。
代码中的type类型,使用的是JScriptNet这样的类型,平时很少有开发者去使用这样的一个编程语言。
通过维基百科查找,发现该语言是由微软开发,是针对于.net的一个衍生,可以进行一些函数的处理。函数处理中有的函数对于我们安全研究员来讲异常敏感。比如说exec,execute,system等。
接着去打开对应的项目文件,发现需要账号登录,这里尝试能否进行绕过。
该软件生成的除了默认文件,它对应的同项目文件目录中还有一个模板文件,后缀为tdfx,而这个文件它可以由软件直接打开,不需要任何登录,且在对应的标签里可以插入JScriptNet语言代码,此时身份认证已经被绕过。
接着通过翻阅开发手册,可以看到用户可以自己定义JScriptNet代码,用户可以去写一些自动化插件化的代码来实现对应的功能。
比如上图中写的一个demo,使用JScriptNet对应的语法,写了这样一个弹窗。
接着就可以构造代码去做一个命令执行的操作,只需要写这两行代码就获得了2万美金的奖金。从我们研究者角度来讲,这两行代码很容易理解,只要稍微相关编程语言的语法,然后调用这个函数去执行相关代码,就可以进行命令执行,弹出计算器。pwn2own是直接承认以上操作,是属于漏洞的,直接给奖金而且记了20个大师分。所以有的时候研究者的思路需要被打开,还是需要持续进步的。
针对文件格式的相关漏洞研究及测试也是一个非常好的方向,可以看到UAF漏洞、越界写、栈溢出等。以上是针对 CX-Programmer这个工控软件去做的漏洞挖掘。
这是另外一个非常著名的工控系统漏洞,通过审计代码发现,程序代码在校验用户的用户名和密码的时候,没有校验密码。
黑客只要伪造一个token,就可以获取到系统权限。
我们回到研究最开始的部分,震网病毒的解构,发现涉及的内容包括 STL,即工控梯形图,电气工程师使用STL给 PLC进行编程,而我们一般的程序员是不会特意去学梯形图相关操作的。
紧接着还有DLL注入,震网病毒最后其实是通过被人带进去的U盘进行“摆渡”攻击进入到对应厂区,通过去寻找对应的操作系统上是否安装WinCC软件,有没有安装 step 7这种西门子的上位机软件,如果有的话,用DLL注入这种方式直接把对应的恶意代码注入到对应系统。DLL劫持程序后再将病毒进行扩散。当时的网络状况肯定是OT和IT相分隔,但是U盘“摆渡”攻击打破了所有的网络隔离界限。
回到最开始霍尼韦尔的安全研究,从协议角度我们发现协议中有大量的TCP报文,协议内还有对应的data数据报文,由于Wireshark的源码里是没有专门针对这个协议的解析。通过研究发现它的协议是基于 FTE的网络架构,最终实现的一个效果能获取到该设备的型号以及它的一些功能处理信息,属于一个漏洞。回到震网病毒中的DLL劫持,可以设想一下,如果说某个厂商他用了这样一套设备,系统正常运转能正常打开对应的工程文件,但是黑客通过研究这个程序的漏洞,去构造DLL劫持,或者去劫持上位机运行环境,比如劫持Windows系统的组件等。
可以看到攻击者构造了两个dll。在软件目录中放入构造的DLL恶意代码,然后就会发现程序已经被劫持。针对不同的工控系统行业,其工控软件一旦被劫持,其项目工程都无法打开,势必会对整个工厂的正常运转造成一些影响。
针对工业APP的逆向也是重点研究方向,这是过去国外的一套工业APP,该程序是没有进行加壳、混淆,而且核心逻辑都是通过Java编写,不通过so层做处理。通过Java的代码审计,可以轻松查询到 IP地址,及其连接的502端口。其协议使用的就是modbus协议。该工业APP的功能实现,就可以用手机来实时监控整个厂区的一个运行状态,包括点位,温度。未来工业APP的安全研究应该也是个趋势。
国外有很多非常顶尖的工控安全研究员,通过分析这些研究员,也能获取到不少漏洞挖掘的思路。首先就是这些研究工控安全的人员他是什么出身,他们是如何做到在短时间内挖掘到大量工控漏洞的?诸如通过今年BlackHat的议题,就能学习到他们研究opc-ua工控设备的攻击思路。通过领英也能够找到其团队成员的履历,包括这个团队的基本信息,Team82团队短短几年时间就挖出了上百个工控漏洞。
网络安全的竞争归根结底是人才的竞争,工控安全竞赛的举办也极大的推动了相关人才的培养。诸如本次全国总决赛中的这道题目,考核选手的综合能力。
第一个点,就是要通过逆向分析。首先进行Base64解码,拿到题目描述中的第一个key值,但第二个key值没法直接逆向拿到,通过写爆破脚本,最终爆破获取得到第二个值,之后填入到题目中的梯形图里,仿真得到最终结果。这道题要考察传统网络安全中的逆向分析能力,编码解码能力,电气工程师的梯形图编程仿真能力。所以我觉得未来的工控网络要实现IT、OT的融合,就需要这方面的人才。电气工程师要掌握网络安全的知识,网络安全的人员要去掌握工控的知识,这样才能达到轻舟已过万重山。
之后最好是达到乘风破浪会有时,直挂云帆济沧海”的这样一个局面,我也觉得未来是非常明朗的,尤其工控安全行业。说完了工控安全人员所应该剧本的基本素质和要求,那就说一下工控安全的人员究竟如何去招聘,需要哪些人才。
CTF竞赛其实蛮关键的,因为我们在研究一些工控软件的时候,一些混淆加壳,如果没有相关经验,第一次接触就不会有任何头绪。但是通过CTF竞赛当中有些题目,其涉及到加壳混淆、花指令等,通过平时的小练习来积累经验。以小胜积大胜其实是可以解决这些问题的。当然也需要Web安全研究人员,一些工控系统的配置项目是放在网站页面上的,需要Web安全研究人员从渗透测试的角度去找漏洞。我们也需要有做Pwn的二进制漏洞挖掘人员。
从二进制漏洞挖掘的角度去挖掘工控系统漏洞。也需要有Misc这种发散型的思维和头脑。更需要逆向底层的安全研究,尤其是PLC编程、协议分析、固件逆向、漏洞挖掘、PLC编程等角度进行安全研究。所以对人员能力的要求还是比较综合的,并且要具备快速学习的能力。
*峰会议题PPT及回放视频已上传至【看雪课程】https://www.kanxue.com/book-leaflet-171.htm
PPT及回放视频对【未购票者收费】;
【已购票的参会人员免费】:我方已通过短信将“兑换码”发至手机,按提示兑换即可~
《看雪2023 SDC》
看雪安全开发者峰会(Security Development Conference,简称SDC)由拥有23年悠久历史的顶尖安全技术综合网站——看雪主办,面向开发者、安全人员及高端技术从业人员,是国内开发者与安全人才的年度盛事。自2017年七月份开始举办第一届峰会以来,SDC始终秉持“技术与干货”的原则,致力于建立一个多领域、多维度的高端安全交流平台,推动互联网安全行业的快速成长。
原文始发于微信公众号(看雪学苑):2023 SDC 议题回顾 | 轻舟“难”过万重山——工控漏洞挖掘的探索实践