工控安全初探

方校长说:工控系统不是多安全,而是常人很少接触到

PLC是什么?能做什么?

工业场景需要控制许多的机械设备,而大部分机械设备需要用电路信号直接控制,比如许许多多的开关,对应到电上就是电路的通断。所以需要一些可以满足这种应用场景的专用计算机,并且还需要低时延,稳定性高,防震防潮等,这种计算机就是PLC(Programmable Logic Controller)

image

image

如果你平日乐于考虑性价比,应该能想到,PLC最终要做的就是控制一些电路信号的逻辑处理,数字量以及模拟量的处理,这玩意单片机,树莓派都能干啊,家用PC上的GPIO口都可以,为啥非得用PLC呢?

image

通信方式梳理:GPIO,I2C,SPI,UART,USART,USB的区别

相信阅读完这几个问题后,你的心中应该已经有了答案。而且当你把PLC拆了以后,在你面前的还是一个传统的嵌入式设备,甚至可能就是一个单片机。PLC的厂商很多,只要实现了类似用梯形图编程控制输入输出电路的盒子都可以被当成PLC卖,所以实现原理也是百花齐放,甚至有的实现就是个linux软件,比如OPENPLC。所以在原理上还是可以就把这玩意当成一个嵌入式的计算机来研究就好了。

PLC怎么使用?

好了,现在我们知道PLC是什么(是个专用计算机),能做什么(控制IO),那下面我们来回答怎么使用PLC:

这玩意和其他的嵌入式设备除了设计上考虑了对应的应用场景,使用方法就没有其他的区别了么?当然有,因为搞工业的人大部分不是程序员,不会写代码,但是他们大部分是电气专业出身,会看电路图,所以搞工控的工程师用来编写控制输入输出逻辑的程序是由一种叫”梯形图”的语言编写而成:梯形图基础教程。当然最终的程序还是会被梯形图的解释程序或者编译成相应的二进制代码来控制PLC进行相应的操作,这个也就是PLC主要干的事:实现通过梯形图控制硬件IO。

image

西门子s7-200smart的编程软件STEP 7-Micro,可以画梯形图,也可以控制PLC

PLC没有键盘,鼠标,显示器,我们怎么把梯形图扔进去呢?答:类似所有的嵌入式设备,通过一些通信协议,连上它!当然,PLC发展了这么些年,连接它的方式也在不停的变化,就像交换机一样,从串口到网口。目前大部分PLC都会作为服务端,开放一些端口(这句话已经表示了这玩意就是基于TCP/IP的),然后用以太网网线连接到交换机或者路由器上,并配置好IP地址。这些端口上绑定的服务用来等着客户端连接,客户端进而可以对PLC进行各种各样的控制(启停,上传下载梯形图程序,烧写固件,获得IO当前状态,更改IO状态等等),所以这里就需要客户端和PLC的通信,于是就有了两个东西:客户端和通信协议。客户端可以是支持通信协议客户端版本的任何电子设备,可能是编程器(烧写固件的设备),打印机,PC端的上位机软件,甚至可能是其他PLC(PLC既是服务端,又是客户端),这里我们重点关注上位机软件,因为大部分功能都是由上位机软件控制PLC完成的。不同厂商的PLC的上位机软件和通信协议基本是不同的,例如:

而且刚才所说的那些功能(启停,上传下载梯形图程序,烧写固件,获得IO当前状态,更改IO状态等等),可能不都集成在一个软件中,因为不是人人都要对PLC做如此多的事情的:

  • 比如工程师需要对PLC进行编程,那么他只需要能上传下载梯形图程序,就可以了。
  • 而操作员是真正控制这个PLC的人,所以操作员需要知道PLC状态并且能启动停止PLC
  • 中控室的监控人员需要对PLC当前的工作状态进行监控,于是他需要能获得当前PLC以及IO的状态

image

人机交互接口(HMI)与西门子的PLC:S7-1500进行连接

