★ 李林枫,周睿康,李琳 中国电子技术标准化研究院
摘要:工业控制系统是承载国家经济发展的重要基础设施,随着信息化和工业化的深度融合,工业控制系统信息安全形势日益严峻。工控系统协议作为工业控制系统的重要组成部分,越来越受到更多人的关注。本文以工业控制系统协议安全分析为出发点,从协议原理、协议格式等方面,分析工控协议安全现状,分享测试经验。
关键词:工业控制系统;信息安全
1 引言
随着信息化和工业化的深度融合,信息安全威胁逐渐向工业领域蔓延,工业控制系统信息安全形势日益严峻。如今的工业控制系统在控制规模、控制技术和信息共享方面都发生了巨大的变化,由最初简单控制的封闭系统发展成现在复杂或者先进控制的开放系统,针对工业控制系统的网络攻击事件日益增多,工业控制系统正面临前所未有的网络安全威胁。工控系统协议作为工业控制系统的重要组成部分,越来越受到关注。本文以工业控制系统协议安全分析为出发点,从协议原理、协议格式和攻击方法等方面,多角度分析工控协议安全现状,分享测试经验。
2 研究背景
工业控制系统的通信通常采用工业控制系统特有的通信协议,工业控制系统协议目的往往是满足大规模分布式系统的实时性运作需求,主要考虑效率问题而忽略其他功能需求。在工控系统安全面临风险越来越大的背景下,工业控制系统协议逐渐成为工控系统安全的关注点。例如,Modbus协议、S7协议、DNP3协议等常见工业网络协议,就存在严重的安全问题。
工业控制网络由现场总线技术发展而来,对于通信协议的可靠性、实时性要求很高。标准化工业控制网络协议的出现,方便地实现了各种异构现场设备之间的无阻碍通信,使工业生产更自动化。一般协议安全性问题可以分为两种:一种是协议自身的设计对安全性考虑的先天不足,即从设计方面引入的安全问题;另一种是协议的不正确实现引起的安全问题,黑客入侵时将对这些不安全的设计或者实现进行相关的渗透和利用。
3 问题分析
3.1 Modbus协议介绍
Modbus协议是在1979年由Modicon公司设计的,是全球第一个可真正用于工业控制的现场总线协议,也是目前使用最为广泛的工业控制通信协议之一。Modbus常见的类型包括:ASCII、RTU、TCP。标准的Modicon控制器使用RS232C实现串行的Modbus。Modbus的ASCII、RTU协议规定了消息、数据的结构、命令和就答的方式,数据通讯采用Master/Slave方式,Master端发出数据请求消息,Slave端接收到正确消息后就可以发送数据到Master端以响应请求;Master端也可以直接发消息修改Slave端的数据,实现双向读写。
Modbus是一种应用层协议,它定义了与基础网络无关的数据单元(ADU),可以在以太网(TCP/IP)或串行链路上(RS232、RS485等)进行通信(以太网ADU和串行ADU略有不同)。在串行链路的主从通信中,Modbus主设备可以连接一个或N(最大为247)个从设备,主从设备之间的通信包括单播模式和广播模式。
Modbus协议定义了一个与基础通信层无关的简单协议数据单元(PDU),特定总线或网线上的Modbus协议映射能够在应用数据单元(ADU)上引入一些附加域,图1为Modbus TCP协议的报文格式,其中Modbus协议定义了请求、响应和异常响应三种类型的PDU,每种类型的PDU都有其相应的含义与表示方法。
图1 ADU格式
Modbus协议定义了公共功能码、用户定义功能码(65~72和100~110)和保留功能码三种类型的功能码,其中公共功能码具有唯一性且已被定义,在通信数据报文中功能码占用一个字节,有效的功能码范围是1~255(十进制)。它采用主从结构,客户机可以通过Modbus协议与不同类型的总线或网络上的服务器进行通信。采用Modbus协议的通信方式为,首先客户机使用不同的功能码向服务器发起请求操作,然后服务器执行功能码定义的操作并向客户机发送响应。当客户机请求的功能码和数据请求通过校验时,则服务器向客户机返回操作码和数据响应,客户机接受响应;如果校验不通过,那么服务器向客户机返回差错码和异常码。图2、图3分别为Modbus正常响应和异常响应的事务处理流程。
图2 Modbus正常响应的事务处理流程
图3 Modbus异常响应的事务处理流程
3.2 Modbus协议安全问题
Modbus协议原为使用可编程逻辑控制器(PLC)通信而发表,现已经成为工业领域通信协议的业界标准,是工业电子设备之间常用的连接方式。由于协议设计时间较早,未过多考虑安全性,导致其网络安全问题十分突出。Modbus协议所存在的安全问题包括如下几个方面:
(1)缺乏认证
Modbus协议没有定义任何认证,认证的目的是保证收到的信息来自合法的用户,导致攻击者找到合法地址后使用功能码就能建立通信会话,从而扰乱控制过程。
(2)缺乏授权
Modbus协议没有基于角色的访问控制机制,也没有对用户的权限进行划分,这会导致任意用户可以执行任意功能。
(3)缺乏加密
由于Modbus协议的地址和命令采用明文传输,可以很容易被攻击者捕获和解析。
(4)功能码滥用
Modbus网络异常的一个主要因素就是功能码滥用。例如短周期的无用命令、不正确的报文长度等都有可能导致DoS攻击。
3.3 S7协议介绍
西门子设备使用多种不同现场总线协议,例如:MPI、PROFIBUS、IE、PROFINET等。PROFINET用于将PLC连接到I/O模块,而不是设备的管理协议。S7以太网通信协议,主要用于将PLC连接到PC站(PG/PC-PLC通信)。
S7通信支持两种方式,一是基于客户端(Client)/服务器(Server)的单边通信, 二是基于伙伴(Partner)/伙伴(Partner)的双边通信。客户端(Client)/服务器(Server)模式是最常用的通信方式,也称作S7单边通信。在该模式中,只需要在客户端一侧进行配置和编程;服务器一侧只需要准备好需要被访问的数据,不需要任何编程(服务器的“服务”功能是硬件提供的,不需要用户软件的任何设置)。客户端在S7通信中是资源的索取者,而服务器则是资源的提供者。服务器(Server)通常是S7-PLC的CPU,它的资源就是其内部的变量/数据等。客户端通过S7通信协议,对服务器的数据进行读取或写入的操作。
3.4 S7协议安全问题
S7通信协议是西门子S7系列PLC内部集成的一种通信协议,是一种运行在传输层之上(会话层/表示层/应用层)、经过特殊优化的通信协议,其主要面临的安全威胁包括如下几个方面:
(1)重放攻击
重放攻击是指攻击者发送一个目的主机已接收过的包来欺骗系统。工控系统中的重放攻击是利用S7协议缺乏认证的脆弱性,把上位机软件编译好的程序重新下装到PLC机器当中,抓包截取的就是从开始连接到结束连接这一段的数据包,进行重新发送。主要用于破坏身份认证的正确性。
(2)中间人攻击
工控系统中中间人攻击同样是利用S7协议缺乏认证的弱点,先通过ARP地址欺骗来进行流量劫持,劫持的是PLC和上位机之间的流量。然后通过截取的流量进行一系列的分析,比如对PLC的类型进行判断之后继续模拟加载payload、停止PLC工作等。
4 工业协议攻防实验
4.1 实验环境
本实验系统通过工控实训平台中的Modbus协议与S7协议仿真软件来模拟攻击者与服务器之间的通讯过程。
在Modbus协议攻防实验中,通过使用WireShark分析工业流量,掌握Modbus协议格式、功能码的用途,了解Modbus协议的格式,对Modbus协议进行攻击,获取Modbus设备数据。在S7协议攻防实验中,通过对S7服务端进行重放攻击,更改服务器的数据,停止CPU的运行状态。
4.2 Modbus协议攻防实验
实验步骤如下:
第一步:开启实训平台实验场景
访问靶场准备进入本地文件包含的实战场景,先开启实验所需要的环境。
在打开试验后,本实验只使用“Modbus仿真”和“Jump-Attack”这两个环境,开启两个环境系统所有节点,对环境进行远程控制。
第二步:搭建Modbus仿真
开启环境后,进入“Mo d bus仿真”环境系统中,这个系统就是包含Modbus仿真环境,本实验需要先开启“Modbus仿真”的服务才可以进行利用。进入系统后就需要配置Modbus仿真,打开ModSim32仿真软件,并新建一个工程。配置Modbus仿真软件的寄存器地址(Address)为“0001”、长度(Length)为“1”、设备地址(Device Id)为“1”、命令类型(Modbus Point Type)为“03:HOLDING REFISTER”。配置好Modbus信息后,需要开启Modbus仿真服务。
开启“cmd”,准备查看主机的IP地址,因为后面ModScan32是需要使用IP地址进行连接的。进入cmd后在cmd中输入“ipconfig”,然后回车,这个指令的作用是查看本机主机IP地址,知道Modbus仿真本机IP后收缩回Modbus仿真,打开Jump-Attack环境和Modbus协议采集软件ModScan32。如图4所示。
图4 Modbus协议采集软件
本实验设置连接Modbus仿真环境的IP,点击Connection---Connect---命令类型为“03:HOLDING REFISTER”。这些信息必须与Modbus仿真软件的信息相同,设置IP连接Modbus仿真环境,Modbus仿真和Modbus采集就连接成功了。
第三步:使用WireShark抓取并分析流量
回到Modbus仿真环境,利用WireShark来抓取流量。选择本地连接,因为Modbus仿真和力控传输中会产生流量,在过滤信息的位置填写Modbus。使用WireShark抓取仿真设备之间传输的流量。分析WireShark获取到的Modbus的流量,如图5所示。
图5 WireShark获取到的Modbus的流量
由图5可知,192.168.3.219(ModScan32)采集192.168.3.228(ModSim32)的数据时,发送请求寄存器的数据包:2a0000000006010100000001。数据报格式如表1所示。
表1 数据包格式
其中功能码01为读内部比特量输出状态,如告警、变位、故障、异常等。
寄存器地址0000代表读取内部比特量第1个比特位。
寄存器数量0001代表读取1个内部比特量比特位。
综合而言,读取从内部比特量比特第3位开始1位的内部比特量输出状态。
192.168.1.2(SCADA)采集192.168.1.6(PLC)的数据的时候,PLC响应的报文结果是:4f040000000401010100,如图6、图7所示。
图6 数据包信息
图7 (PLC)数据包
数据包格式如表2所示。
表2 数据包格式
其中功能码01为读内部比特量输出状态,如告警、变位、故障、异常等。
总数01代表读取一个内部比特位数据。
数据00代表读取的内部比特量数据总和为16进制的00。
综合而言,读取了1个比特位数据,16进制数据为00,根据Wire Shark的解析就可以看出WireShark已经将00进行了比特转换,16进制转换2进制为00000000,即内部比特量3比特位处于False状态。
本实验将实战重放攻击,修改Modbus采集数据抓取流量包,如图8所示。
图8 修改Modbus采集数据
本实验发现Modbus仿真工具数值也变换成1000,在其中就有写入1000的流量包,利用WireShark工具打开流量包,查看写入流量包,如图9所示。
图9 特征码信息
回到Jump-Attack打开青云来进行重放攻击, 设置IP让青云去连接Modbus仿真替换Modbus采集才发送特征码。本实验在输入报文的位置发送报文来进行攻击,把上面获取的特征码7f02000000060106000003e8后四位改成0001,变成7f0200000006010600000001。
查看结果,发现值变为1,操作成功,如图10所示。
图10 攻击成功
4.3 S7协议攻防实验
实验步骤如下:
第一步:开启实训平台实验场景
进入本地文件包含的实战场景,开启环境。本实验只使用“Jump-Attack”和“S7仿真”这两个环境,开启两个环境系统,开启所有节点时,双击所需要的环境“Jump-Attack”和“S7仿真”就可以对环境进行远程控制。
第二步:配置S7主站
开启环境后,先进入“S7仿真”环境系统中,这个系统就是包含S7攻防测试环境,需要开启“S7仿真”的服务才可以进行利用。进入系统后需要配置S7仿真,打开S7Sim应用程序。
成功进入了S7仿真工具界面,如图11所示。
图11 S7仿真工具界面
进入界面后,开启“启动仿真”的按钮,页面显示Server started(服务开启)。
开启“cmd”,准备查看主机的IP地址,因为后面S7scan是需要使用IP地址进行连接的。进入cmd后在cmd中输入“ipconfig”,然后回车,这个指令的作用是查看本机主机IP地址,完成组主站配置。
第三步:配置S7从站连接主站
本实验再进入“Jump-Attack”环境系统中,需要开启“S7采集”的服务才可以进行利用。在桌面找到S7仿真采集文件夹,双击打开此文件夹,找到S7Client这个应用程序,双击打开。
成功进入后,更改IP地址为S7仿真机的IP并点击连接,如图12所示。
图12 更改IP地址
点击运行设置,发现状态为“RUN”,说明连接成功。
第四步:抓包分析S7协议
返回到“S7仿真”的系统,找到WireShark程序,选择监听的网卡为本地连接。输入IP过滤条件ip.add == 仿真机的ip ,更直观地分析指定IP传递数据报文,避免其他通讯数据包干扰。
再次返回到“Jump-Attack”在S7Client界面进入“运行设置”,在下方点击“Stop”。此时再次返回“S7仿真”机器。WireShark会自行分析S7COMM报文内容,停止抓包。因为本实验要建立链接,所以需要COTP和S7COMM的请求包。在上面添加ip.addr ==IP&&cotp,找到对应IP的COTP请求包,复制其后两层的hex流,并粘贴到TXT文件中,再复制其第二层的hex流粘贴到TXT文件。
再找到S7COMM的请求包,并且复制其后三层的hex流粘贴到文本文档。在Info中找到Stop的包,单击这个数据,选择复制后三层的hex流。
再次返回WireShark。分别复制TPKT层、ISO层、S7层的hex流:右键对应层选择复制,单击...as a Hex Stream,返回到文本文档中,粘贴下来。
此时,三条流量的hex流全部粘贴完毕,如图13所示。
图13 三条流量的hex流
这时,本实验返回到“Jump-Attack”系统。回到S7Client软件中,找到运行设置。点击Hot Restart。
发现服务又变成了“RUN”。返回桌面打开“ComMax”应用程序。点击关闭,再点击参数设置,会有一个“通讯参数设置”的弹窗。修改IP地址为S7Sim的IP,端口为S7的端口102,最后点击确定。提示“端口设置成功 是否立即打开端口”,选择“是”。这时回到“S7仿真”,将刚才复制下来的文本输入青云的输入框中。先输入COTP的报文,点击发送,发现报文成功返回。再输入S7COMM的报文,点击发送,发现报文成功返回。此时已经建立了S7的连接。再输入STOP的报文,点击发送,发现报文成功返回。点开S7Client,点击运行设置,发现状态再次变成“STOP”,即可证明成功。
5 实验分析
本实验通过研究Modbus协议与S7协议安全问题,了解了协议脆弱性,掌握了Modbus协议与S7协议格式、功能码的用途。通过搭建仿真通信实验环境,本实验针对Modbus协议与S7协议存在的网络威胁,在工控实训平台上利用WireShark、青云ComMax等工具,实现了针对Modbus协议、S7协议的重放攻击,成功改变了PLC的运行状态。实验表明,Modbus协议与S7协议仍存在缺乏认证的重大隐患,无法保证收到的信息来自合法的用户,会执行未认证用户向设备发送的控制命令,极可能造成工业生产现场的财产损失和人员伤亡。因此,开发者可以从Modbus系统的全生命周期介入安全手段,融入安全编码等技术;可开发专用异常行为检测设备,分析其存在的各种操作行为是否异常,并最终决定采取的措施;还可以对协议数据进行深度解码分析,实现安全审计功能,从而提供安全事件爆发后的追查能力。
6 结语
工业控制系统信息安全关乎国计民生,保障系统信息安全是开展工业建设的坚实基础。针对不同的工业控制系统通信协议,采取适当的防护方案,实行恰当的安全防护措施,才能确保各行业网络的安全可靠。
作者简介
李林枫(1996-),男,湖南常德人,工程师,现就职于中国电子技术标准化研究院网络安全研究中心,主要研究方向为工业信息安全、密码安全等。
周睿康(1990-),男,浙江东阳人,工程师,硕士,现就职于中国电子技术标准化研究院网络安全研究中心,主要研究方向为工业信息安全。
李 琳(1983-),男,山东济南人,高级工程师,博士,现就职于中国电子技术标准化研究院网络安全研究中心,主要研究方向为工业信息安全、物联网安全、社交网络数据分析等。
参考文献
[1] 夏冀, 等. 工业控制系统信息安全风险评估方法研究[J]. 自动化博览, 2019, 36 (S2) : 58 - 60.
[2] 甘俊杰, 等. 石化、冶金、电力、轨交等行业工业控制系统信息安全隐患分析[J]. 自动化博览, 2018, 35 (S2) : 50 - 53.
来源 | 《自动化博览》2022年第一期暨《工业控制系统信息安全专刊(第八辑)》
声明:本文来自工业安全产业联盟,版权归作者所有。文章内容仅代表作者独立观点,不代表安全内参立场,转载目的在于传递更多信息。如有侵权,请联系 anquanneican@163.com。