西门子、施耐德、罗克韦尔:三大工控厂商PLC密码保护突破之旅

作者:高剑  绿盟科技格物实验室

写在前面

在开始之前,先做一下个人介绍。我现在就职于绿盟科技格物实验室,职位是工控安全研究员,主要研究方向是两个,一个是工控系统及设备漏洞挖掘与分析,另外一个是工控业务场景风险评估与测试,目前已获数十个CVE、CNVD编号,涉及的厂商包括西门子、施耐德、Codesys、Kingview等。

00 前言

01自动化五层架构与PLC密码

02 西门子S7-200/1200/smart密码突破

03 罗克韦尔工控设备密码突破

04 施耐德工控设备密码突破

05 密码保护机制突破思路总结

06 安全设计建议

说明:文中所用方法等仅供学习之用,不可用作它途,否则一切后果自负~

今天我带来的议题有六个方面。因为在30分钟内想给大家传递更多的知识,所以整体内容会比较丰富饱满。

第一部分说一下背景概述,介绍ICS是什么,PLC设备是什么,PLC密码到底是什么。接下来二、三、四部分是抽取了世界知名的三大工控厂商的PLC设备,去探究它们的密码保护机制是如何被突破的,第五部分做一下简要的总结,算是密码保护机制突破的一个思路合集吧。最后的第六部分是我们的落脚点,会谈一下如何设计一套更加安全、更加可靠的针对工控设备的密码保护机制,来抵御一些攻击。

ICS就是工业控制系统。上午的议题讲的都是Windows或者安卓这些,和我们的生活比较贴近,但ICS一出来,大家就要问这是什么东西呀?有的人可能一辈子都没见过这些东西是什么,所以这方面的研究相对滞后一些,或者说关注的人也比较少,还是有门槛存在的。

给大家简单介绍一下,通俗地讲控制工业生产的系统都可以叫做工业控制系统,包含但不限于SCADA、DCS、PLC这些设备或系统等,它的应用领域比较广泛,比如电力、油气、化工、轨道交通、食品饮料、汽车制造、矿山等等,它们都属于国家关键信息基础设施。一旦这些行业的控制系统遭受到了黑客或者敌对势力的攻击,影响的会是我们的国家安全、国计民生、公共利益和社会稳定。正因如此,我国才会频繁出台一些政策,让这些基础设施提高安全阈值,免受一些黑客的攻击。

一般来讲,ICS的体系架构分五层,现场设备层、现场控制层、过程监控层、生产执行层还有企业管理层。我今天要讲的设备位于现场控制层,叫PLC,很多人不知道这个PLC是什么,PPT上给出的是一段非常学术的讲解,我现在用比较通俗的话跟大家解释一下。

PLC就是专门针对工业环境或者是控制需求所制造的一种特殊形态的嵌入式PC系统,它是具有采集、输出、通讯、解算指令、任务调度等等功能的电子设备,也是一个基础的核心单元。一旦遭受攻击,那它所控制的对象,像阀门、电机、机械手臂等都会发生一些误操作,轻则会发生人员伤亡,重则会发生爆炸,出现安全事故。目前为止,PLC设备在我们中国还是依赖于国外的一些品牌,国外品牌占比的份额比较大。我们今天聚焦的三个厂商是国外知名的西门子、罗克韦尔和施耐德。

下面讲讲什么是PLC的密码。一般来讲,工程人员会给PLC设置密码,它的密码是怎么设置的呢?它是在项目文件的工程属性里面设置的,然后把这个项目文件编译成二进制,下装到PLC里面,PLC下装成功之后,密码功能就生效了。

PLC密码有两个作用,第一是防止未经授权的操作。这个怎么理解呢?在工业现场中,对PLC设备的维护都是由专门的工程师进行的,如果存在误操作,导致其他人连接到了PLC,进行一些不相关的操作或者是改变控制器的状态的话,都可能影响生产过程,造成一些安全事故。