于是对于不同的情景有不同的软件,就有了编程软件,监视软件,控制软件,组态软件等等。当然也有集所有功能于一身的软件,例如西门子的TIA portal。但对于PLC来讲,这些软件都是客户端,采用相应的通信协议去访问PLC的某个端口,然后跟PLC进行交互来完成相应的工作。其中监控的部分继续完善成一个Web或者客户端软件,把从PLC获得数据存下来然后展示的东西,这一整套就是SCADA。所以不要被工控里的一堆英文单词迷惑,如:

名词 解释
RTU Remote Terminal Unit,中文全称为远程终端控制系统
DTU 数据传输单元DTU (Data Transfer unit),是专门用于将串口数据转换为IP数据或将IP数据转换为串口数据通过无线通信网络进行传送的无线终端设备
FTU Feeder Terminal Unit配电开关监控终端
TTU (distribution Transformer supervisory Terminal Unit, 配电变压器监测终端)。
ESD emergency shutdown device,紧急停车系统
CNC 计算机数字控制机床(Computer numerical control)
MCC 马达控制中心、电机控制系统
TSI 汽轮机仪表监视系统
NCS 升压站网络监控系统( Network Control System)
CCS 一种连续的调节系统(Continuious Control System)
FSSS 锅炉炉膛安全监视系统
ETS 汽轮机保护系统
ECS 电气控制系统
MEH 小汽轮机数字电液调节系统
BPCS 旁路控制系统
DEH 汽轮机数字电液调节系统
LCU 现地控制单元(Local Control Unit )
AGC 自动发电控制(Automatic Gain Control)
AGV Automated Guided Vehicle自动导引运输车
SIS Safety Instrumented System 安全仪表系统

这些玩意叫法不同,多是按照功能来分的,而且可能个名词对应的是一整套系统(一堆硬件软件)。我们仅仅关注他到底是个什么,是个系统总称,是PLC,是PC,还是web服务。除了PLC剩下的基本还是传统信息系统那套东西(PC,交换机,路由器,服务器),所以我们关注点先放在PLC上就好。而且说一千道一万,如果要远程攻击PLC,关注点就在PLC相应的通信协议上。

image

一个典型的工业控制系统的网络

可见在这个网络中,操作员站和工程师站所处的网络层次是相同的,他们都是通过相应的通信协议来访问PLC,不过他们的作用不一样,所以使用的PLC的功能也不用,所以他们所使用的软件可能也不相同。刚才我们提到了:编程软件,监视软件,控制软件,组态软件。前三个软件的场景我们都说了,但是一直没说组态软件,组态软件是啥?组态是啥?

看完定义也许还是很懵逼,感觉不太说人话,我也是研究了好久才感觉自己明白这两个词语是什么意思。想想这样一个情景,你现在在做一个自己的工业控制系统,你这个系统到底控制什么你自己决定,你是生产大米,还是养猪,还是造车随意,都是用PLC来控制一堆电气设备。你针对你的场景你的设备写好了梯形图下载到了PLC中(对,这里不叫上传),现在你使用了你采购的PLC的对应的编程软件。然后你需要做一个监视和控制二合一的软件,来监控你的生产流程。为啥要我自己做?因为你在做你自己场景下的工控系统,你用了什么电气设备,这个设备的状态,在什么情况下正常,什么情况下异常,仅仅在当下的情景才有意义,所以这个监控和控制的软件也是根据当前情景定制的。可是电气工程师并不会写代码,于是就有了组态软件!组态软件可以造出监视软件和控制PLC的软件,或者说监视和控制PLC的功能是组态软件中的工程中实现。所以组态软件首先要支持PLC的通信协议,因为他们要作为客户端向PLC请求当前的一些状态数据,甚至控制PLC的状态以及更改IO或寄存器的值,然后组态软件还能绘制当前工程的示意图,并且能打包工程生成可执行的程序放到监控人员的PC上运行起来。运行时可以把从PLC收集到的数据运算后画到示意图的对应位置,一个监视系统就算是完成了。组态软件是用来干这个的,组态软件是用来组态的,所以组态到底是啥应该已经可以理解了。一个常见的国产组态软件:力控

