S7 PLCs漏洞分析

admin 2022年12月1日12:21:56评论22 views字数 9780阅读32分36秒阅读模式

作者 | 博智非攻研究院

近期关注了文章“Vulnerability analysis of S7 PLCs:Manipulating the security mechanism”,文章对Siemens PLC环境(特别是S7CommPlus 的通信协议)进行了深入分析。研究人员使用WinDbg和Scapy工具,对协议中使用的反重放机制进行了研究,包括创建有效网络数据包所需的特定字节的标识,文章基于试验性分析方式,对新漏洞(包括对加密密钥的操作)进行了研究,演示了利用漏洞进行通信会话session、使工程师无法配置PLC 、对PLC工作状态进行未经授权的更改、以及其他对完整性和可用性的破坏。原文较长,本文仅对文章区别于当前已有资料的独到分析和总结之处进行翻译和概括,以飨读者。

1、相关研究

前期已有对S7-1200/S7-1500 PLC的研究文章,对S7ComPlus协议的多个版本做了分析,下图对此作了梳理:
S7 PLCs漏洞分析
S7-1200 和 S7-1500 PLC 协议和安全性比较的基本情况如下:
S7 PLCs漏洞分析
S7CommPlus协议在 TCP (TTPKT)和面向连接的传输协议 (COTP) 上运行,用于在 PLC 和工程软件之间传输关键的操作和配置信息、例如 PLC 逻辑、诊断信息、配置详细信息和数据块值。操作员从TIA Portal初始化到 PLC连接,例如,点击TIA 门户中的“ Go online ”按钮,如下图:
S7 PLCs漏洞分析
以下步骤将被执行:
1、TIA Portal 向  网络广播 Profinet Discovery 和基本配置协议 (PN-DCP) “Identify All”数据包。
2、所有PLC或设备都使用PN-DCP “Identify OK” 数据包回复 TIA Portal。
3、TIA Portal初始化与PLC的TCP握手,PLC将回复。
4、TIA Portal和PLC交换COTP连接信息。
5、TIA Portal发送第一个S7数据包。
6、PLC使用包含1字节和20字节反重放机制的数据包进行回复。
7、TIA Portal 会回复一个包含反重播字节和 132 字节阵列的数据包、即反重放响应。
8、TIA Portal将数据包连同请求的操作一起发送到PLC,并在每个数据包中进行20字节的完整性检查,其中包含特殊字节,如果任何 S7CommPlus反重放字节数或完整性检查值数据不正确,连接的另一端将发送TCP重置数据包,会话将终止。
S7 PLCs漏洞分析
图4 S7CommPlus 会话和反重放机制
S7 PLCs漏洞分析
图5 S7CommPlus (连接)请求(来自 TIA 门户)
S7 PLCs漏洞分析
图6 S7 质询数据包(来自 PLC )
S7 PLCs漏洞分析
图7 S7CommPlus 响应数据包(来自 TIA 门户)(左:流量捕获、右:字节位置表示)

1.1 抗重放字节

S7CommPlus协议在防重放机制中使用1个字节值,自S7-1200固件版本3开始使用。当TIA Portal初始化连接时,PLC发送0x06至0x7F范围内的质询字节,TIA Portal将向PLC回复一个响应,该响应通过将值0x80添加到质询中来计算。例如,如果PLC质询为0x08,则TIA响应将为0x08+0x80=0x88,如图中的标签④所示。图上质询位于第25个字节位置,响应位于相应数据包的第24个和第29个字节。在PLC固件版本3中,S7响应数据包之后的后续功能数据包必须在第24个字节位置包含相同的防重放字节;在固件版本4中,发现它是相关数据包的第57个字节或第62个字节。

1.2 响应数据包中的加密

从固件版本4开始,来自TIA Portal的响应数据包必须包括除上述单个防重放字节之外的几个字节。2017年,Cheng[6]发现了数据包中涉及的两个16字节加密,其中第二个加密依赖于第一个加密。两个16字节的值开始于S7响应包的第235和第291字节,如上图中的标签⑨和⑩所示。第一次加密是XOR运算,而第二次加密是通过更复杂的算法生成的。

