对未配置写保护的PLC安全性验证

t015dbacc0af78d6e81

 

01.前言

S7-1215C++是德国西门子公司开发的一款中小型PLC,该PLC在工控领域应用广泛。该PLC可支持s7comm及s7comm-plus协议,当上位采用第三方监控软件时与西门子PLC通讯时,可采用S7。这时我们构造符合S7协议规则的包可以对PLC进行寄存器定点攻击测试,验证在没有对采用软件对西门子PLC做写保护下,PLC很轻易被攻击,希望自动工程师在做工程配置一定要完成对PLC的基本安全配置。

02.原理

PLC未做任何保护机制的状态下,S7-1200 PLC采用S7协议与第三方软件(例如kingview)进行通讯,无需身份认证,构造符合S7协议规则的包可以对PLC进行相关攻击测试。在本实验中,完成对指定PLC寄存器地址的定点攻击测试。
下图是PLC的一个简单的设备启停控制逻辑程序,%M0.0、%M0.1是指PLC的M类型的寄存器,0.0、0.1是M寄存器的某两个偏移地址,对应中间变量。%Q0.2是PLC的Q类型的寄存器,0.2是Q寄存器的某个偏移地址。在这个控制程序中,%M0.0(变量名为start)对应是监控画面上的启动按钮,进行对电机的启动操作,%M0.1(变量名为stop)对应是监控画面上的停止按钮,进行对电机的停止操作。%Q0.2(变量名为out),对应PLC的DO输出,即将控制信号输出给设备。

 

03.建立下位控制程序

1)在Win7 虚拟平台打开PORTAL V13软件,创建一个新项目s71200,定义路径,如下图:

t013eebb257179fc762

2)选择组态设备,添加新设备,选择和真实设备型号一致的硬件,如下图:

t0160f84f9eb2200559

3)建立start、stop、out分别对应上位的通道地址M0.0、M0.1、Q0.2,如下图:

t012d29c9d935c1eceb

4)在PLC完成控制逻辑程序,并完成一个简单的逻辑控制,添加一个常闭线圈、常开线圈、输出线圈以及一个分支,实现的功能为,一个简单的设备启停控制逻辑程序,%M0.0、%M0.1是指PLC的M类型的寄存器,0.0、0.1是M寄存器的某两个偏移地址,对应中间变量。%Q0.2是PLC的Q型的寄存器,0.2是Q寄存器的某个偏移地址,对应的是PLC DO的第一个通道。在这个控制程序中,%M0.0(变量名为start)对应是监控画面上的启动按钮,进行对电机的启动操作,%M0.1(变量名为stop)对应是监控画面上的停止按钮,进行对电机的停止操作。%Q0.2(变量名为out),对应PLC的输出,即将控制信号输出给设备,当在画面上按下start按钮时,DO的第一个通道点亮再加上外接电路就可以控制电机启停,如下图:

t01a26a4d81849dc765

5)双击左侧列表的设备组态,再点击下图中PLC的接口,接着定义PLC的IP地址,如下图:

t01e06f23545aa136d9

6)将以上设置下载到设备中,然后点击“装载”如下图:

t01b10b2c9d816abe1d

 

04.上位组态程序

1)在Windows XP 虚拟平台打开组态王6.53,新建一个工程,名称及路径可自定义,如下图:

t01368ac8c5f0a63876

2)选中刚建好的工程,点击开发按钮,进入开发界面,如下图:

t0100fa1f8d71d92aa1

3)鼠标点击设备,在左面的对话框中有新建按钮,创建一个新的设备通讯,选择一种设备名称或者通讯方式,在本例程中选择西门子的s7-1200-TCP通讯方式,如下图:

t011333387aa445af8f

4)设置代号也就是通讯名称,这里命名s71200,可以自定义,一般根据设备名称来命名,如下图:

t01adfe15ec313bbd45

5)选择一个接口,可以任意选择,只有未被使用,如下图:

t0153eaa87ce5c524a0

