在Black Hat 2016,Ralf Spenneberg等人在他们的报告《PLC-Blaster: A Worm Living Solely in the PLC》中介绍了一种不依赖于计算机,只通过西门子PLC设备来进行传播和感染的工控蠕虫病毒。该病毒可以通过一台被感染的PLC来接入整个系统,接下来会通过复制传播到更多的PLC中,并且能在不影响已存在的PLC程序的前提下被执行。2018年在瑞典斯德哥尔摩举行的CS3工控安全会议中,绿盟科技格物实验室团队在参考PLC-Blaster的基础上,演示了使用一台PLC攻击其他不同厂家PLC的方法。
PLC全称为Programmable Logic Controller,即可编程逻辑控制器,是一种采用一类可编程的存储器,用于其内部存储程序,执行逻辑运算、顺序控制、定时、计数与算术操作等面向用户的指令,并通过数字或模拟式输入/输出控制各种类型的机械或生产过程。西门子、施耐德、罗克韦尔这三个厂家的PLC目前在市场占有率中处于领先。本文使用西门子S7-300 PLC、S7-1200 PLC,施耐德Pentium 140 PLC以及罗克韦尔Micrologix 1400 PLC为例进行介绍。
Replay Attack常用于如PLC、DCS、SIS等工控设备的攻击,获取操控工控设备的数据包,并将获取的数据包进行修改调整,再将其发送给相关工控设备,该工控设备会接收数据包并执行进行相应的命令。由于工控系统设计之初更多的考虑实时性,而对数据包通信的安全考虑相对甚少,因此使用Repaly Attack是最简单且有效的攻击工控设备的方法。
西门子S7-300 PLC使用西门子私有通信协议S7Comm进行通信,西门子S7-1200 PLC使用西门子私有通信协议S7CommPlus进行通信。S7Comm协议以及S7CommPlus协议都基于TCP/IP,通过102端口进行通信。S7Comm协议设计较早,该协议没有任何加密验证等安全措施。一些开源网站甚至有支持S7Comm协议的小工具,使用这些工具可以对使用S7Comm协议的西门子设备进行远程操控。S7CommPlus协议使用了西门子私有的加密算法,该算法较为复杂,在2017年Defcon以及Black Hat会议中,绿盟格物实验室团队发表演讲《The Spear to Break the Security Wall of S7CommPlus》,将该加密算法破解。
S7Comm以及S7CommPlus协议具有相类似的通信时序,如图1所示。
图1 西门子PLC协议通信时序
施耐德Pentium 140 PLC使用ModBus/TCP协议,通过502端口进行通信。施耐德PLC的通信数据包使用ModBus功能码90,后面的data部分为施耐德PLC私有协议。
在施耐德PLC的通信过程中,首先向施耐德PLC发送一个获取Session的数据包,当PLC收到该数据包后,会发送带有一个字节Session Key的响应数据包,如图2所示的”0xdf”。
图2获取Session Key数据包
启动PLC的数据包如图3所示,其中第一个字节为从PLC中获取到的Session Key,第二个字节“0x40”为启动PLC的功能码。
图3 启动PLC数据包
停止PLC数据包如图4所示,其中第一个字节为从PLC中获取到的Session Key,第二个字节“0x41”为停止PLC的功能码。
图4 停止PLC数据包
开关量写值数据包如图5所示,其中第一个字节为从PLC中获取到的Session Key,第二个字节“0x50”为开关量写值的功能码,第22个字节为该开关量点的地址,第29个字节为要写的值。
图5 开关量输出点写值数据包
罗克韦尔Micrologix 1400 PLC使用EtherNet/IP以及CIP协议,通过44818端口进行通信。其中CIP协议中的Command Specific Data字段为罗克韦尔PLC通信的私有协议内容。
罗克韦尔PLC通信包括EtherNet/IP连接过程、CIP连接过程以及功能数据包(启动、停止PLC、读值、写值等)。
EtherNet/IP的连接过程包括4个ENIP数据包,其Command字段分别为”0x0001”,”0x0004”,”0x0064”,”0x0065”。其中对于Command字段为“0x0065”的请求数据包,PLC会发送一个带有Register Session ID的响应数据包,如图6所示
图6 EtherNet/IP连接过程
当EtherNet/IP连接建立成功后, 一个CIP Connection Manager数据包将被发送给PLC设备,如图7所示
图7 CIP CM连接数据包
如PLC响应成功,则会发送一个CIP CM的Response数据包,如图8所示
图8 CIP CM响应数据包
其中CIP字段中的Command Specific Data字段中的 O->T Network Connection ID以及Originator Serial Number作为CIP数据包的Session ID在后续CIP功能数据包中会使用被验证。
CIP Connection Manager连接建立完成后,开始建立CIP连接,共6个CIP连接数据包,如图9所示
图9 CIP连接数据包
其中每个连接数据包都会用到CIP Connection Manager Response数据包中的O->T Network Connection ID以及Originator Serial Number
1) 启动PLC
启动PLC数据包如图10所示,其中红框和蓝框分别为CIP Connection Manager Response数据包中的O->T Network Connection ID以及Originator Serial Number,绿框为Sequence Count。黄色字段0x55,0x01为启动PLC的功能码。
图10 启动罗克韦尔PLC数据包
2) 停止PLC
停止PLC数据包如图11所示,其中红框和蓝框分别为CIP Connection Manager Response数据包中的O->T Network Connection ID以及Originator Serial Number,绿框为Sequence Count。黄色字段0xF1,0x01为停止PLC的功能码。
图11 停止罗克韦尔PLC数据包
3) 开关量写值
开关量写值数据包如上图所示,其中红框和蓝框分别为CIP Connection Manager Response数据包中的O->T Network Connection ID以及Originator Serial Number,绿框为Sequence Count。黄色字段0xab,0x02为写开关量点的功能码。紫红色框为点地址,橙色框为所写的值。
图12 罗克韦尔PLC开关量写值数据包
当掌握了西门子PLC、施耐德PLC、罗克韦尔PLC的通信协议后,即可通过协议进行PLC的攻击。
西门子PLC中的TCON功能块可以与基于TCP/IP通信协议的PLC建立连接,当连接建立成功后,通过TSEND功能块向已经建立成功的PLC发送存储于DB块的协议报文。此时相当于通过一个西门子的PLC向其他PLC发送如启动PLC、停止PLC、DO点写值的操作。当施耐德PLC或罗克韦尔PLC收到该数据包后,不会判断数据包的来源,而是直接执行,从而达到了通过一个PLC攻击其他PLC的效果。图13所示为在西门子PLC中编写的攻击其他PLC的程序。
图13 在西门子PLC中编写攻击其他PLC的程序
https://v.youku.com/v_show/id_XMzQzNDkzOTE0OA==.html?spm=a2h0k.8191407.0.0&from=s1.8-1-1.2