基于Wireshark与Nmap的工业协议分析与工业漏洞挖掘的实现*
2021-03-20朱振乾张周晶马慧慧魏黎明
朱振乾,张周晶,马慧慧,魏黎明
(中国电子科技网络信息安全有限公司,四川 成都 610041)
0 引言
随着工业控制系统的通用化、网络化和智能化发展,工业控制系统信息安全形势日渐严峻。一方面传统的互联网信息安全威胁正在向工业控制系统蔓延,另一方面针对关键基础设施及其控制系统,以窃取敏感信息和破坏关键基础设施运行为主要目的攻击愈演愈烈[1]。近年来发生了一系列针对工控网络的攻击行为,如2010 年伊朗核设施遭遇了前所未有的严重攻击,国际核能组织发现伊朗的浓缩铀工厂的离心机不断被破坏,报废的数量接近伊朗浓缩铀工厂离心机总数的1/4。这就是震惊全世界的著名的“Stuxnet(震网)”病毒武器的攻击,从此针对工业控制系统的网络信息安全事件引起了全世界的高度关注。震网病毒能过被感染的U 盘或移动介质进入伊朗核设施网络。当U 盘或移动介质插入计算机时,震网病毒通过Windows 系统自动播放特性被植入伊朗核设施网络,然后在网络中不断复制并感染其他设备。震网病毒在伊朗核设施网络中寻找西门子公司的STEP7 控制软件,并经过欺骗和控制该软件达到破坏的目的。西门子公司的STEP7 软件用于控制伺服马达、电路开关和气体液体阀门,广泛应用于各行各业。该病毒找到西门子控制软件后,截获控制软件给可编程逻辑控制设备(Programmable Logic Controller,PLC)的指令,找出并识别应用在离心机上的软件发出虚假指令,使得离心机转速不正常而造成设备损坏。在一系列工业信息安全事件爆发后,工信部在2011年下发了《关于加强工业控制系统信息安全管理的通知》,要求各级政府和国有大型企业切实加强工业控制系统安全管理。对于工业企业而言,工业控制信息系统安全还是一个全新的领域,在技术工具、设备设施以及人员等方面缺乏储备,同时缺乏相关的标准和规范,因此迫切需要开展相关的基础研究和产品开发,以支持用户开展相关工作。Wireshark 与Nmap是网络开发和信息安全技术人员最常用的工具之一,能从二进制报文中分析并提取有效信息,并结合报文插件或漏洞数据库匹配相应的结果,因此广泛应用于工控信息安全。然而,Wireshark 与Nmap是两个分立的工具,两者结合使用中存在一定的不便,同时在解析工业控制系统特殊的工业协议时,Wireshark 存在解析不全或不完整的情况。Nmap 原生自带的脚本数量有限,但支持开发自定义的探测脚本进行自主漏洞挖掘。
1 工控信息安全的现状分析
工业控制网络是工业控制系统中的网络部分,是一种把工厂中各个生产流程和自动化控制系统通过各种通信设备组织起来的通信网络。工业控制系统包括工业控制网络和所有的工业生产设备,而工业控制网络只侧重工业控制系统中组成通信网络的元素,包括通信节点(如数据采集与监控系统、分布式控制系统、可编程控制器、远程终端以及人机交互界面设备等)、通信网络(包括现场总线、以太网以及各类无线通信网络等)以及的通信协议(包括Modbus、Profibus 等)。企业生产网部署的工业控制系统一般包括4 个层次,分别是现场设备层、现场控制层、过程监控层和生产执行层[2]。
工业控制系统所在的机构或单位同时建立了与外部网络相连的生产信息网,使用户可以通过网络查询信息。现阶段,工业控制系统环境已经摆脱以往信息孤岛的模式,与IT 网络相连接,实现了大范围的协同控制,以提高生产效率。同时,机构或单位通过网络与分支机构、合作伙伴、外网用户的联系越来越多,这时内部网络/工控网络的安全性将受到考验。网络上的不法分子不断寻找网络上的漏洞,企图潜入内部网络与工控网络。一旦内部网络或工控网络被人攻破,一些机密的资料可能会被盗,将破坏网络和工业生产环境。
2 工业控制系统的风险监测
当前工业控制系统安全面临严峻威胁,需要对工业控制系统网络进行安全监测,发现工业控制系统网络内部的安全威胁和存在的漏洞,从而采取相关的防护措施或修复相关漏洞,确保工业控制系统的设备和数据的安全。
2.1 工控网络安全监测相关技术
通过研究工业控制系统安全监测技术,形成对工业控制系统的重点区域、重点企业、重点平台及重点设备的安全监测能力。通过采集工业控制系统网络流量,对物理地址、工控协议指纹、报文方向以及协议特征等进行研究分析,识别资产的类别、厂商以及固件版本等信息,进一步识别资产可能存在的已知漏洞信息。需联合与资产关联的入侵告警、审计告警和白名单基线告警多维信息,对资产风险等级做出综合评估[3]。
对工业协议做指令级深度解析,是监测系统实现资产识别、入侵检测、创建基线以及监测与审计的技术基础,主要分析技术的以下几个层级。
(1)针对工业控制系统特有的工业协议(如MODBUS、S7、FINS 以及GE 等),通过规格识别、逆向分析等手段,厘清报文特征与业务操作的内在关系。
(2)结合工业控制系统中各作业单元网络流量数据与业务数据,针对不同的工控网络安全与业务安全异常场景,选取随机森林、决策树、K-means、神经网络等机器学习或深度学习算法或混合算法,学习生成工控系统安全异常检测模型。
(3)采集工业控制系统各作业单元网络流量数据,通过工控协议深度解析技术与会话还原技术,对网络流量数据中的网络连接、工控指令、重要业务以及通信方向等关键信息生成工业控制系统安全行为基线,实现对偏离安全行为基线的异常行为的实时检测。
2.2 工控网络安全分析方法
2.2.1 工业协议网络报文分析
Wireshark(前称Ethereal)是一个网络抓包分析软件。网络抓包分析软件的功能是抓取网络报文,并尽可能显示最详细的网络报文信息。Wireshark 使用WinPCAP 作为接口,直接与网卡进行数据报文交换。网络管理员使用Wireshark 检测网络问题,网络安全工程师使用Wireshark 检查资讯安全相关问题,开发者使用Wireshark 为新的通信协定除错,普通使用者使用Wireshark 学习网络协定的相关知识[4]。
2.2.2 工业网络设备发现与漏洞挖掘
Nmap是一个免费开放的网络扫描和嗅探工具,也叫网络映射器(Network Mapper)。它由3 个基本功能:一是探测一组主机是否在线:二是扫描主机端口嗅探所提供的网络服务:三是可以推断主机所用的操作系统。通常网络管理员利用Nmap 评估网络系统安全,而黑客则用其扫描网络,通过向远程主机发送探测数据包获取主机的响应,并根据主机的端口开放情况得到网络的安全状况,寻找存在漏洞的目标主机,实施下一步的攻击[5]。
Nmap 扫描工具支持扩展,因此开发者可以自主开发探测脚本。通过自主开发的脚本,开发者可以对工业控制系统中的工控设备进行扫描识别,从而发现工控设备的相关信息,如厂家、型号以及版本等,再结合相关漏洞库,可以快速匹配工控设备的相关漏洞。对尚未被挖掘的漏洞,结合Wireshark对工业协议报文的分析,可以通过Nmap 编写脚本直接进行探测,如拒绝服务、缓冲区溢出以及弱管理员密码等漏洞。Nmap 是一个自主挖掘工业漏洞十分有用的工具。
3 WireNmap 的开发与实现
Wireshark 与Nmap 在工业协议分析与工业漏洞挖掘中是强有力的互补,而实际中两个软件是分立的,导致其使用效率偏低。在工业控制系统的应用中,Wireshark软件对工业协议支持不完整或不全面,而Nmap 自带漏洞探测脚本有限,但其支持自主开发针对工业控制系统的脚本。
3.1 Wireshark 源码结构
Wireshark 源码软件组成,如图1 所示。
图1 中,Core 为核心调度模块,包括报文的捕获(Capture)、报文分析(Epan)、报文读取与存储(Wiretap)、界面交互与呈现(GTK/Qt),具体模块的具体功能如表1 所示。
3.2 Nmap 源码结构
Nmap的执行流程采用流水式的顺序执行方法,执行的入口在nmap_main()处。Nmap 的执行流程可以分为准备阶段、执行阶段和结束阶段3 个阶段。
表1 Wireshark 各模块功能
准备阶段解析扫描输入参数,根据输入参数初始化系统资源、初始扫描IP 地址与端口、初始化脚本执行环境,形为扫描任务列表。
执行阶段根据准备阶段产生的任务列表,顺序执行相关任务,直到所有的任务完成后退出主循环。
结束阶段对所有扫描任务进行统计与分析,然后打印出扫描的最终结果,并释放分配的资源。
3.3 WireNmap 软件的实现
WireNmap 集成了自主研发的报文分析插件与扫描探测脚本,为工业控制系统漏洞分析提供更深层次的分析与漏洞挖掘能力。
WireNmap 软件集成了原生的Wireshark 与Nmap 的所有功能,且在此基础上WireNmap 实现了IP 资产统计,即对网络中发现的所有IP 地址以列表的形式进行呈现。该IP 资产列表可直接点击进行Nmap 扫描与分析,有利于进一步获取更深层次的信息,同时实现了Wireshark 与Nmap 的无缝衔接。
4 基于WireNmap 的工业协议分析
WireNmap 集成了自主研发的报文解析插件,如S7 协议解析插件、OPC 协议TAG 深度解析插件等。
4.1 S7 协议解析插件
在工业环境中,S7 Communication 协议(后文简称为S7)和OPC 都被广泛应用于石油、钢铁和制造等行业。S7 协议是一种私有协议,在西门子生产制造的设备和系统中主要用于PLC 之间的数据交互以及SCADA 系统对PLC 的管理、诊断与监控。OPC 已经成为工控界的一种标准,目前世界上著名的自动化厂商都有应用该标准。针对S7 和OPC,WireNmap 在Wireshark 基础上进行了二次开发,增加了对S7 和OPC 的解析深度。
S7 协议通过RFC1006 协议的形式建立TCP/IP的ISO 七层模型下的S7 连接。它的通信过程包括TCP 连接进行3 次握手建立TCP 连接、ISO 层建立连接、S7 协议发出连接请求并建立连接以及S7 协议进行设备的数值读写4 个步骤。S7 PDU 封装于ISO 层内,因此在S7 前会增加TPKT 固定帧头和COTP 层帧头,结构如图2 所示。
图2 S7 协议报文结构
TPKT 帧头长度为4 Byte。第1 字节表示TPKT版本号,第2 字节为保留字段,第3 字节和第4 字节表示数据长度。COTP 帧类型有10 种,在S7 协议报文中常见的有0xe0(请求连接)、0xd0(请求确认)和0xf0(PDU 数据传输)共3 种,仅在ISO层建立连接完成。进行数据传输时,即PDU 类型为0xf0(PDU 数据传输)时搭载S7 协议报文,结构如图2 所示。图2 中,COTP 帧头长度为3 Byte,第1 字节表示长度,第2 字节表示PDU 类型,第3字节低7 位表示TPDU 编号,第3 字节第8 位表示是否为最后一个单元。最后一部分是PDU data 搭载S7 协议。S7 协议分由固定头部、参数区和数据区3个部分组成。从图2 可知,在帧头类型为Userdata 时,数据区仍有一串无法解析的数据,需针对这部分数据展开进一步解析。
为得到图2 中数据段未被解析的结果,将未解析部分分为未知字段和已知字段两部分。未知字段为暂时不清楚的不可解析部分,已知字段为可通过二次开发进行解析的部分。已知字段中包含数据点个数、地址段和值段3 部分,可采用以下方法获取每个字段:
(1)获取未知字段和已知字段长度,第1 字节和第2 字节为未知字段长度,第3 字节和第4 字节为已知字段长度,并确保两个长度之和与余下长度之和相等;
(2)获取已知字段的数据点个数,已知字段数据点个数占2 Byte;
(3)拆分地址段,地址段分为空间类型和地址两个部分,空间类型取剩余第1 个字节的最高位,根据表2 得到空间类型,地址为后续的4 Byte。
表2 空间类型对照表
拆分值段,值段前3 个字节跳过,取值段第4字节为值的长度。
S7 原生Wireshark 未解析报文,如图3 所示。以图3 中数据段未解析的十六进制部分拆分为例进行方法说明,如图4 所示。
图3 S7 原生Wireshark 未解析报文
图4 S7 协议未解析段数据结构
(1)第1 字节和第2 字节为第一区字段的长度20(0x0014),第3 字节和第4 字节为第二区字段的长度14(0x000e),点表数据在第二区;
(2)从第5 字节起为第一区字段,第一区字段长度为20 个字节,跳过20 个字节;
(3)从25 字节开始,25、26 字节为数据点个数,十六进制表达为0x0001,转换为十进制为1,即后续数据点个数只有1 个,则地址段和值段分别只有一个点;
(4)读取地址段的空间类型,取0x22&0xf0,根据表2 得到空间类型;
(5)地址值按照图中标识部分为0x00000206,换算成十进制为518;
(6)读取值段,值段的第3 字节即图4 中的0x02 为值的长度,换算为十进制,值的长度为2;
(7)读取值为0x2acd。
根据该方法,图3 中的未解析字段在经过二次开发后结果如图5 所示,可以得到点的个数、地址和值。
图5 S7 协议二次解析后前后对比
可见,经过开发后,S7 插件可以读取空间类型、地址以及数值等更多信息。在实际工业控制系统中,这些信息可以对应实际的温度、压力以及转速等信息,因此可以更好地对工业控制系统进行指令级分析。
4.2 OPC 协议
OPC 是基于微软组件对象COM/DCOM/COM+等技术基础的一种接口标准,在标准下能够有效的进行信息集成和数据交换。在工业控制系统中,OPC 协议规范中主要应用的是OPC DA 规范。在OPC DA 规范中,OPC 由OPC 服务器中包含OPC 组,组内有一个或多个对象,其结构如图6 所示。
图6 OPC 对象结构组成
在OPC DA 规范中,IOPCItemMgt 类型报文在客户端执行添加、删除对象时,协商客户端和服务器对象的句柄,在协商完成后,后续通信都通过句柄对该对象执行修改。由图7 可知,Wireshark 并未对句柄进行解析。
本文通过以下方法可以获取句柄和句柄相关的对象名称。
(1)确认报文类型为IOPCItemMgt,并获取对象个数,取未解析内容的第一个十六进制值;
(2)通过报文中的固定位获取报文中的对象个数;
(3)handle 长度固定,则获取相对固定位置的handle 值;
(4)获取每个handle 对应名称。
以图8 为例来进行方法说明。
(1)确认报文类型为IOPCItemMgt,将内容移动到示例中stub data 的起始位置,以stub data 显示的0x05 为第1 字节;
(2)向后移动32 位为OPC 对象个数,如图6所示该报文中对象个数为1;
(3)句柄队列是一个32 位数值,起始位置从第52 字节起,如图6 所示,句柄为0x909fe400;
(4)句柄队列中,每隔28 字节为一个句柄值读取点,本文中只有1 个对象,则只有一个句柄值,则直接跳过28 字节;
(5)再跳过空白16 个字节,在第91 字节获取对象名称长度为0x0e000000,由于是小端的十六进制值,换算成十进制为14,则对象的名称长度为14;
(6)跳过12 个无关字节,以ASCII 码方式获得名称,在图7 中名称为New Alias 1.1。
(7)得到的OPC 句柄和对象名称与未进行二次开发的OPC 报文对比图,如图8 所示。
图7 OPC 原生Wireshark 未解析报文示例
图8 OPC 二次开发前后对比
由图8 可知,经过开发后的WireNmap 软件可以获取OPC 协议的TAG 名字、数据类型以及数值等更多信息。在实际的工业控制系统中,该信息可以与实际物理量进行转换,从而获取更多的数量信息。
5 基于WireNmap 的工业漏洞扫描技术
WireNmap 同时集成了自主研发的漏洞扫描脚本插件,如NSE 脚本。
5.1 NSE 脚本简介
一个完整的NSE 脚本包括描述性字段、行脚本的rule 以及实际脚本指令的action 等多个模块,如图9 所示。它的各个模块的主要的功能如表3所示。
图9 NSE 脚本组成
表3 NSE 脚本各个模块的主要的功能
5.2 WireNmap 漏洞挖掘技术
以国家信息安全漏洞共享平台的CVE-2017-12617 为例,该漏洞称之为Apache Tomcat 远程代码执行漏洞。当Apache Tomcat 服务器中的http 进行put 请求时,可以远程将java的jsp格式代码上传至服务器端,进而达到在服务器上任意执行代码的目的。此漏洞属于高危漏洞,对服务器的影响很大,因此探测发现该漏洞并且采取合适的修补措施十分有意义。
5.2.1 脚本准备工作
脚本准备工作包括一些包的引用(如http、Nmap、stdnse 等等)、description 部分以及nsedoc 部分,还有脚本的作者、种类以及license。这部分主要是明确脚本的一些细节,为下面的脚本主体内容做一些铺垫。其中,description 从CVE 中摘录而来,可以非常好地帮助理解脚本的原理以及运行机制,具体如图10 所示。
图10 NSE 脚本首部
5.2.2 脚本portrule
这部分主要涉及一些特定的端口以及端口上的服务,在对服务器的访问中涉及到http,因此端口的选取是几个有关http 服务的端口,具体如下:
portrule=shortport.port_or_service({80,8080},”http”)
一般来说,在Apache Tomcat 服务器安装时会有默认的运行端口,端口一般为8080,有时会存在该端口被其他应用占用的情况,这时服务器启动后不能正常工作,可以在Apache Tomcat 的文件中进行默认端口的修改。
5.2.3 脚本action
这是整个脚本的核心部分,利用put 请求发送一个jsp 格式的文件,之后判断服务器对http 的put请求返回的响应码,若为201,说明此时服务器已经接受请求,对文件名以及一些细节输出即可,如图11 所示。查看该脚本在Nmap 中的运行结果,如图12 所示。
图11 NSE 脚本主体
图12 NSE 脚本运行结果
明显可以看到,文件的内容是开始时脚本中写好的,充分说明该版本的服务器存在巨大的漏洞。当put 请求成功时,可以上传任意的jsp 格式代码至服务器端,并且可以在服务器上运行。当打开存放文件的Apache Tomcat 目录时,可以看到chen.jsp位列其中。
针对发现的漏洞,如何规避或修复此漏洞,可以简单总结为两个方面。一方面,对Apache Tomcat服务器进行升级,只要选取合适的版本就可以避免此漏洞。另一方面,访问Apache Tomcat 文件中的conf 文件夹找到web.xml,修改其中的参数“readonly”值为true,拒绝文件写入。
6 基于WireNmap 的资产管理与联合分析技术
工业控制系统中的安全威胁分析中,常有的工具有Wireshark 与Nmap。Wireshark 能抓取二进制报文,Nmap 能探测设备存活并对设备进行深度扫描,并能发现各种类型网络设备的漏洞。使用中通常先使用Wireshark 进行分析,再通过Nmap 进行深度探测,然后根据两者结果进行联合分析,从而全面分析工业控制系统的安全威胁。WireNmap 集成的Wireshark 与Nmap 的功能,扩展了报文分析插件与漏洞扫描插件,同时将两者的安装与使用有效连接起来。基于WireNmap 的工业控制安全分析技术的基本步骤如下:
(1)抓包获取网络报文、相关资产列表及IP网段;
(2)根据资产列表及其通信报文,初步判断其资产类型;
(3)通过PING 扫描和端口扫描,确定网络中所有存活资产列表;
(4)对所有资产进行操作系统扫描,同时获取厂商与操作系统信息;
(5)资产列表中确定重点关注资产,并对其进行指令级分析;
(6)对重点资产进行报文筛选,并根据报文格式编写相应的探测脚本;
(7)反复修改相关报文,对相关设备进行非法修改或溢出修改,挖掘相关漏洞。
具体来说,调用WireNmap 工具进行抓包和报文分析时可直接获取网络中的IP 资产清单,如图13 所示。
图13 WireNmap 资产管理界面
由图13 可以得出网络中的IP 段与资产清单,如表4 所示。
表4 WireNmap 报文分析与IP 资产对应关系
图13 中右侧框列出了当前所有的IP 资产清单。点击对应的IP 后,利用列举出来的与该IP 地址相关的所有通信报文,可以直接分析该IP 的流量,查看是否存在异常流量,同时结合已经开发的插件(如S7、OPC 等),更好地对工业协议进行深度分析。图13 中双击右侧IP 地址,启动如图14 所示的界面。对重点关注的资产IP 进行深度探测,可以得出如表5 所示的资产详细信息。
图14 WireNmap 资产扫描与深度探测
表5 资产详细信息
7 结语
本文提出了一种基于Wireshark 与Nmap 的工业控制系统安全联合分析方法,扩展了Wireshark的分析插件与Nmap 的扫描插件,同时提出了将Wireshark 与Nmap 合并后的联合分析软件WireNmap。实际应用证明,WireNmap 能更深层次解析工业协议,如S7、OPC 协议,同时通过开发脚本能发现更多的漏洞,如CVE-2017-12617 等。面对以窃取敏感信息和破坏关键基础设施运行为主要目的工业控制系统网络攻击,所提方法能更快速、全方位地适应工业控制系统安全威胁的需要。