更新时间:2022-09-18 09:09:26
本文将展示的是一种新型的PLC蠕虫病毒,该病毒可以不借助上位PC机,仅通过PLC之间进行互相传播。该病毒的实现思路,适用于多个厂家的PLC设备,并且可以在一定规则范围内相互进行传播。本文采用西门子PLC举例进行说明。
随着“互联网+制造”的工业4.0概念的提出,独立、隔离的传统工控领域迎来了新的大数据互联时代。与此同时,工控安全的问题,也随着互联,被更广泛的暴露在了Internet中。近几年来,越来越多的工控设备被暴露在了互联网上。
PLC全称为Programmable Logic Controller,即可编程逻辑控制器,是一种采用一类可编程的存储器,用于其内部存储程序,执行逻辑运算、顺序控制、定时、计数与算术操作等面向用户的指令,并通过数字或模拟式输入/输出控制各种类型的机械或生产过程。
西门子作为全球PLC市场占有率最高的PLC设备厂家,其产品系列主要包括S7-200、S7-300、S7-400、S7-1200、S7-1500等。其中S7-200、S7-300、S7-400系列的PLC采用早期的西门子私有协议S7Comm进行通信。
S7Comm协议已被安全研究者完全掌握,并且在github上可以下载到该协议的插件。S7-1200系列固件版本为V3.0以下的PLC采用西门子新一代的S7Comm-Plus协议进行通信。该协议采用了一些特殊编码规范,并且做了抗重放攻击的防护。但是其安全防护仍然较弱,已被基本破解。S7-1200系列固件版本为V3.0以上,以及S7-1500系列的PLC,采用了最新的S7Comm-Plus协议,该协议对比之前S7Comm-Plus协议,采用了加密算法,目前仍未被研究透彻。
西门子PLC通过Step7以及WinCC软件进行组态,目前最新版本为TIA Portal V13。其中使用Step7进行下位机组态,WinCC进行上位机组态。
在Step7组态软件中,用户通过编写POU程序块来完成工业现场的控制以及工艺流程的实现。西门子POU程序块包括:
西门子PLC在进行程序下装的过程中,首先会在下装前停止PLC的运算,下装程序完成后再重新启动PLC。
西门子Step7中的各种编程语言(LAD、FBD、STL、SCL、GRAPH、Higraphy、CFC等)有不同的应用场合、应用对象及各自鲜明的特点。大家都有这样的经历,出行会选用不同的交通方式,有时步行,骑自行车,有时乘坐公交、地铁、开车或者打车,这取决于路途的远近、路况等实际情况,当然也取决于你拥有什么样的交通工具。Step7中同样也为自动化项目程序设计提供了不同的编程语言,提供了不同的编程选择。
@n次看你的背影 评价说
对于病毒的实现流程,首先选择IP尝试建立连接,如果连接建立成功,则检查目标PLC是否已被感染。如连接未建立成功,或目标PLC已被感染,则选择新IP重新尝试建立连接。如目标PLC未被感染,则停止目标PLC,下装病毒程序,最后重新启动目标PLC。流程如图1所示。
所有的西门子PLC通过102端口进行TCP通信,因此可以通过尝试建立102端口的TCP通信来进行目标的寻找。Step7组态软件中提供了两个FB块,TCON以及TDISCON,如图2所示。TCON用来建立TCP连接,其中REQ输入管脚通过上升沿信号触发,CONNECT输入管脚配置TCON建立连接的如对端IP、对端端口号,本机端口号,通信方式等相关参数。TDISCON用来断掉TCP连接,REQ上升沿触发。
图3为尝试建立连接的FC块,首先使用TCON块建立连接,如果建立成功,即输出管脚DONE为TRUE时,则置状态字con_state为20,继续下一步病毒的传播感染操作。如连续200次建立连接不成功,则置状态字con_state为0。
使用TCON块尝试建立连接
如连接未成功建立或病毒传播完成,即状态字con_state为0时,则使用TDISCON做断开连接操作,如果输出管脚ERROR或输出管脚DONE为TRUE时,将TCON输入管脚CONNECT中的对端IP末位加一,并使用该新IP再次尝试建立连接。实现过程如图4所示。
使用TDISCON进行连接的断开并更改IP
成功建立连接后,首先判断目标PLC是否已经感染该病毒,通过TSEND功能块发送相关数据报文,并对返回的报文进行判断,如未被感染,则继续执行病毒的传播过程,如已感染,则置状态字con_state为0,重新更换IP尝试建立连接。
检测目标PLC是否已感染病毒
正常情况下,博途软件会对PLC进行程序的下装操作,而下装过程正式利用了西门子私有的S7协议。在西门子PLC简介章节中提到西门子S7Comm协议以及早期的S7Comm-Plus协议已可以被研究者熟悉利用。因此在传播感染阶段,可以根据S7协议的内容,通过伪造博途软件下装程序的报文,可以实现PLC到PLC的程序传输操作。也就是说已感染病毒的PLC向目标PLC发送下装程序块的报文,而目标PLC识别到报文后,误以为是博途软件对其进行下装,最后会将报文中的相关功能块存储在PLC中。
Step7组态软件中使用TSEND功能块进行数据的发送,使用TRCV功能块进行数据的接收,如图6所示。在TSEND块中,REQ输入管脚上升沿触发,DATA为需要发送的数据区。在TRCV中,EN_R上升沿触发,DATA为接收数据的存储区,RCVD_LEN为实际接收到数据的长度。
发送及接收数据功能块
在程序的发送过程中,需要满足S7协议的相关通信时序以及报文格式。图7所示为S7建立连接的过程。首先是TCP的三次握手,接下来建立COTP连接,建立完成后进行S7协议的连接建立。建立成功后可以使用S7协议进行启停PLC、下装程序、PLC中数据读写等正常操作。
S7协议通信时序
S7通信协议应用层数据封装模型如图8所示,其中:
S7协议应用层数据分布
图9为下装程序块的S7Comm数据报文,其中0x32为S7Comm协议标识符,Protocol Data Unit Reference为协议数据单元标识符,在S7Comm协议中用作通信过程的时序标记。Function标识了该数据报文的功能。Data报文区为所对应功能块的内容。
功能块下装数据报文
在博途软件中,使用FC功能块实现连接的建立,寻找新的目标IP,判断目标PLC是否已被感染病毒,并进行病毒程序的传播等功能。使用一个DB数据块存放FC功能块中所用到的所有全局变量,使用另外一个DB数据块存放病毒感染全部过程所需要的报文内容。
建立调用病毒程序的OB块OB9999,并将其存植入到目标PLC中,用以激活病毒,并进行新的病毒传播感染。西门子PLC在运行时,会按照从OB1到OB9999的顺序进行调用。如图10所示。
西门子PLC程序调用步骤
博途软件对程序在线离线一致性的检测
《BlackHat上的工控蠕虫病毒 绿盟科技工控研究员用SCL语言编写实现 录像让你亲眼看看》的相关文章请参看
工控网络与互联网对接需要纵深防御 美国国土安全部发布工控安全策略
工控系统生命周期中功能安全至关重要 用工控安全预警平台及时获取情报是关键
追踪工控恶意攻击食尸鬼行动 从样本到销售人员 HawkEye商业间谍软件浮现出水面
ICS-CERT美国工控安全小组2015年报告解读 112项安全评估638个漏洞
原文发布时间:2017年3月24日
本文由:绿盟科技 发布,版权归属于原作者
原文链接:http://toutiao.secjia.com/nsfocus-industrial-security-researcher-shows-plc-worm
本文来自云栖社区合作伙伴安全加,了解相关信息可以关注安全加网站