S7Comm Plus协议研究 之 动态调试二

本文深入探讨了西门子S7-1200 PLC使用V4.2.3固件的S7Comm-Plus通信协议,详细分析了数据一致性校验的计算过程,包括Sessionkey的获取和Integritypart的HMAC-SHA256计算。通过动态调试和实验验证,揭示了握手建立通信和执行关键操作的步骤,为PLC攻防研究提供了参考。
摘要由CSDN通过智能技术生成

1、概述

上一篇文章讲述了对OMSp_core_managed.dll动态调试,以理解具体的通信握手、加密认证过程。通过计算,可以获取到相关关键参数的值,包括:Symmetric key checksum、Public key checksum、SecurityKeySymmetricKeyID、SecurityKeyEncryptedKey等,进而构造数据包发送到PLC,完成通信握手成功建立连接,但这仅完成了第一步工作,后续对PLC进行关键操作,如启动、停止、下载等操作,需要计算数据的一致性校验,只有通过了数据校验,PLC才会执行对应的关键操作指令。

 

2、环境配置

在完成了对V4.1.3固件版本的研究后,此次使用更高的固件版本作为研究目标,基本环境配置如下:Win7x64虚拟机、

PLC:S7-1200 , 6ES7 212-1BE40-0XB0

Firmware: V4.2.3

Software:TIA Portal V14

S7Comm-Plus Wireshark dissector plugin: V0.0.8

 

3、过程分析

3.1、数据一致性校验

通过TIA软件操作PLC,对其进行启动/停止操作,并对通信过程进行抓包,可看到相关数据如下:

数据中有一个长度为32字节的“Intergity part”字段,该字段即为数据一致性校验,其通过某种算法,以“Data”字段数据为对象进行某种运算,最终得到32字节的校验值,只有当该校验值计算正确、PLC校验通过后,才会执行操作指令如启动/停止,否则,即使与PLC建立了通信,也无法进行实质操控。

“Intergity part”字段是如何计算得到的呢?从前期的文章中可以找到一些信息。绿盟2017年的文章表述如下:

文章指出该字段的计算与Session ID有关,加密过程使用了一个极为复杂的算法,图示中的函数输入参数只有a1,a2,且没有其他更多详细新。

再看2019年的文章:

文章指出:Integrity保护算法基于session key和通信内容(即上面提到的“Data”字段)进行MAC值计算(即HMAC-SHA256算法)计算得出,而session key的获得又与Algorithm 1有关,可以看到session key的计算过程比较复杂:f函数以challenge和8作为参数进行运算,结果拼接上challenge内容,基于KDK进行HMAC-SHA256算法运算,得到的结果取前24个字节即为session key。所以“Integrity part”字段计算方法方式可以描述如下:

Session key = Hmac-sha256KDK (f(challenge,8)||challenge)[:24]

Integrity part = Hmac-sha256Session key (Data)

由此可知,计算“Integrity part”的关键在于获取到Session key和KDK。

3.2、动态调试

由于绿盟文章并未提到HMAC-SHA256算法用于计算“Integrity part”内容,其截图中给出的分析函数位置可作为参考,用于查找Session key计算的位置:

进一步跟踪调试之后,找到了Session key的计算位置:

此函数有三个参数:其中一个指向的内容为实际用到的16字节challenge:

另一个参数为24字节内容,即文章中指出的24字节KDK,因此与文章中描述的Session key计算过程吻合,进一步分析计算过程,可以推测到:sub_5E2F22ED即为文章中描述的f函数,此过程计算为西门子私有算法。第三个参数即为函数的输出了,即Session key计算结果。

使用IDA静态分析看看f函数到底有些什么内容:

居然复杂到IDA无法打开的地步?百度了一通关于IDA如何解决上述错误问题,最终还是没能解决,或许是IDA的版本(v6.8)过低?更换了一个7.2再次尝试,F5之后的代码超过1600行,各种函数、数据运算,到此我们可以忽略这一个函数了。

通过调试定位了函数位置以及参数传递,接下来就是构造正确参数进行函数调用,获取Session key, 进而对交互数据计算出“Integrity part”值了。

3.3、实验验证

握手、建立通信、进行操控,对整个过程分析、调试掌握之后,便可以串联起所有的步骤,编写一套程序对目标PLC进行测试验证了。当前已对v4.2.3版本固件PLC进行了相关验证,Demo如下:

 

 

 

4、总结

西门子新版本的S7-1200、S7-1500均使用了新的S7Comm-Plus通信协议,想要对PLC进行任意攻防测试,基本过程分两步走:成功握手建立通信、正确计算“Integrity part”进行具体操控。本次系列文章完成了协议分析、动态调试和演示测试,希望对同行研究者有所裨益,不当之处还请批评指正。

 

参考资料:

[1] https://www.blackhat.com/docs/eu-17/materials/eu-17-Lei-The-Spear-To-Break%20-The-Security-Wall-Of-S7CommPlus-wp.pdf

[2] https://www.blackhat.com/docs/eu-17/materials/eu-17-Lei-The-Spear-To-Break%20-The-Security-Wall-Of-S7CommPlus.pdf

[3] https://i.blackhat.com/USA-19/Thursday/us-19-Bitan-Rogue7-Rogue-Engineering-Station-Attacks-On-S7-Simatic-PLCs-wp.pdf

[4] https://i.blackhat.com/USA-19/Thursday/us-19-Bitan-Rogue7-Rogue-Engineering-Station-Attacks-On-S7-Simatic-PLCs.pdf

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值