随着“互联网+制造”的工业4.0概念的提出,独立、隔离的传统工控领域迎来了新的大数据互联时代。与此同时,工控安全的问题,也随着互联,被更广泛的暴露在了Internet中。在Shodan、ZoomEye等搜索网站中,可以很容易的搜索到真实工控现场工控设备的IP地址,并且可以利用组态软件访问到对应的设备。近几年来,越来越多的工控设备被暴露在了互联网上。
在Black Hat2011,Dillon Beresford等人在他们的报告《Exploiting Siemens Simatic S7 PLCs》中演示了如何通过西门子S7Comm协议的权限缺失漏洞来远程操作PLC。在Black Hat2015,Johannes Klick 等在他们的报告《Internet-facing PLCs – A New Back Orifice》中演示攻击者如何通过代理,来发现内网中更多的PLC设备。本文将展示的是一种新型的PLC蠕虫病毒,该病毒可以不借助上位PC机,仅通过PLC之间进行互相传播。该病毒的实现思路,适用于多个厂家的PLC设备,并且可以在一定规则范围内相互进行传播。本文采用西门子PLC举例进行说明。
三菱PLC简介 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协议进行通信。
该协议采用了一些特殊编码规范,并且做了抗重放攻击的防护。但是其安全防护仍然较弱,已被基本破解。 病毒的实现 对于病毒的实现流程,首先选择IP尝试建立连接,如果连接建立成功,则检查目标PLC是否已被感染。如连接未建立成功,或目标PLC已被感染,则选择新IP重新尝试建立连接。如目标PLC未被感染,则停止目标PLC,下装病毒程序,最后重新启动目标PLC。流程如下图所示。 寻找目标 所有的三菱PLC通过102端口进行TCP通信,因此可以通过尝试建立102端口的TCP通信来进行目标的寻找。Step7组态软件中提供了两个FB块,TCON以及TDISCON,如下图所示。TCON用来建立TCP连接,其中REQ输入管脚通过上升沿信号触发,CONNECT输入管脚配置TCON建立连接的如对端IP、对端端口号,本机端口号,通信方式等相关参数。TDISCON用来断掉TCP连接,REQ上升沿触发。 首先使用TCON块建立连接,如果建立成功,即输出管脚DONE为TRUE时,则置状态字con_state为20,继续下一步病毒的传播感染操作。如连续200次建立连接不成功,则置状态字con_state为0。 传播感染 正常情况下,博途软件会对PLC进行程序的下装操作,而下装过程正式利用了西门子私有的S7协议。
在三菱PLC简介章节中提到三菱S7Comm协议以及早期的S7Comm-Plus协议已可以被研究者熟悉利用。因此在传播感染阶段,可以根据S7协议的内容,通过伪造博途软件下装程序的报文,可以实现PLC到PLC的程序传输操作。也就是说已感染病毒的PLC向目标PLC发送下装程序块的报文,而目标PLC识别到报文后,误以为是博途软件对其进行下装,最后会将报文中的相关功能块存储在PLC中。
Step7组态软件中使用TSEND功能块进行数据的发送,使用TRCV功能块进行数据的接收。在TSEND块中,REQ输入管脚上升沿触发,DATA为需要发送的数据区。在TRCV中,EN_R上升沿触发,DATA为接收数据的存储区,RCVD_LEN为实际接收到数据的长度。
在程序的发送过程中,需要满足S7协议的相关通信时序以及报文格式。图7所示为S7建立连接的过程。首先是TCP的三次握手,接下来建立COTP连接,建立完成后进行S7协议的连接建立。建立成功后可以使用S7协议进行启停PLC、下装程序、PLC中数据读写等正常操作。 激活 建立调用病毒程序的OB块OB9999,并将其存植入到目标PLC中,用以激活病毒,并进行新的病毒传播感染。西门子PLC在运行时,会按照从OB1到OB9999的顺序进行调用。如下图所示。 恶意功能的实现
● 一旦PLC被感染病毒,会基于TCP主动去连接C&C服务器。通过C&C服务器,可以远程控制PLC,包括PLC的启停,输出值的改变等。
● 一旦PLC被病毒感染,在局域网中的其他PLC,可以通过Socks4代理连接到C&C服务器。
● 可以向PLC中下装例如死循环、除零或者负数开方的程序,让PLC停止工作。
● 可以通过编写正常的PLC程序,来改变输出值,进而影响现场设备的正常运行。
病毒的防护
● 设置权限密码
● 工控厂商对于自己产品,在协议层设置权限密码,没有密码的清空下,不可以利用协议来与PLC建立通信连接。
● 布置IDS/审计系统,通过工控协议特征值的采集、分析与识别,如发现异常数据包,则记录日志或报警
● 布置工控防火墙● 通过工控防火墙,对异常数据包进行检测以及隔离防护