第二是保护知识产权。举一个例子,A工厂引进了一套口罩生产线,还有配套的PLC,一天十万元请了一个工程师来给他把这个工艺算法全都编程好之后,进行口罩的生产。隔壁老王就说这是一个好机会,能不能把这个复制一套呢?但是工程师一天十万有点贵,那我能不能从PLC里面把核心算法复制一套,把他的算法下载到我的PLC里面呢?确实可以。但是如果这么做的话,就证明知识产权已经被侵害了。

现在把一些基本概念都讲清楚了,那今天要研究的内容就是如何去突破PLC的密码保护机制,达到未经授权的操作和破坏知识产权目的。而最终的落脚点是从开发者的角度,如何设计更强健、更安全保护机制,去抵御这种攻击或者恶意行为。

下面看一下在全球范围内,PLC设备占比最大的一个厂家西门子,这是一个百年企业。这里我讲一下它的三款经典设备,看看它们的密码保护怎么突破。
先看S7-200系列,在十年前应用非常广泛,只要是OEM的项目,有客户指定的话都使用它。它有一个中国版,里面设计了一个四级密码的保护。当密码是四级的时候,即使输入了正确的密码,也不能上载PLC里面的工程逻辑,可以说在知识产权保护方面做得非常强了。那针对这么强的知识产权保护机制如何突破呢?下面就跟我来看一下突破思路。

要突破的话,就要知道它是如何实现的。我们分析了一下,有这么几个步骤,首先在系统块里面设置一个4级密码,通过明文密码和密钥进行了隔位异或加密算法,算出了它的密文,编译后,系统块的二进制文件经过PPI协议下装到控制器里面,存储到了EEPROM芯片中。

既然我们知道它的密码信息在EEPROM里面,那是不是要对它采取一些措施呢?我们对EEPROM进行拆焊,就能读取它的EEPROM里的一些内容,并更改1个字节的密码等级,再伪造客户端去下装原始系统块的关键参数到控制器里面去,就成功突破了。

接下来带大家详细看看突破思路。

左边的图就是EEPROM芯片的截图,中间是我们自己做的一个调试平台。因为要频繁做实验,读EEPROM的值再回写进去,所以做了一个平台,可以方便我们去读取和写入。

最右边这个图,就是EEPROM的内容,经过分析,找到了它的密码等级就是红框里面这个04,刚才设置了一个密码保护等级是4级,也就是禁止上载,就是04。后面在蓝色框体里面的数据,是一个加密后的密文,对应的明文密码就是nihao123。

按照我们的思路,把四级密码降级成一级密码,也就是没有密码,再烧写到EEPROM当中去,到底行不行呢?经过验证还是不行的。因为经过分析,针对EEPROM特定区域还是有两字节的校验的。而它的算法分析起来比较难,我们后面提供了一个非常巧妙的思路,可以绕过这个校验,达到突破的效果。

绕过两字节校验码的思路我们称为移花接木,就是提取原bin文件中系统块参数,伪造一个客户端将参数封装成PPI报文下装到PLC里去,让它自己去计算一下这个两字节校验到底是什么。我不用分析,也不用算,也不用像网上说的一些方法那样,把芯片拆出来找一个一样的PLC设备,试着设置系统参数如果一样再去替换。

其实我们要做的非常简单,就是要伪装一个客户端,把之前EEPROM里面系统块的一些参数分析清楚,通过报文的哪个字段或者通过哪个报文下装下去的,直接把原始系统块参数拆解封装成PPI报文下装下去之后,让PLC自己计算就OK了。

梳理一下整个流程,就是先去拆焊EEPROM芯片,读取内部内容,分析后,修改密码等级为01,再把修改后bin文件烧写至EEPROM中去。然后分析一下原始系统块的参数,做一个伪造的客户端,把参数封装成PPI报文下装下去,给PLC重新上电就可以上载程序了。就这样,知识产权的保护被我们突破了。

我姑且称它为密码保护设计的铁器时代。它使用了一个简单的加密算法处理,且在芯片内的存储特征较为明显,易于寻找和突破。攻克法门就是拆焊硬件,替换关键字节,梳理下装的协议及流程,重构控制器里面的关键参数。思路非常巧妙,仅供大家参考。当你日常研究或工作中遇到类似问题的时候,也可以套用这种思路。