1.3 功能包“加密”

响应数据包发送到PLC后,TIA Portal将开始发送与TIA Portal功能相关的字节,本文其余部分将其命名为“功能数据包”。所有这些分组必须包括32字节的“加密”值,如下图的标签⑪所示。该“加密”被发现是由基于散列的消息认证码(HMAC)促进的完整性检查,并且与防重放字节有关。Cheng[6]出了通过利用协议来启动和停止PLC的可能性,但没有提供描述协议漏洞的详细信息,只是指出数据包完整性检查功能是一种“加密”。随后,Biham将S7协议中使用的底层机制确定为HMAC,并发现HMAC的密钥细节是通过椭圆曲线EL-Gamal类密钥交换来交换的。然而,没有描述具体的协议机制,例如,反重放响应的每个字段都用伪代码松散地标识,而算法执行细节缺失。类似地,在函数分组HMAC计算中,发现先前未识别的具有两个不同密钥的两组HMAC.因此,在第四节中对解决这些差距的研究进行了调查,并与相关算法一起进行了进一步介绍,其中对协议和漏洞进行了详细分析,以提供支持加密的机制的更详细视图。
S7 PLCs漏洞分析
图8 S7CommPlus功能包(来自TIA门户)
如下表,对上述几个图中的标号字段进行了总结:
S7 PLCs漏洞分析

2、脆弱性实验分析

实验环境包括运行TIA Portal V14的工程站、两个固件版本为V4.1.3和V4.2.3的S7-1211C PLC和一台“受损”机器,所有这些都通过交换机连接到共享LAN。

2.1 TIA Portal分析

为了了解生成反重放响应的算法,并探索可能的漏洞,使用WinDBG对TIA Portal进行了分析。本节描述了在实验过程中进行的逐步分析过程。出于实验目的,在TIA Portal中搜索可访问设备的功能用于生成S7CommPlus流量。在分析过程中发现的结果如图所示。下图中的标签A-F将在整个讨论中被引用。图中有两个主要部分:如何处理挑战数组(蓝色框)和此后命名为“函数B”(黄色框)的进程,该进程是生成反重放机制的大多数字节的地方。
S7 PLCs漏洞分析
图9 步骤A至F,用于分析TIA门户流程。蓝框显示“挑战阵列”。黄色框显示“功能B ”
为了支持分析,在软件和PLC之间的通信期间设置了几个断点。通过手动分析发现,每次TIA Portal发出请求时,字节数组都会发生显著变化。通过使用SCAPY向PLC发送完全相同的连接请求数据包,可以确认该20字节块与连接请求数据包的有效负载没有明显关系。从以前的工作来看,鉴于S7CommPlus协议的可用信息有限,从哪里开始逆向工程过程并不明显。因此,对于任何进行这种分析的人来说,第一个挑战是确定生态系统中易受攻击的部分和分析的切入点,如下所示。为了开始分析,在没有任何断点的情况下使用一次TIA Portal的搜索功能,并生成一个完整的通信会话(由来自PLC的TCP重置数据包结束)。通过软件上的WinDbg手动启动中断,然后使用命令“s”在存储器中搜索来自PLC的20字节,可以识别包含该20字节块的存储器地址。该存储器地址可以仅通过一次“s”搜索来定位,或者通常仅定位存储整个接收到的S7询问分组的区域。进一步的搜索必须通过使用访问时断点来完成,并跟踪该20字节数组被写入的特定地址。一旦确定了该地址,在重新启动TIA Portal之前,该地址不会更改。如标签所示,在该地址上设置访问时断点“断点A”。在使用TIA Portal初始化另一个S7通信后,发现断点A是通过两个不同的位置访问的,这两个位置都是涉及将20字节块复制到另一个地址的功能。第一个函数复制断点A指向的地址,而第二个函数将字节复制到特定地址,如标签所示。因此,为了继续调查,为两个识别的地址中的每一个设置了另外两个访问断点,即断点B和断点C。发现断点B指向第3字节的地址,并且断点C存储20字节数组的第3到第18字节(图6中的标记⑤)。这个16字节值(字节3到18),或“挑战数组”,已被发现在字节生成过程的其余部分起着重要作用。进一步发现,断点B和C所指向的两个存储器位置分别涉及为s7commplus响应和功能分组生成字节。
此时,DLL“OMSP_core_managed.DLL”第一次出现,断点A、B和C指向的地址都在此DLL的范围内。在分析过程中,确认该模块(或DLL)是生成所有防重放字节的地方。下面将解释S7响应分组和S7功能分组中的防重放字节的生成。

