写在前面(文中下载仅在微信公众号“智能制造之家”有效)
前面我们谈到了不论是西门子、施耐德、罗克韦尔,或者其它工控系统,都不存在绝对的安全,并分享了工业控制相关的安全案例:
施耐德PLC漏洞历险记—一次与施耐德PLC的非正常接触
罗克韦尔 MicroLogix PLC漏洞的复现及解决方案
基于S7协议对西门子PLC S7-1500的漏洞分析与复现(附演示视频)
今天来聊一聊曾经西门子的PLC拳头产品S7-300的密码是如何破解的~
PS:本文内容仅用于技术解读,提醒大家工控安全的重要性,不可用于做相关违法活动~
一、
环境介绍
目前实验室使用的是Siemens S7-300PLC,CPU型号为315-2 PN/DP,破解使用到的工具如下表:
工具名称 |
工具说明 |
TIA Portal V13 |
PLC编程工具 |
s7clientdemo.exe |
S7-300辅助查看cpu密码设置状态工具 |
Wireshark |
用来截取PLC和上位机通信的报文 |
s7clientdemo.exe下载地址可在公众号后台回复:“s7client”获取
二、
准备工作
Siemens系列PLC的密码,通常有4种设置状态,分别为:完全权限,只读权限,最低权限,不允许上传。
由于操作员的疏忽或者调试方便,通常会不给PLC设置密码,或者只设置简单密码,接下来我会展示这样做的危险性。
本文将从PLC密码加密方式开始谈起,之后会讨论PLC密码被暴力破解的可能性,从而得出保证PLC密码安全的方式。
上图展示了S7-300的外形,通常是通过Step7或者博图(TIA)软件去对PLC进行编程及设置。在这里我们使用博图来给PLC设置密码。
三、
算法加密
比如设置密码状态为只读,密码为:123456,然后重新通过上位机和PLC建立连接,验证密码的时候,截取到如下报文:
密码验证时候截取到的报文
分析得出规律:
S7-300用的是可逆加密算法,密码长度最多为8位,通过可逆算法转换成8个16进制数字通过S7协议发送给PLC。
1、将不超过8位的字符串转换成8个16进制数字:
2、opData数组元素默认都是0x20
如果密码为123456,可逆算法的代码如下:
intmain()
{
char opData[8],Pwd[8],pass[8];
int c;
opData[0] = '1';
opData[1] = '2';
opData[2] = '3';
opData[3] = '4';
opData[4] = '5';
opData[5] = '6';
opData[6] = 0x20;
opData[7] = 0x20;
Pwd[0] = opData[0] ^ 0x55;
Pwd[1] = opData[1] ^ 0x55;
for (c = 2; c < 8; c++) {
Pwd[c] = opData[c] ^ 0x55 ^ Pwd[c - 2];
};
程序运行后得到的Pwd数组如下所示,和我们截取到的报文一致。从而说明我们找到的算法是正确的。
/*
Pwd[0] = 0x64;
Pwd[1] = 0x67;
Pwd[2] = 0x02;
Pwd[3] = 0x06;
Pwd[4] = 0x62;
Pwd[5] = 0x65;
Pwd[6] = 0x17;
Pwd[7] = 0x10;
*/
当发送了转换后的密码后,会得到PLC返回的报文,返回的报文中,有对发送的密码正确性验证的结果,如果验证通过,就会将错误码那几个位置位为0x0000,如果密码不正确,就会是别的错误码。
四、
暴力破解
知道了密码的加密算法之后,我们就可以生成弱口令字典,然后通过加密算法对弱口令进行加密,使用加密后的密码字典与PLC进行通信,如果破解成功,返回明文密码。
五、
存储块解密
知道了密码的加密过程,和密码的加密算法,那么CPU密码是怎样存储在PLC中呢?必须通过暴力破解的方式,才能获取未知设备的CPU密码吗?
我们研究S7-300 CPU密码得到以下成果:
1、CPU密码保存在SDB0块中
2、S7-300 CPU密码在块中的保存方式
以下3个图分别为未加密,只读权限,无读写权限的SDB0块的数据。在只读权限和无读写权限状态时,CPU密码均为000000。
经过研究得出以下结论:
红色方框内为加密后的密码,蓝色方框内的数字02代表只读权限,03代表不可读写权限。而第一张图中,因为没有设置密码,所以缺少这一部分内容。
3、加密算法:
我们找出了加密算法,算法和上文中算法类似但略有不同,同样也是可逆的加密算法,具体加密算法程序如下:
charopData[8],Pwd[8],pass[8];
int c;
opData[0] = '1';
opData[1] = '2';
opData[2] = '3';
opData[3] = '4';
opData[4] = '5';
opData[5] = '6';
opData[6] = 0xaa;
opData[7] = 0xaa;
Pwd[0] = opData[0] ^ 0xaa;
Pwd[1] = opData[1] ^ 0xaa;
for (c = 2; c < 8; c++) {
Pwd[c] = opData[c] ^ 0xaa ^ Pwd[c - 2];
};
通过以上可逆算法,我们可以断言,只要可以读取SDB0块,就可以直接根据块信息,获取明文密码,根本不需要暴力破解。在获取到明文密码后,通过发送密码校验的报文,就拥有下载的权限,进而可以直接改写密码为自己想要的设置,设置可以更改CPU的密码设置等级(只读或者无读写权限)。因此,在设置CPU密码权限的时候,我们推荐设置为不可读写的状态,加大获取到SDB0块的难度,从而保护我们设置的密码。
六、
保护方式及建议
通过以上示例,我们知晓了S7-300的CPU加密方式,并且给出了暴力破解的思路。反过来,我们可以通过暴力破解的思路,加固我们的PLC,让PLC更不容易被攻破,我们提出以下建议:
1、PLC一定要设置密码,并且设置为不可读不可写状态,尽可能多的保护您的程序。
2、在进行上装和下装的时候,电脑最好直接与PLC相连,避免透过中间人或者交换机等方式获取到通信报文,使攻击者有机可乘。
3、不要设置弱密码,尽量设置复杂密码,这样可以使得暴力破解的时间变得更长,被发现的几率也就更大。
4、不要将PLC暴露在公网上。
原文来源:安帝Andisec
硬核专辑
工业热点 | 数据采集 | 应用与库(西门子、罗克韦尔、倍福等)
WinCC技术 | 工业网络 | MES技术相关| 工业巨头战略布局 | 工业通讯案例
仿真与虚拟调试 | 职业感悟、认知提升 | 自动化控制标准合集
史上最全网络通讯(IIOT、工业控制、5G、区块链)协议全景图
2021-01-07
MES/MOM总结与ISA95标准介绍与资料包(中英文)
2020-12-29
128页MES项目实施过程精解 (售前、销售、项目实施、项目管理全流程)
2020-12-26
100页PPT,带你了解数字化、智能化车间规划与建设!
2020-12-10
超炫酷的西门子TIA Portal的大神级操作~
2020-11-27
西门子TIA+PLCSIM+MCD+SIMIT,构建自动化仿真系统(案例下载)
2020-11-25
数字化车间MES方案(PPT)
2020-11-12
MES管理系统基础知识(完整版)
2020-11-11
智能自动化物流系统AGV基础知识(完整介绍)
2020-11-14
基于TIA Portal V15的动态加密计时催款程序
2020-11-16
机床数字化通信三大标准-OPCUA、MTConnect、NC-Link
2020-11-07
不懂西门子TIA Portal Openness—看这篇就够了
2020-11-03
基于制造流程和工厂管理的MES系统功能详解
2020-10-31
PLC高级编程-西门子SCL结构化控制语言官方培训.pptx
2020-10-29
工控自动化行业深度报告:制造业“皇冠上的明珠”
2020-11-01
IT融合OT:数据、网络与WMS、MES如何贯穿五层自动化金字塔?
2020-10-20