image

力控组态软件界面

在工程中画完图之后,并且配置好PLC的IP地址之类的信息之后,可以打包工程发布一个web服务,这个web一运行就可以看到监视画面,web服务会从PLC中取数据并绘制画面中的数据,达到监控效果。

当然如果你是个程序员,你可以不用组态软件,自己实现相应协议的客户端,去读数据,然后数据处理,绘图。不过主流工控系统都是用组态软件画的监视界面,所以其实很少有单独的监视软件和控制软件,对于PLC的上位机软件主要还是两种:编程软件和组态软件。这两个软件都要支持PLC的通信协议才可以正常工作,所以如果有第三方的组态软件,或者单纯的控制软件,支持目标PLC,说明这个协议差不多是公开的了,或者被逆向透了,比如力控支持的PLC列表,再比如一个单纯的第三方控制软件:hslcommunication

image

hslcommunication软件界面

而且大部分有关工控的软件都是windows的,而且工业设备很多使用了很多年,软件也是很多年之前的,所以想研究工控安全的话,手里得有一些配置好各种环境的windows虚拟机

PLC内部原理的探索

如果要了解工控安全,就来到了我们最后一个问题:PLC的内部原理的探索。注意是探索,就是我也不知道原理是啥,但是我大概知道研究原理的方法。

我们不是PLC的开发者,而且开发者不会告诉你PLC到底是怎么实现的,所以我们就只能如探索一个未知的世界一样来研究它,逆向它,当然你也可以打入开发者内部获得一些资料。首当其冲,最直观的一个感受:这玩意有TCP/IP协议栈。而且刚才提到过不同的PLC实现可能是大不相同的,所以看起来比较通用的方式就是通过流量,迈出对PLC原理探索的第一步。利用nmap一些自带的脚本可以直接探测出目标PLC版本一些型号,例如:

 $ nmap 192.168.2.1 -p 102 --script=s7-info.nse
 102/tcp open  Siemens S7 PLC
| s7-info:
|   Basic Hardware: 6ES7 315-2AG10-0AB0
|   System Name: SIMATIC 300(1)
|   Copyright: Original Siemens Equipment
|   Version: 2.6.9
|   Module Type: CPU 315-2 DP
|   Module: 6ES7 315-2AG10-0AB0
|_  Serial Number: S C-X4U421302009

还可以通过一些现有的漏洞的exp感觉一下,这种漏洞的原理是啥,能不能反应出一些底层实现的信息:

➜  ~ searchsploit s7-300
---------------------------------------------------------------- 
 Exploit Title                                                  |
                                                                |
---------------------------------------------------------------- 
Siemens SIMATIC S7-300 CPU - Remote Denial of Service           |
Siemens Simatic S7-300 - PLC Remote Memory Viewer (Metasploit)  |
Siemens Simatic S7-300/400 - CPU START/STOP Module (Metasploit) |
---------------------------------------------------------------- 

不过好像都浅尝辄止,因为流量的角度来看,并没有能特别反应底层实现的信息,PLC好像也没有ssh或者telnet这种连上就有shell的接口,那么看起来好像就只有固件逆向了,还以西门子举例,有一个博主:大单GreatDane曾经写过一篇文章:西门子PLC设备中主控芯片和固件逆向分析-初探,这篇文章现在被密码保护,不过还是能从快照中获得原文。以及blackhat europe2019的一个议题:Doors of Durin: The Veiled Gate to Siemens S7 Silicon

image

实际上我们还是可以通过比较传统的手段获得PLC的固件然后进行逆向分析,从而了解PLC的实现

PLC协议安全

工控系统的攻击面包括了一些传统信息系统,因为上位机软件所在的计算机多数是windows,而且还会部署各种各样的服务比如web和数据库等。这里我们重点关注工控系统中特有的PLC,那么就是研究PLC开放的端口后面绑定的服务,这个服务用来解析相应的通信协议并完成相应的工作,所以就是关注PLC相应的通信协议。这里有一些参考文章: