本文将展示的是一种新型的PLC蠕虫病毒,该病毒可以不借助上位PC机,仅通过PLC之间进行互相传播。该病毒的实现思路,适用于多个厂家的PLC设备,并且可以在一定规则范围内相互进行传播。本文采用西门子PLC举例进行说明。

随着“互联网+制造”的工业4.0概念的提出,独立、隔离的传统工控领域迎来了新的大数据互联时代。与此同时,工控安全的问题,也随着互联,被更广泛的暴露在了Internet中。近几年来,越来越多的工控设备被暴露在了互联网上。

  1. 在Black Hat2011,Dillon Beresford等人在他们的报告《Exploiting Siemens Simatic S7 PLCs》中演示了如何通过西门子S7Comm协议的权限缺失漏洞来远程操作PLC。
  2. 在Black Hat2015,Johannes Klick 等在他们的报告《Internet-facing PLCs – A New Back Orifice》中演示攻击者如何通过代理,来发现内网中更多的PLC设备。
  3. 在Black Hat2016,Ralf Spenneberg等在他们的报告《 PLC-Blaster: A Worm Living Solely in the PLC 》中提出了PLC蠕虫病毒的概念,但没有具体的实现细节。
  4. 2016年8月,绿盟科技工控安全专家实现了这个病毒并给出检测及防护方案。根据之前的研究表明,一个恶意软件可以在一个PLC之上运行,绿盟科技的工控研究员 使用结构化文本(SCL)语言开发一个蠕虫病毒 ,利用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协议进行通信。该协议采用了一些特殊编码规范,并且做了抗重放攻击的防护。但是其安全防护仍然较弱,已被基本破解。S7-1200系列固件版本为V3.0以上,以及S7-1500系列的PLC,采用了最新的S7Comm-Plus协议,该协议对比之前S7Comm-Plus协议,采用了加密算法,目前仍未被研究透彻。

西门子PLC通过Step7以及WinCC软件进行组态,目前最新版本为TIA Portal V13。其中使用Step7进行下位机组态,WinCC进行上位机组态。

在Step7组态软件中,用户通过编写POU程序块来完成工业现场的控制以及工艺流程的实现。西门子POU程序块包括:

  1. OB(Organization Block ):组织块,为用户程序的入口程序块
  2. FB(Function Block):功能函数块,实现一些封装好的函数功能
  3. FC(Function):函数块,为用户编写的程序
  4. DB(Data Block):数据块,用来存放全局变量
  5. SFB(System Function Block):系统功能函数库,系统内部封装的函数块
  6. SFC(System Function):系统函数库,系统内部封装的函数
  7. Step7程序块的组态语言包括LD(梯形图),FBD(功能块图)、SCL(结构化控制语言)、STL(语句列表)。

西门子PLC在进行程序下装的过程中,首先会在下装前停止PLC的运算,下装程序完成后再重新启动PLC。

关于Step7中的众多编程语言

西门子Step7中的各种编程语言(LAD、FBD、STL、SCL、GRAPH、Higraphy、CFC等)有不同的应用场合、应用对象及各自鲜明的特点。大家都有这样的经历,出行会选用不同的交通方式,有时步行,骑自行车,有时乘坐公交、地铁、开车或者打车,这取决于路途的远近、路况等实际情况,当然也取决于你拥有什么样的交通工具。Step7中同样也为自动化项目程序设计提供了不同的编程语言,提供了不同的编程选择。

@n次看你的背影 评价说

  1. LAD语言的主要思想是依靠使能流的流向来进行编程;它的基本指令,采用的符号类似于电气继电器控制回路中的常开、常闭触点、和线圈来表达,而且编程顺序总是从左到右,至上而下,类似于设计好的电气控制原理图。使能流就如电气控制回路中的电流一般贯穿其中,直观、可读性较强;特别适合熟悉电气继电器控制回路的专业人员使用。调用子程序的场合也可以使用LAD。
  2. FBD语言的主要思想来源于数字电路中的与、或、非、异或·····等各种门电路,它的基本指令采用逻辑门的方式来表达;而编程时,数字电路的高电平、底电平把各种逻辑门贯穿其中,直观、可读性较强;特别适合熟悉数字电路的专业人员使用。调用子程序的场合也可以使用FBD。
  3. STL语言类似于汇编语言 ,SIEMENS的STL语言加入了较多二次开发的指令,主要是面向CPU操作的语言,比汇编语言稍高级;文本顺序编程方式;它的优点是:指令最全、代码精炼、体积较小、效率最高、功能最强大、编程灵活自由、能完成其它语言无法完成的工作、每条语句都能做独立的注释;它的缺点是:抽象、不容易理解、可读性不强;有汇编语言经验的专业人员比较喜欢使用。比较适合用STL语言来开发、和调用子程序!
  4. SCL语言类似Pascal语言 ,结构严谨,具有C语言的思想,属于高级语言,做复杂数据计算和处理最佳;用作子程序的开发也比较适合,特别适合熟悉Pascal语言的专业人员使用,主要使用在复杂数据处理的场合,编译后生成S7程序才能使用。此语言工具需要单独安装,还需要独立的授权。
  5. GRAPH语言类似图形编程,让人感觉有条理和直观,在顺序控制方面处理能力较强、特别适合实现各种顺序控制任务;此语言工具需要单独安装,还需要独立的授权。
  6. CFC语言主要是用在各个功能和功能块之间用连线的方式来进行编程,连线方便,比较直观,是面向对象的语言工具!此语言工具需要单独安装,还需要独立的授权。