下面看一下西门子针对中国市场设计的这款S7-200 Smart系列PLC。这个PLC和之前的一样,也是四个密码等级。这里我们要讨论的不是去突破它的知识产权,而是构建一个场景,来看能不能从它的流量出发,直接破解拿到它的原始密码。

要达到这个目的,我们还是要先知道它授权的算法或者说它的密码保护是如何实现的。经过梳理和研究之后,发现是这么几个步骤,先是客户端(组态软件),请求PLC随机数rkey,PLC返回22字节的数据,客户端再下发运算后的20个字节hash值,这个时候PLC会返回密码是否正确的响应报文。
这边就是它的wireshark报文。

这个时候我们从流量里面拿到了20个字节,那么PLC返回的22个字节还有输入的pwd它们是用什么样的算法去算出来这20个字节的Hash呢?为了把这个算法搞清楚,我们逆向分析了commL7动态库。经过分析,算法是这样的,关键点有三个,输入的pwd、控制器返回的22个字节的rkey,还有存储在控制器里面的硬编码Key。

第一步先把输入的密码和rkey的前两个字节做一个SHA-1计算,得到了X。而rkey的后20个字节为Y,XY做一个输入参数。再用rkey的前两个字节,替换控制器内部的硬编码Key的13、14字节,替换完之后是一个新的硬编码Key。

XY是一个参数,新的硬编码Key是一个参数,送入之后进行一个HMAC-SHA-1的运算,就能得到最终的加密密码fin_key。

我们把它的算法研究清楚了,从流量里面也拿到了22个字节的rkey,逆向之后把它的硬编码Key也获取到了,还有它的fin_key也可以通过流量知道了,这个时候把它放到一个强劲的PC机或者服务器上面让他暴力跑一跑会怎么样呢?

下面我们利用这个思路,也就是离线爆破,去突破S7-200 SMART。我们的目的是从流量获得关键信息去突破密码保护。它的过程是先嗅探流量,然后定位授权成功的报文,再去离线暴力破解,最终得到密码。

但这里有一个前提条件,就是必须要获得组态软件和PLC之间交互的完整报文,而且在这个报文中必须包含授权成功的操作。第三和第四个条件大家应该都知道,就不多说了。

我这边做了一个简单的例子,设了一个6位的密码,写了一个脚本,在自己的普通办公PC上跑了17秒,就跑出了明文密码,说明这个思路是可行的。

我们姑且称西门子S7-200 smart的密码设计是电气化时代,它使用了复杂的加密算法去处理密码,且在控制器内部比较它们的hash值。但是它们的弱点在哪呢?通讯协议没有加密,能够获取关键的20个字节Hash和22个字节rkey的一些敏感的信息,而且可以逆向算法,就可以做很多事情了。针对这一类,攻克大法就是要熟悉它的协议,分析报文,逆向它的算法再离线暴力破解。

下面来到了S7-1200这个系列,这个系列是西门子小型PLC产品线里信息安全强度最强的。最新的V4.x版本,它的可靠性、安全性做的比较好,现在在中国市场也属于一个高端的PLC。但它的密码设置和上面几个不一样,上面几个都是设置一个密码或者几个密码,它则是设了三个密码,而且对应不同的权限。如果你要访问这个权限访问里面的功能,就必须输入对应权限级别的密码。

西门子宣传得应该也不假,我们就先试一试,看通过之前的方法到底行不行。先从流量方面看一下。经过分析,这个是采用了S7Commplus V3版本。这个版本非常强悍,用了很多密码学的知识,在2019年的Blackhat USA中,以色列的一个研究团队披露出来它的使用了N多种加密的算法,加密强度非常强,而且对重点的操作流量还带有控制器的私钥保护,所以很难从流量中直接获取到关键信息。

第二步,能不能从硬件入手呢?结果看了一下,2019年之后它用的都是美光的NW812,2019年之前用的都是NQ281,这都是BGA的分装的flash,拆焊难度比较大,损坏模块的风险也比较高。一个PLC模块2000左右人民币,一焊坏2000人民币就毁了,而且实验室现在也不具备这样的条件,所以这条路我暂时没走,如果有大牛能走通可以试一试。

