寻找目标
所有的西门子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识别到报文后,误以为是博途软件对其进行下装,Zui后会将报文中的相关功能块存储在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所示,其中:
TCP:即传输控制协议,是一种面向连接(连接导向)的、可靠的、基于IP的传输层协议,在IETF的RFC 793标准中进行定义。
ISO-ON-TCP:即基于TCP的ISO传输服务,在在IETF的RFC1006标准中进行说明。
ISO Transport protocol:即ISO传输协议,在ISO8073中进行说明。