一、实践项目目标

了解S7-200 PLC的四级密码实现及突破思路;从S7-200 SMART PLC的流量出发,根据S7-200 SMART PLC的密码验证机制和硬编码密钥以及提取的“Challenge”数据和加密的密码数据编写Python脚本程序对PLC的CPU密码进行离线暴力破解,直接破解拿到它的原始密码

二、实践项目内容

S7-200 Smart系列PLC是西门子针对中国市场设计的plc,它密码里面设计了一个四级保护,当密码是四级的时候,即使输入了正确的密码,也不能上载PLC里面的工程逻辑,在知识产权保护方面做得非常强。

*西门子四级密码实现:*

在西门子S7-200系列中,该四级密码的实现有如下几个步骤:首先在系统块里面设置一个4级密码,然后通过通过明文密码和密钥进行了隔位异或加密算法,算出了它的密文,编译后,系统块的二进制文件经过PPI协议下装到控制器里面,存储到了EEPROM芯片中。

4级密码保护实现过程图示:

img img

4级密码突破思路:知道了密码保护实现过程很容易能看出该密码保护实现过程中的一个非常疏忽的一个问题—密码信息存储在EEPROM芯片里面。对EEPROM芯片进行拆焊读取其中的一些内容,并且只更改1个字节(将密码保护改为1级),再伪造客户端去下装原始系统块的关键参数到控制器里面去,就能成功突破该4级密码保护了。

img

*具体操作:*

下图为EEPROM的内容,经过分析,红框中的04就是它的密码保护等级,也就是禁止上载,蓝色框中的是加密后的密文。

img

在实际实现过程中,直接将字节0x04修改为0x01即没有密码是不可直接实现的,经过分析,针对EEPROM特定区域还右两字节的校验,算法分析较为困难。

通过移花接木的思路,提取原bin文件中系统块参数,伪造一个客户端将参数封装成PPI报文下装到PLC里去,让它自己去计算一下这个两字节校验到底是什么。

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

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

*S7-200 smart*的离线密码破解*

想要从它的流量出发,直接破解拿到它的原始密码。我们需要先知道它授权的算法或者说它的密码保护是如何实现的。

****算法与密码保护实现****:先是客户端(组态软件),请求PLC随机数rkey,PLC返回22字节的数据,客户端再下发运算后的20个字节hash值,这个时候PLC会返回密码是否正确的响应报文。

大体流程图如下:

img img

通过查阅网上安全研究人员的技术分享可知****PLC返回的22个字节还有输入的pwd与20个字节的Hash的关系****:

通过IDA逆向分析commL7动态库,即commL.dll可知该hash的计算过程,关键点有三个:

输入的pwd、控制器返回的22字节的随机数rkey,存储在控制器里面的硬编码Key

img

img img

用python2代码可描述为:

img

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

****现有条件****:本次实践就是通过已知流量中获取的加密密码fin_key(hash)和22字节rkey及其逆向之后所得的硬编码Key,通过已知加密哈希算法来离线暴力破解一个六位数密码。

*具体操作过程:*

分析响应报文

img

img

在linux系统中使用命令sudo pip install pycryptodome安装pycryptodome库,便于进行加密及hash函数的操作

img

python3对字节流和字符串的检查更为麻烦,因此使用python2进行离线暴力破解

Python2脚本如下

img

运行可得

img

三、实践项目结果及分析

结果:显然,通过 上述操作,暴力破解出了客户端(组态软件)的明文密码 。

****分析****:S7-200 SMART PLC 的CPU密码验证机制存在一些安全缺陷,如下所述:
1.弱密码策略:S7-200 SMART PLC 的 CPU 密码验证机制支持的密码长度较短,并且对密码复杂性的要求较低,这使得密码容易受到暴力破解或字典攻击的威胁。

\2. 通讯传输:通讯协议没有加密,能够获取关键的20个字节Hash和22个字节rkey的一些敏感的信息,这使得攻击者可以通过网络监听的方式获取密码信息,从而达到获取明文密码。

\3. 物理硬件保护缺乏:物理硬件保护措施不够完善,攻击者可通过烧取焊接手段直接获取到关键信息,为破解设备提供了更大的可能性。
4.缺乏防护机制:S7-200 SMART PLC 的 CPU 密码验证机制没有实现防护机制来防止暴力破解、重放攻击或密码文件泄露等攻击方式。
5.无强制密码更改机制:S7-200 SMART PLC 没有强制要求用户定期更改密码,这增加了密码被猜测或窃取的风险。
6.不完善的权限管理:S7-200 SMART PLC 的 CPU 密码验证机制没有提供细粒度的权限管理功能,无法对不同用户或角色进行适当的授权和限制。

安全加固策略

• 使用代码虚拟化保护提高反向成本效益的技术

• 添加相互身份验证

• 使用加密技术加强对应用程序项目文件

• 敏感信息应存储在一个信任区,需要加强保护

• 添加相互身份验证

• 密码必须符合复杂性需求策略

• 使用物理硬件保护,防倒车技术工程和焊接