6)填写需要与之通讯的设备的IP地址,同时IP地址后面跟一个设备的站地址,本例程中IP地址为192.168.10.53,站地址为0,可根据实际填写,如下图:

t01c3825c9e50e83d2c

7)点击下一步,默认选项,直到完成创建,保存退出。

8)在数据库下的数据词典新建3个新变量,与下位机定义的变量相对对应,start、stop、out变量,如下图:

t01929b0e9114852e33

9)在画面下的新建一个画面,命名为s71200,如下图:

t01117400a2e4bf7332

10)在s71200画面下,增加2个按钮,分别字符串替换为start、stop,对按钮进行按钮的动画连接,按下时变量赋值1,弹起时变量赋值0,如图:

t0170d02d9069d09dc0

t0130bccc07be212251

t01ce62f55154e9a762

11)在s71200画面下,再增加指示灯,连接变量out,当out为1显示绿色,值为0显示红色,如下图:

t012c2fc266c3634f1a

t016208e14000a5f3be

12)在文件下对修改进行保存,并切换到view模式下,如下图:

t01096ccc5ea124dc45

13)按下start按钮,可以看到指示灯变为绿色,并观察对应PLC的DO的第一个通道被点亮,如下图:

t0176634777a18e4442

14)再按下stop按钮,关闭指示灯。

 

05.获取流量

这节以下的操作,只是为了演示给新手如何获取操作级的流量,当然如果对s7协议熟悉,是可以直接构造的。

1)在win7虚拟机机中打开wireshark软件,选择数据捕获接口,如下图:

t0120c1f4e2f79416eb

t01874c09168e52904a

t010b7f379b97700b8f

2)开始数据抓取,并保持数据抓取状态,如下图:

t0141fc0cabc29bcd87

3)在xp虚拟机中让测试程序处于运行状态下,点击start按钮,,指示灯点亮,如下图:

t01eed74d16e325a9ce

4)在wireshark中点击停止,保存数据包,如下图:

t016b454f34a0a6fce7

5)点击stop按钮,指示灯恢复到红色状态。

 

06.构造攻击数据包测试

这里我们通过抓取的流量复制后构造,大佬们可以直接构造。

1)在保存的数据包中进行数据过滤,应用显示过滤器中输入s7comm进行数据过滤,如下图:

t013472bd7193e655bc

2)找到功能码为写变量的数据包,源地址为win7虚拟机IP(192.168.1.39),目的地址为PLC的IP(192.168.1.11),如下图:

t019aeee8d239415c18

3)在wireshark中将数据包复制下来,具体操作为选中要复制的包右键复制>as a Hex Stream,如下图:

t011c5f05bea5e4962a

这个就是我们要构造的数据0300002402f080320100000fff000e00050501120a100200010000830000000004000801,通过对s7协议的了解,我们可以知道报文的含义为:写m0.0值为1。

t01dae05e79e4e1d5a5

4)通过下图我们知道这个PLC未做任何的保护措施:

t0152e1b231d76b8800

5)在操作机中新建文本命名为S7(M0.0 to 1),并修改扩展名为.py,以Edit with IDLE打开,并将上一步的数据包构造出,并进行保存,不关闭文件,如下图:

t017983c9b0c1551ef3

6)数据构造完成,在S7(M0.0 to 1)攻击测试脚本中选择Run>Run Module 或者直接快捷键F5发送数据包,如下图:

t014c945e49a99d2094

7)观察XP虚拟机中运行的测试程序中寄存器值的变化,如果值由0变化成1,指示灯由红色变为绿色,则攻击测试成功,实验完成。

 

05.总结

其实在我们一些大的自动化厂商的PLC都有基本的安全保护措施,如施耐德unity_pro中可以为PLC中配置IP白名单,通过TIA等软件也可以对西门子PLC也可以做一些读、写保护的配置。但在实际的控制系统的集成项目中,自动化工程师由于各种原因,会忽视对PLC的保护配置,造成我们的PLC丧失最基本的防护

标签