SIEMENS西门子广东省珠海市(授权)一级代理商——西门子伺服电机华南总代理
- 供应商
- 广东湘恒智能科技有限公司
- 认证
- 西门子总代理
- PLC
- 西门子一级代
- 驱动
- 西门子代理商
- 伺服电机
- 联系电话
- 15915421161
- 手机号
- 15903418770
- 联系人
- 张经理
- 所在地
- 惠州大亚湾澳头石化大道中480号太东天地花园2栋二单元9层01号房
- 更新时间
- 2024-05-01 07:00
环境介绍
目前实验室使用的是siemens s7-300plc,cpu型号为315-2pn/dp,破解使用到的工具如下表:
工具名称 | 工具说明 |
tia portal v13 | plc编程工具 |
s7clientdemo.exe | s7-300辅助查看cpu密码设置状态工具 |
wireshark | 用来截取plc和上位机通信的报文 |
准备工作
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、在进行上装和下装的时候,电脑zuihao直接与plc相连,避免透过中间人或者交换机等方式获取到通信报文,使攻击者有机可乘。
3、不要设置弱密码,尽量设置复杂密码,这样可以使得暴力破解的时间变得更长,被发现的几率也就更大。
4、不要将plc暴露在公网上。
展开全文