环境介绍
目前实验室使用的是Siemens S7-300PLC,CPU型号为315-2PN/DP,破解使用到的工具如下表:
工具名称 | 工具说明 |
TIA Portal V13 | PLC编程工具 |
s7clientdemo.exe | S7-300辅助查看cpu密码设置状态工具 |
Wireshark | 用来截取PLC和上位机通信的报文 |
二、
准备工作
Siemens系列PLC的密码,通常有4种设置状态,分别为:完全权限,只读权限,Zui低权限,不允许上传。
由于操作员的疏忽或者调试方便,通常会不给PLC设置密码,或者只设置简单密码,我会展示这样做的危险性。
本文将从PLC密码加密方式开始谈起,之后会讨论PLC密码被暴力破解的可能性,从而得出保证PLC密码安全的方式。
上图展示了S7-300的外形,通常是通过Step7或者博图(TIA)软件去对PLC进行编程及设置。在这里我们使用博图来给PLC设置密码。
三、算法加密
比如设置密码状态为只读,密码为:123456,重新通过上位机和PLC建立连接,验证密码的时候,截取到如下报文:
密码验证时候截取到的报文
分析得出规律:
S7-300用的是可逆加密算法,密码长度Zui多为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,如果密码不正确,就会是别的错误码。