再看第三条思路,在线爆破行不行呢?这就意味着要伪造一个客户端,把它的算法全套逆向出来,自己再写一个伪造客户端,这个难度也比较大也比较耗时。而且控制器一般都对特定的请求,速率是有限制的,比如说限制了一秒一次,尝试多了就断开链接了,所以破解效率比较低。

最后,离线爆破行不行呢?虽然它的密码算法复杂度一般,但是hash算法被控制器里的私钥保护着,也没法从流量中获得20个字节的hash和22字节的rkey,所以这条路也走不通。

天无绝人之路,柳暗花明又一村。2019年11月的时候,有一个团队披露出S7-1200系列的一个漏洞,这算是西门子的一个后门设置。也不知道为什么留了这样一个后门,通过它的UART接口,发送一个命令就可以进入诊断模式,可以做很多的事情,比如说任意代码执行,做内存取证或者分析固件,分析后再配合fuzzing工具做漏洞挖掘,甚至还可以把整个内存片区dump出来,寻找一些我们想要的信息。

分析到这里我们眼前一亮,是不是可以从内存中找一点干货出来,说干就干。利用这个漏洞去突破S7-1200最新版本固件。先去研究和复现这个漏洞,再转储整个内存区,找密码的相关信息。最后,直接把它的组成软件TIA挂载起来在调试的阶段进行hash传递攻击,就大功告成了。

下面看我是怎么一步一步做的。先复现,复现这个还是有难度的,要搭这样一个环境,注意一定要让控制器在500毫秒内进入一个特殊的模式。最主要的难度还在于,虽然它有一个后门,但是如何利用这个后门,客户端如何写呢?

我们开发出了一个基于Windows上的UART 客户端,基于这个UART 客户端,如这个截图,给PLC下传了一个井字游戏代码,此时的控制器就变成了一个游戏机,可以玩游戏了,这就说明漏洞利用成功。然后调整下传的代码,可以把内存整体转储出来,看看里面到底有什么东西。

左边这个图是内存内容的部分截图,我们的实验对象是1215C V4.4.1最新的固件版本,转储出来有128M容量,前面是一个BootLoader,随后跟的都是一些代码数据。这边是一个固件IDA分析截图,内存里面还包含了固件,固件里面很多点都是值得研究的。通过该手段,就可以拿到PLC的非加密固件了。

固件有三部分,代码段、只读数据段还有一个数据段。我们今天的目的是密码突破,那这个时候就要去找密码到底在哪存着。经过分析之后,它是以SHA-1的形式存放的,先是密码3的20个字节Hash,接着是密码2的Hash、密码1的Hash,是在内存的BSS段里面存放着。接下来找到hash之后就非常容易了,直接在PLC的客户端挂载一个调试器找到关键点后,把我们找上来的hash密码直接替换掉这个hash,进行hash传递攻击。这样就把S7-1200系列的密码保护机制攻破掉了。

总结一下,S7-1200系列可以说是工业控制领域PLC设备中比较强悍的了,在它的设计里能用的一些算法、保护几乎全都用了,比如说使用了私钥加密了核心的操作流量,通讯协议采用了完整性校验,而且动态随机数也参与到了hash的运算里面。但是再强的保护也会有被攻破的时候。这个攻克方法就是深入研究控制器的内存读写漏洞,制作工具转储内存,从内存里寻找更多的宝藏。

我们先来看罗克韦尔设备的密码攻破思路和实战。这是它的硬件设备和它密码的设置界面,它的密码分主密码、密码还有子程序密码。一般我们的分析思路是,先登录到PLC创建一个新工程,输入一个密码,同时去嗅探一下流量,从流量中寻找它的授权流程,配合上位机组态软件关键dll分析,找到它的薄弱点就可以进行突破了。

这个时候就按照如上的突破思路往下走,执行登录操作的时候,控制器返回的流量就已经包含了明文信息,这就说明我们到达城墙下了,炮还没轰呢,他们把城门打开了。密码在这儿,给吧。现在写一个脚本,可以从它的响应报文里面把主密码、密码、子程序密码全都提取到了。