2.1.1来自TIA Portal的S7响应包

在访问质询数组的新S7会话中,通过跟随断点B,使用WinDbg中的“uf”命令识别来自模块“ OMSP_core_ managed.dll”的“功能B”,如标签所示Ⓒ.请注意,“uf”命令返回地址所属的整个函数。在通过回溯函数B的调用堆栈进行进一步调查后,确认其为生成S7CommPlus响应数据包的位置,响应数据包可以分为几个部分,如下所述。

2.1.1.1可以操作的字节

在调查中发现,至少使用了两次哈希算法Sha-256。这些哈希的输入由“CryptGenRandom” Windows API生成。生成的两个哈希用作输入的一部分,以生成响应数据包中的字节。这些字节包括:9字节和8字节块,(分别为⑥和⑦),132字节块⑧的前76个字节,以及加密1,⑨和加密2,⑩之间的字节。如所示,可以通过使用WinDbg更改哈希函数的输入来操作这些字节块,例如将输入设置为全零,并且这些字节的输出将在每个会话中保持不变。这可能是一个非常强大的漏洞,因为一旦生成这些字节,就可以在不需要TIA Portal或WinDbg的情况下生成数据包。只要其他字节也是由适当的算法生成的,PLC就会接受这些“特制的”数据包。该点说明了如何将散列之一标识为生成两个16字节密钥(图1中的“密钥1”和“密钥2”)的过程的一部分。这些密钥随后用于S7CommPlus响应中的两个对称密钥加密过程,特别是AES-128。这两个过程将被称为“第一次加密”和“第二次加密”,如图9右侧所示。由于可以操纵这些哈希的输入(见Ⓓ),因此可以生成输出哈希,从而生成两个密钥,并根据算法的输入而改变。因此,标签Ⓔ可以被认为是一个黑盒子。还有一些值根据哈希算法的输入而变化,这些值由另一组函数生成。为了所呈现的分析的目的,不需要知道这些功能的详细操作,并且因此它们也可以被认为是黑箱,其在上节图中被标记Ⓕ,这将在适当的时候再次讨论。目前认为,如果不访问可编程逻辑控制器(PLC)的内存或安装了TIA Portal的上位机,就不可能操作这些值。然而,攻击者可能能够使用中间人代理,例如在受危害的机器中以TIA Portal的形式,将密钥更改为所需的密钥。虽然Biham承认了操纵哈希输入的可能性,但我们在这里记录并可视化(图9)字节的操纵如何影响机制其余部分的安全性。从安全研究人员的角度来看,此信息非常重要,因为它揭示了专有协议的其他未知问题,并突出了可能存在多个TIA门户和PLC实例的安全限制。由于本研究是根据Cheng[6]的研究进行的,因此分析的表述和术语与一致,即将主要组件确定为第一加密、第二加密和功能包完整性检查。

2.1.1.2第一次加密

Cheng[6]首先提到了响应数据包中使用的两种加密,然而仅给出了它们在IP分组中的位置,并且很少给出关于这两个加密的其他信息。比Biham随后添加了额外的信息,记录了用于生成这些字节的底层算法,这是椭圆曲线EL-Garmal密钥交换的专有版本。作为进一步的贡献,我们现在介绍低级字节操作和操作反重放机制所需的过程。如下图所示,第一加密是位于先前识别的132字节块的第77到第93字节中的16字节值。发现通过使用Ⓕ中生成的132字节块的第61到第76字节作为明文并使用“密钥1”作为对称密钥加密算法的加密密钥来进行加密。然后,该加密的输出将与质询数组进行异或运算,并在发送到PLC之前存储在处理通信的地址中。但是,由于明文和密钥都与Ⓓ中的操作哈希相关,因此可以将此加密视为16字节常量和质询数组的简单XOR运算。
S7 PLCs漏洞分析
图10 第一次加密