工控PLC蠕虫病毒的重现

对于病毒的实现流程,首先选择IP尝试建立连接,如果连接建立成功,则检查目标PLC是否已被感染。如连接未建立成功,或目标PLC已被感染,则选择新IP重新尝试建立连接。如目标PLC未被感染,则停止目标PLC,下装病毒程序,最后重新启动目标PLC。流程如图1所示。

工控PLC蠕虫病毒如何寻找目标

所有的西门子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蠕虫病毒传播感染机制

正常情况下,博途软件会对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所示,其中:

  1. TCP:即传输控制协议,是一种面向连接(连接导向)的、可靠的、基于IP的传输层协议,在IETF的RFC 793标准中进行定义。
  2. ISO-ON-TCP:即基于TCP的ISO传输服务,在在IETF的RFC1006标准中进行说明。
  3. ISO Transport protocol:即ISO传输协议,在ISO8073中进行说明。

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程序调用步骤

恶意功能的实现

  1. C&C服务器 一旦PLC被感染病毒,会基于TCP主动去连接C&C服务器。通过C&C服务器,可以远程控制PLC,包括PLC的启停,输出值的改变等。
  2. Socks4代理 一旦PLC被病毒感染,在局域网中的其他PLC,可以通过Socks4代理连接到C&C服务器。
  3. 拒绝服务攻击 可以向PLC中下装例如死循环、除零或者负数开方的程序,让PLC停止工作。
  4. 改变输出值 可以通过编写正常的PLC程序,来改变输出值,进而影响现场设备的正常运行。

工控PLC蠕虫病毒检测与防护

病毒的检测

  • 利用博途软件    博途软件提供了PLC程序在线与离线差异的检测功能,如图11所示。程序块后面的绿色圆圈表示在线程序与离线程序一致,蓝色与橘黄色组成的圆形表示在线程序与离线程序不一致。

博途软件对程序在线离线一致性的检测

  • 观察PLC的状态灯    下装程序的过程中会导致PLC的停止与启动,在此期间,所有模拟量数值与开关量状态会保持不变。然后该时间仅有几秒钟,操作员可能会忽视该细节。
  • 使用工控漏扫设备    使用工控漏扫设备对PLC进行扫描,由于病毒程序必须利用较大编号的OB块。因此扫描较大编号的OB块可以对病毒进行检测。
  • 检测网络    在病毒进行传播的过程中,网络中会出现PLC与PLC通信的数据报文,根据该异常报文可以检测出病毒测存在。

病毒的存活性

  • 重启PLC    病毒为正常的程序块,因此重启PLC后,该病毒仍存在于PLC中,并且正常运行。
  • 恢复到出厂设置    恢复到出厂设置会清空PLC中的所有程序,因此病毒程序连同正常程序一起会被清空。
  • 下装程序    如果有正常的OB9999组织块,或者与病毒同编号的FC块、DB块的下装,则病毒会被新下装的程序覆盖,并且不会再次被感染

病毒的防护

  • 设置权限密码    工控厂商对于自己产品,在协议层设置权限密码,没有密码的清空下,不可以利用协议来与PLC建立通信连接。
  • 在工控系统中布置IDS/审计系统    布置IDS/审计系统,通过工控协议特征值的采集、分析与识别,如发现异常数据包,则记录日志或报警
  • 布置工控防火墙    通过工控防火墙,对异常数据包进行检测以及隔离防护

《BlackHat上的工控蠕虫病毒 绿盟科技工控研究员用SCL语言编写实现 录像让你亲眼看看》的相关文章请参看

工控网络与互联网对接需要纵深防御 美国国土安全部发布工控安全策略

工控系统生命周期中功能安全至关重要 用工控安全预警平台及时获取情报是关键

追踪工控恶意攻击食尸鬼行动 从样本到销售人员 HawkEye商业间谍软件浮现出水面

ICS-CERT美国工控安全小组2015年报告解读 112项安全评估638个漏洞

原文发布时间:2017年3月24日

本文由:绿盟科技 发布,版权归属于原作者

原文链接:http://toutiao.secjia.com/nsfocus-industrial-security-researcher-shows-plc-worm

本文来自云栖社区合作伙伴安全加,了解相关信息可以关注安全加网站