我把这称之为密码保护设计的石器时代。因为它是从控制器读取密码后在上位机组态软件中与用户输入密码做比对的,这是一种非常古老的设计模式。针对这种,我们的攻克大法就是去嗅探它的流量,寻找一些敏感的信息。

下面来看施耐德的工控设备吧。这个Quantum 140系列是施耐德上一代的大型PLC,广泛应用于火电、水电、基础设施等等领域。它的密码设置和上面的差不多,但是只需要输入一个项目文件的密码,再下装到PLC里面就会生效。但是里面有一个特殊的地方,就是如果用户连续三次密码输入错误的话,尝试第四次输入时等待时间就会增加,看似设计得更好了,到底是不是这样呢?我们就按照上面没有实践的思路来看一下。实践证明,它还是把加密的凭证信息给泄露了。

整个过程是这样的,组态软件先从特殊内存块读取数据,提取加密凭证之后,把加密凭证下发,来创建一个特殊的会话链接,以此获取PLC的访问权限。有了这个权限之后要做什么操作都是OK的。

如果说是一个恶意攻击者,就可以按照这样的流程对其进行攻击了,先是用0x20的功能码去读取内存,返回了加密凭证,再用0x10的功能码下发包含加密凭证的报文,创建一个特权的会话链接。获取会话链接后就可以执行一些恶意的操作指令,比如说去更改控制器的运行状态。这个截图就是它的密码泄露点。

对于这种密码保护的设计方式,我姑且称它为青铜器时代。它是从控制器里面读取加密凭据,再通过加密凭据创建合法的访问特权会话。对于这类设计的攻克法门就是一定要熟悉协议,发掘关键信息的泄露点,找到泄露点之后就好办了。

关于协议:业界把施耐德的私有协议叫做Modbus 90功能码,但是我们通过逆向之后发现,该协议在施耐德内部叫做UMAS协议。现在我们已经把UMAS协议研究的比较透彻了,也做了匹配wireshark的插件。

下面针对讲述的内容总结一下吧,分了两类。一类是非接触式突破,一类是接触式突破。

非接触式的是可以通过网络流量去进行操作。这里总结了三点,前面是方法,后面是针对这些方法的关键点,我快速过一下,思路A就是嗅探流量,寻找信息泄露点;B是在线的暴力破解;C是离线暴力破解。

而对于接触式的突破,也就是说当网络流量不可达或者要进行深入研究的时候,思路A就是硬件拆解,B是漏洞的利用。如果这些方法都失效了,这个时候就只能靠思路C,自己去挖掘漏洞了。可以从设备出发,能不能更改它的一些状态机或者一些特定的标志位、逆向的算法,伪造客户端进行突破。

最后,我们如何设计一个更安全的保护机制呢?这里从两方面出发。

第一方面,完整的安全框架决定了“系统牢固程度”的下限,我将从PLC控制器、组态软件、通信协议三个方面给出一些建议。

先从组态软件上看,可以加一些代码虚拟保护技术,提高逆向难度。第二是增加双向认证的功能,让这个PLC只认这个组态软件也让这个组态软件只认这个PLC。第三个就是利用加密技术加强对工程文件的保护,因为有时候通过工程文件也可以突破密码。

另外,通信协议里还是要增加完整性的校验,关键流量也需要加密保护起来,以防止一些低级的攻击。

控制器的话第一是关键敏感信息要保存到信任区,信任区可以用软件或硬件的方式加固。第二个也是增加双向认证的功能。第三个是强制密码强度的设置。第四个是增加物理硬件防护技术。

下面说第二方面,完美的细节设计决定了“系统牢固程度”的上限。其实有很多的细节设计,这边只是列举了一些,就大概过一下。

第一,一定要摒弃明文密码存储。第二,流量中不携带简单加密的敏感信息;第三,控制器识别密码授权的认证次数。我们看昆腾140系列PLC,它是有时间的限制,但它是上位机自己做的,太有欺骗性质了,它没有在下位机(PLC)里面去做这个事情;第四,出厂前尽量去掉内部的调试功能和接口;第五 ,硬件芯片要尽量定制或者去除明显标识。

今天的分享就到这里,谢谢大家!

注意:本文中PPT资料仅对知识星球会员提供:智能制造之家

(0)

相关推荐