2.1.1.3第二次加密

第二次加密使用与第一次加密相同的加密算法,然而,明文是由更复杂的算法生成的,该算法使用第一次加密作为输入的一部分。完整算法的分析如下图13所示。此外,还确定了生成明文所需的许多构建模块。下面以详细的伪代码的形式呈现这些低级字节操作。该伪代码旨在帮助所提出的实验(以及[6][7])的再现性。
(1)“有限域”增量算法(见图11).有限域是具有有限阶的元素的集合,并且乘法和加法的运算应该符合某些规则。域的阶是域中元素的个数,并且阶应该是素数的幂。
S7 PLCs漏洞分析
图11 “有限域”增量算法
对于该递增,字段的顺序是2128,其可以由16字节值表示。在分析过程中,不可能找到广义不可约多项式(有限域中的运算规则),因此计算由一组运算和一组常数来表示。要开始操作,将16字节值乘以从0到255的所有整数。此16字节值是从与两个加密密钥相同的哈希生成的(请参阅标签)。它采用四个4字节小字节值的形式。计算如图11所示。在乘法过程中,如果乘数的nTH根为2,其中n为正整数,即乘数为2,4,8…,输出将与特定值xpn进行异或运算,并存储在具有256个元素的数组或数组“ value256[]”中,其中每个元素都是16字节值。由于值必须保持在“有限域”内,乘法的其余部分不能简单地通过将输入值乘以乘数来实现。通过首先以其二进制形式表示乘数来完成计算。然后从最高有效位读取乘法器的二进制。如果是“ 0 ”,则没有进一步的操作。但是如果它是'1',例如,如果乘数是“9”,其在二进制中是“1001”,则value256[23]和value256[20]将被异或在一起,并且输出被存储在value256中。
S7 PLCs漏洞分析
图12算法a480
S7 PLCs漏洞分析
图13 第二次加密
(2) 算法A480。该算法以地址的存储器偏移量命名为“算法A480 ”,取图11中的“值256[]”。“有限域”增量算法的输出,以及作为输入的16字节值。16字节输入“ B_输入”被分成四个4字节数组,它们以小端格式表示。图12示出了算法A480的伪代码,算法的第一部分在循环中执行,将依次读取4字节值的每个字节位置。通过从B_输入的第一元素中的第一字节位置开始读取,到第二元素中的第一字节位置,等等。(即B_输入[0][0],然后B_输入[1][0],等等)。与十六进制中的任何值一样,它可以是0x00到0xFF,这对应于value256[]中16字节值的不同256个元素。16字节值(第一个读取值为value256[B_input[0][0]])将附加零,零的长度取决于它当前所在的元素。例如,对于元素0或B_INPUT[0],追加了16个零。类似地,对于B_输入[1]到B_输入[3],将分别添加12、8或4个零。结果将被存储,并与添加了零的下一个值进行异或运算。(例如,经XOR运算的前两个值是Value256[B_输入[0][0]]和Value256[B_输入[1][0]],两者都添加了零)。在进行到下一字节位置(例如,从B_输入[X][0]到B_输入[X][1])之前,每一递增的结果将被转换成大端字节序,向右移位1个字节,并且再次被转换回小端字节序值。对于最后一个位置,不是将32字节值向右移动1个字节,而是执行更复杂的操作。操作从伪代码中语句的左侧开始。该操作包括:“<<”二进制左移、“>>”二进制右移和“^”逐位异或。在移位期间,任何方向上超过16字节限制的字节都将被丢弃。生成的32字节值将被划分为8个不同的4字节值用于操作。在算法结束时,通过将四个4字节数组连接成字节串来获得16字节串。
(3) 明文生成。如图13所示,在用于第二加密的明文生成过程中有五个不同的输入。这五个输入是:1)16字节值;2)第一次加密的结果(图13中的红框);3)16字节密文(图13中的绿色框);4)从另一个密文缩减的8字节值(图13中的蓝框);以及5)用零填充的4字节计数器值。实验已经表明,除了第一次加密的结果之外,所有这些输入相对于点Ⓕ处标识的两个散列是恒定的。明文生成过程的每一步都涉及对两个输入进行XOR运算,并通过“算法A480”运行结果。
(4) 完成第二次加密。在生成明文之后,使用“密钥2 ”对其进行加密(参见图9),使用与第一加密相同的对称密钥加密。密文将用作132字节块的最后16个字节,即来自TIA Portal的反重放响应。图13示出了“有限域”增量算法、算法A480和明文生成是如何相互关联的。输入在132字节数组中的字节位置以及如何生成第二次加密也可以在图中找到。与Cheng[6]的工作相比,对S7响应数据包的生成提供了更完整的描述,两个加密的细节也提供了Biham后来工作之外的额外信息。值得注意的是,算法A480先前已被简要地呈现为制表散列,但没有围绕用于生成第二加密的步骤的细节。由于先前描述的较低级字节计算,现在呈现该进一步分析。这允许对修补可能的操纵提出初步建议。