BlackHat上的工控蠕虫病毒 绿盟科技工控研究员用SCL语言编写实现 录像让你亲眼看看...相关推荐

  1. Docker Hub上镜像发现挖矿蠕虫病毒,已导致2000台主机感染

    点击上方"民工哥技术之路"选择"星标" 每天10点为你分享不一样的干货   安全公司Palo Alto Networks威胁情报小组Unit 42发现一种新型的 ...

  2. 爬虫你的主机中的软件中止了一个已建立的连接_Docker Hub上镜像发现挖矿蠕虫病毒,已导致2000台主机感染...

    点击上方"民工哥技术之路"选择"星标" 每天10点为你分享不一样的干货  读者福利!多达 2048G 各种资源免费赠送 安全公司Palo Alto Networ ...

  3. 网络攻防——黛蛇蠕虫病毒

    黛蛇蠕虫是互联网上爆发的一个著名的蠕虫案例,它可以说是互联网安全威胁从网络病毒蠕虫时代终结,进入以僵尸网络,网页木马为热门的客户端威胁时代网络蠕虫的一次谢幕演出. 黛蛇蠕虫是在2005年12月15日开 ...

  4. 警惕H-worm蠕虫病毒伪装电影样片钓鱼,草率点击附件会中远控木马

    一.背景 腾讯安全御见威胁情报中心发现附带H-worm蠕虫病毒变种的钓鱼邮件攻击.攻击者参考VBS蠕虫病毒H-worm代码制作JS版本变种,并将其打包为压缩文件,之后伪装成某电影特效制作公司向攻击目标 ...

  5. 第一种蠕虫病毒诞生 | 历史上的今天

    整理 | 王启隆 透过「历史上的今天」,从过去看未来,从现在亦可以改变未来. 今天是 2022 年 11 月 2 日,1815 年的今天,乔治·布尔(George Boole)诞生,他提出的布尔逻辑理 ...

  6. 严防死守把蠕虫病毒拒绝在系统之外

    蠕虫 病毒现在越来越多,有没有什么好办法减少它们带来的危险呢!小编给大家一法,大家看看效果怎么样? 纵观今年全球 病毒的发展,不难发现蠕虫 病毒接踵而至,着实让 杀毒市场火了一把.蠕虫 病毒信手拈来, ...

  7. 浅谈用delphi来编写蠕虫病毒

    能大家想到病毒,第一反应就是可能是用asm来编写,或者是vbsript,而高级语言如delphi就好象不能编写一样,其实事实并不是这个样子的,只要我们花一些时间,照样可以写出简短而高效的病毒程序来,一 ...

  8. “艾妮”(ANI)蠕虫病毒

    病毒名:艾妮(别名,麦英.ANI蠕虫) 英文名:MyInfect.af/DlOnlineGames/Trojan-Downloader.Win32.Agent.bky 技术分析: 1.释放病毒文件到如 ...

  9. java可以编写蠕虫病毒吗,暴力蠕虫来袭!网友们直呼:惊不惊喜,意不意外,怕不怕!...

    近日,多个安全团队监测到一种名为Incaseformat的病毒,在全国多个地区出现.据了解,Incaseformat是一种蠕虫病毒,该病毒会遍布除C盘外的所有磁盘文件并进行删除,对用户造成不可挽回的损 ...

最新文章

  1. Activity本质和内部实现机制
  2. 用实例讲解Spark Sreaming--转
  3. 如何看懂发电机功率圆图
  4. python最基本的两种循环结构_Python基础 — 分支和循环
  5. java_函数的重载
  6. 如何把本地yum源给其他机器使用_如何使用系统安装盘做yum的本地源?
  7. Oracle创建视图、通过视图创建表
  8. .net 实现 URL重写,伪静态 1
  9. 日常(关于游泳之列的真理问题讨论)
  10. js 添加事件 attachEvent 和addEventListener 的用法
  11. 计算机系统结构综合课程设计报告,计算机系统结构课程设计报告书.doc
  12. CV学习笔记-推理和训练
  13. 等保与ISO27001
  14. kasp技术原理_KASP——基因分型研究者指尖跳跃的珠链
  15. android为APK新建SELINUX权限域seapp_contexts
  16. scratch编程我的世界3D史蒂夫
  17. 黑客游戏Hacknet下载(游戏分享一)
  18. c语言pointer,C语言讲义——指针(pointer)
  19. 看计划排产软件在纺织业的应用
  20. 3年间 女子称遭邻居报复放了上千条虫子

热门文章

  1. [国产PLC]耐特节省能耗PLC在音乐喷泉系统中怎样运用
  2. 《数据结构》(C++)之第一章:绪论
  3. ARC096F Sweet Alchemy
  4. 《Java设计模式之策略模式》
  5. HTML网页设计期末课程大作业~旅游住宿酒店的HTML网页设计(14页) ~学生网页设计作业源码 旅游网页代码 学生网页设计与制作期末作业下载 DW旅游网页作业代码下载
  6. Python下载速度太慢?使用国内网站速度直接飞起(附安装教程)
  7. 生成器对象的send方法
  8. C# 绘制箭头的方法,仿微信截图的箭头
  9. 使用asp.net mvc,boostrap及knockout.js开发微信自定义菜单编辑工具
  10. [Java]控制台输入5位整数,求各个位数上的和