2.1.2来自TIA Portal的功能包

在交换S7询问和响应数据包之后,将发送S7功能数据包。这些数据包包括通信的目的和细节,图8显示了其中一个数据包,该数据包包含由第III.B节中给出的示例中的TIA Portal发送的控制信息。每个数据包都必须在有效载荷之前包括32字节“加密”(如Cheng[6]所称),如同一图中的轮廓字节所示。在该分析中发现,该32字节块实际上是对分组的HMAC完整性检查。这种完整性检查有两个目的:确保有效载荷不被操纵;以及验证发送方(因为只有连接中涉及的主机才知道HMAC的密钥)。为了生成这个32字节值,需要进行两次HMAC计算。第一个用于生成所有后续HMAC的密钥。第二个用于对所有功能包进行签名。两个HMAC都基于与其余机制相同的哈希算法。图14显示了两个HMAC如何生成完整性字节。
S7 PLCs漏洞分析
图14 完整性检查
S7 PLCs漏洞分析
图15.用于生成8字节块的伪代码,它是第一个HMAC明文的一部分

2.1.2.1第一次HMAC

第一次HMAC的计算在S7响应分组被发送到PLC之前完成。HMAC的明文由从断点C读取的8字节值和16字节质询数组组成(参见图9).图15示出了用于8字节生成的伪代码,该伪代码对于S7函数完整性检查是关键的,但是在文献中先前没有描述。该算法未被识别为标准化算法,因此伪代码是通过分析汇编代码生成的。由于8字节生成算法是完整性字节生成的基本部分,因此从安全角度来看,该分析具有指导意义。然后,使用在图9中标签Ⓕ处的黑盒中生成的24字节密钥来对组合的24字节值进行签名。32字节的HMAC输出将被缩减为24字节值,该值将被存储并用作第二个HMAC的密钥。

2.1.3.2第二个HMAC

第二个HMAC用于生成实际的完整性校验字节,这些字节被插入到双方发送的功能包中。这里已经首次识别了第二次HMAC的密钥如何是第一次HMAC的结果,并且进一步识别了S7功能分组有效载荷的哪一部分被用作第二HMAC的输入。函数数据包的长度并不总是相同的,但数据包中的32字节HMAC总是从数据包的第13个字节开始。该HMAC的输入包括分组中HMAC之后的所有字节,即从第45个字节开始,不包括分组的页脚,该页脚通常是最后四个字节(例如,8在数据包的末尾是“72 03 00 00”)。由于每个数据包的长度和所包含的信息可以变化,因此页脚的长度和内容也会相应变化。然而,为了重放分组,由于密钥是已知的,简单的试错法可以识别需要什么字节作为HMAC的输入。

2.1.3总结和讨论

本节记录了获取有关S7CommPlus协议中使用的反重放机制的信息所需的方法和实验过程。这些新发现的信息,包括使用的标准化哈希和加密算法,以及用于明文和密钥生成的专有算法,可能会被利用来创建生成“合法”S7通信的工具。
基于上述实验,现在将讨论一些有趣的实践方面,旨在为该领域的未来研究人员提供指导,以帮助重现类似的实验结果。
  • 尽管在本次调查中未使用“IDA Pro”或新的开放式软件“Ghidra”,但它们可能会显著加快调查速度,尤其是发现软件各个部分中使用特定功能的位置。
  • 在存在质询和响应机制的情况下,跟随或回溯存储器中质询的存储器位置可以为反向工程过程提供入口点。
  • 在WinDbg中记录“ta”(trace to address)命令的输出提供了一种查找生成特定字节的位置的方法。虽然在这项工作中没有使用,但自定义脚本可能有助于在跟踪期间转储额外信息。
  • 当发现内存中使用或存储的各种字节是密码函数使用的常量时,该研究中的大多数重大突破都出现了。例如,AES的S盒和Sha-256的初始哈希值。因此,当执行类似的分析时,当仅有汇编代码可用时,搜索存储器中使用的密码学常数可以提供识别特定算法的简单方式。
  • 在找到要使用的标准算法(例如AES)之后,在存储器中的搜索和对父函数的回溯可以提供揭示使用该算法的多个实例的信息。
如果仅从通信的一方生成密码密钥,而没有来自另一方的输入,则可以操纵该密钥

参考资料:

[1]J. H. Park, M. Kim, and D. Kwon, “Security weakness in the smart grid key distribution scheme
proposed by Xia and Wang,” IEEE Trans. Smart Grid, vol. 4, no. 3, pp. 1613–1614, 2013.
[2] Y.-M. Kwon, J. Yu, B.-M. Cho, Y. Eun, and K.-J. Park, “Empirical analysis of mavlink protocol
vulnerability for attacking unmanned aerial vehicles,” IEEE Access, vol. 6, pp. 43203–43212, 2018.
[3] M. Kim, J. Lee, and J. Paek, “Neutralizing BLE beacon-based electronic attendance system using
signal imitation attack,” IEEE Access, vol. 6, pp. 77921–77930, 2018.
[4] L. Martín-Liras, M. A. Prada, J. J. Fuertes, A. Morán, S. Alonso, and M. Domínguez,
“Cybersecurity Comparative of Configuration Protocols in Industrial Control Devices,” Int. J. Crit.
Infrastruct. Prot., vol. 19, pp. 4–15, 2017, doi: 10.1016/j.ijcip.2017.10.001.
[5] A. Ghaleb, S. Zhioua, and A. Almulhem, “On PLC network security,” Int. J. Crit. Infrastruct.
Prot., vol. 22, pp. 62–69, 2018.
[6] L. Cheng, L. Donghong, and M. Liang, “The spear to break the security wall of S7CommPlus,”
2017, [Online]. Available: https://media.defcon.org/DEF CON 25/DEF CON 25
presentations/Cheng Lei/DEFCON-25-Cheng-Lei-The-Spear-to-Break-the-Security-Wall-ofS7CommPlus-WP.pdf.
[7] E. Biham, S. Bitan, A. Carmel, A. Dankner, U. Malin, and A. Wool, “Rogue7: Rogue engineeringstation attacks on S7 Simatic PLCs,” Black Hat USA, 2019。
[8] https://www.anquanke.com/post/id/206579
…………


转载请注明来源:博智非攻研究院

“投稿联系方式:孙中豪 010-82992251   [email protected]
S7 PLCs漏洞分析

原文始发于微信公众号(网络安全应急技术国家工程实验室):S7 PLCs漏洞分析

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年12月1日12:21:56
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   S7 PLCs漏洞分析http://cn-sec.com/archives/1435406.html

发表评论

匿名网友 填写信息