工控流量分析之Modbus、MMS

工控安全 1年前 (2023) admin
411 0 0

工业控制网络(Industrial Control Network)是指用于连接和管理工控系统中的设备和组件的网络。工控网络在工业环境中扮演重要角色,用于监测、控制和管理各类工业设备和过程,例如自动化生产线、电力系统、水处理厂等。工控网络对实时性、可靠性的要求很高,在网络环境中涉及各种不同类型的设备(可编程逻辑控制器PLC、远程终端单元RTU和传感器等设备)和设备之间的通信协议(Modbus、MMS等协议)。

由于工控系统的特殊性,工控网络也面临着安全挑战和威胁:工控系统可能受到恶意软件和病毒的攻击;远程访问工控系统可能会存在安全风险,攻击者可能通过远程连接获取对工控系统的控制权;攻击者会通过嗅探、监听工控网络上的数据流量,收集敏感信息同时监视系统的运行状态,未经授权的访问工控系统,对系统进行干扰、篡改或破坏。

工控流量分析是应对以上问题的一种手段,通过对工控系统中的网络通信流量进行监测和分析,获取对网络流量的深入理解和洞察,从而发现潜在的安全风险和异常行为,然后采取相应的措施来保障工控系统的可用性、可靠性和安全性。而对工控流量进行分析,需要了解工控协议中各字段的含义和作用,同时要了解协议中功能码所代表的操作和含义,要关注网络流量包自身的特征,如数据包长度、响应时间等。下面结合具体工具和实例,对工控流量进行分析。

一、工具
1. Wireshark
      Wireshark是一款开源的网络数据包分析工具,旨在帮助用户捕获和分析网络流量,它支持多种操作系统,并提供了直观的图形用户界面,使用户能够轻松地查看和解释从网络上捕获到的数据包,它可以对数据包进行捕获和展示,包括每个数据包的详细信息和协议字段。Wireshark支持解析各种网络协议,可以展示每个协议的字段和值,并提供对协议层次结构的完整可视化,同时具有强大的过滤器机制,可以生成实时统计信息和图表,如流量图、协议分布图等。
2. Pyshark

   Pyshark是一个基于Python的开源包,用于解析和分析网络数据包的工具。它是基于Wireshark的功能构建的,可以通过使用Pyshark来编写自动化的网络数据包分析脚本。Pyshark提供了一系列的函数和类,用于处理和分析网络数据包,下面是一些常用函数和使用Pyshark的一个简单例子:

(1)FileCapture(filepath):创建一个FileCapture对象,用于从指定的pcap文件中读取数据包。

(2)LiveCapture(interface):创建一个LiveCapture对象,用于实时捕获指定接口上的网络数据包。

(3)Packet: 表示一个网络数据包,提供许多方法和属性用于获取和操作数据包的信息,例如Packet.eth可获取以太网头部信息。

(4)Packet.sniff_continuously(packet_count, callback):连续捕获指定数量的包,并将每个包传递给回调函数进行处理。

(5)Packet.layers:返回数据包的层级结构,可以通过访问这些层级来获取特定协议的字段。

(6)使用示例。

import pyshark# 创建LiveCapture对象,捕获指定接口上的数据包capture = pyshark.LiveCapture(interface='eth0')# 设置捕获的包数量和回调函数capture.sniff(packet_count=10, prn=lambda pkt:pkt.pretty_print())# 开始捕获capture.capture()# 分析捕获到的每个数据包for packet in capture:    # 打印数据包的层级结构    print(packet.layers)    # 获取以太网头部信息    eth_header = packet.eth    print(eth_header.dst)
二、实例
1. Modbus协议

Modbus是一种工业现场总线协议标准,总共涵盖三种协议:ModbusASCII、ModbusRTU和ModbusTCP。其中,ModbusASCII和ModbusRTU用于串行通信,ModbusTCP用于以太网通信。2004年,中国国家标准委员会把Modbus作为了国家标准。由于Modbus协议所具有的公开、支持多种电气接口、数据传输量大、实时性好等特点,它在工业控制系统中得到了广泛的应用,目前已成为工控领域通信协议的业界标准。工控流量分析时主要以ModbusTCP协议为主,Modbus协议的部分功能码和具体含义如表1所示。

表1 Modbus功能码

功能码

含义

0x01

读输出线圈

0x02

读输入线圈

0x03

读保持寄存器

0x04

读输入寄存器

0x05

写单个线圈

0x06

写单个保持寄存器

0x07

读取异常状态

0x0F

写多个线圈

0x10

写多个保持寄存器

0x14

读取文件记录

0x15

写入文件记录

0x16

掩码写寄存器

0x18

读取先进先出队列

Modbus协议的格式如表2所示。

表2 Modbus协议格式

事务标识

(2B)

协议标识

(2B)

长度

(2B)

单元标识符

(1B)

功能码

(1B)

数据

(nB)

Modbus协议中字段的具体含义如下:

1)事务标识:报文序列号,每完成一次通信后加1。

2)协议标识:表明是ModbusASCII、ModbusRTU、ModbusTCP三种协议中的哪一种,全零表示ModbusTCP。

3)长度:表示该位置后面的数据总长度。

4)单元标识符:表明某个设备。

2. Modbus协议场景分析

2.1 在Modbus攻击流量中找到FLAG。

(1)根据流量包的基本特征进行检查。
   Wireshark打开目标流量包,如图1所示,可以看到Modbus流量。

工控流量分析之Modbus、MMS图1 流量包详情

使用Wireshark的统计功能,查看流量包的长度分布,从图2可以看出,流量包长度较为连续,没有明显离群的长度。
工控流量分析之Modbus、MMS
图2 流量包长度分布
在上一步结果中,对包含Modbus流量包的包长进行筛选,筛选结果如图3所示。发现包长分布存在异常。
工控流量分析之Modbus、MMS
图3 Modbus包长分布
根据发现的异常,使用表达式:modbus && 80<=frame.len<=159 对流量包进行过滤,得到一个符合条件的流量包,如图4所示。在该包的Modbus数据字段得到flag。
工控流量分析之Modbus、MMS
图4 最终数据包
(2)根据具体的工控协议特征进行检查。
利用Pyshark编写脚本对流量包的指令和功能码进行分析,提取每个Modbus流量包中的功能码,结果如图5所示。
工控流量分析之Modbus、MMS
图5 提取结果
根据所得结果推测包含功能码16的流量包存在异常,而16在Modbus协议中代表写多个保持寄存器,目标很可能在这些流量包中。故在Wireshark中过滤包含功能码16的流量包,结果如图6所示,在第一个包的Modbus数据字段获得flag。
工控流量分析之Modbus、MMS

图6 过滤结果

3.MMS协议

工控MMS协议(Manufacturing Message Specification)是一种用于在工业自动化系统中进行数据通信的标准协议。它是基于ISO 9506标准的,用于在工业现场设备和上层管理系统之间进行可靠的数据交换。它定义了一种客户/服务器模型,允许生产设备(如传感器、执行器等)与上层管理系统进行通信。上层管理系统可以发送请求给设备,并接收设备的响应。MMS协议使用对象模型来组织和描述设备的数据,每个设备都可以通过对象标识符(Object Identifier)唯一的标识。设备的数据可以被组织成层次结构,使得数据之间存在关联关系。该协议定义了一组服务和操作,用于设备和上层管理系统之间的交互。例如,读取数据、写入数据、订阅数据变化等,协议使用基于TCP/IP的网络连接,确保数据可靠地传输,支持在不同设备之间传输各种类型的数据。MMS协议通过ASN.1对数据进行编码和解码,ASN.1编码使用Tag-Length-Value格式,Tag标识数据类型,Length表示数据长度,Value表示数据内容。MMS协议可以使用不同的ASN.1数据类型来表示各种数据对象和操作。

MMS协议将服务分为confirmedService以及unconfirmedService两类。unconfirmedService类服务不要求接收方返回确认信息,此类服务又可分为SIMPLE和ENHANCED两种类型,前者用于发送一般性消息,后者可用于发送文本、图片、视频等消息。

confirmedService类服务的数据包格式可以根据实际需求进行配置,具体的格式可能会因应用场景和系统需求而有所变化。但一般会有initiate-RequestPDU、confirmed-RequestPDU、initiate-ResponsePDU、confirmed-ResponsePDU这四种类型的包,通常为一轮initiate握手、n轮confirmed传输。以confirmed-Request为例,它包含以下几项:

1)服务请求标识符(Service Request Identifier):用于唯一标识该请求。

2)参数(Parameters):包含特定服务请求所需的参数信息,例如需要操作的对象、操作类型等。

3)初始序列号(Invoke ID):用于跟踪请求和响应之间的关联关系。

       confirmed-Request的发送方将请求发送给接收方,接收方在收到请求后,根据请求中的参数执行相应的服务操作,并生成对应的响应。响应中包含了与请求相关的结果、状态或其他信息。表3是一些常见的confirmedService类型:
表3 确认型服务类型

GetVariableAccessAttributes

用于获取变量访问属性,包括变量的数据类型、读写权限等信息。

Read

用于读取变量的当前值或历史数据。

Write

用于写入变量的值或进行变量的设置操作。

DefineNamedVariableList

用于定义变量列表,其中可以包含多个变量。

GetNamedVariableListAttributes

用于获取变量列表的属性信息,例如列表中包含的变量数量、变量的数据类型等。

ReportEventNotification

用于报告事件通知,例如发生的报警、状态改变等。

InitiateDownloadSequence

用于启动文件下载过程。

4.MMS协议场景分析
4.1 在MMS攻击流量中找到FLAG(-)。
Wireshark打开目标流量包,如图7所示,可以看到MMS流量。
工控流量分析之Modbus、MMS
图7 流量包详情
      如图8所示,使用Wireshark对数据包的长度分布进行分析,发现异常。
工控流量分析之Modbus、MMS
图8 包长分布
      如图9所示,定位到异常包,发现数据部分疑似存在base64编码的png文件。
工控流量分析之Modbus、MMS

图9 异常包

      编写python脚本尝试解码并还原图片。最终得到包含flag的图片:
工控流量分析之Modbus、MMS
4.2 在MMS攻击流量中找到FLAG(二)。
打开流量文件,发现是MMS协议流量,对数据包长度进行分析,结果如图10(a)所示。从中没有发现异常。从中对MMS流量包长度进行筛选,发现疑似异常包。
工控流量分析之Modbus、MMS(a)数据包长度分布
工控流量分析之Modbus、MMS
(b)含MMS流量数据包长度分布
图10 数据包长度
通过mms && 160<=frame.len<=319定位到疑似包,如图11所示。但这两个包是MMS协议中的initiate-RequestPDU和initiate-ResponsePDU,是握手包,进行数据传输的一般是confirmed包。而且检查这两个包后没有发现异常。
工控流量分析之Modbus、MMS
图11 两个initiate包
对confirmed包进行检查并编写脚本对服务进行统计,如图12所示,发现请求的服务基本为“read(4)”,基本为一请求、一回复,请求包中的domain-specific携带字符且itemId有变化。
工控流量分析之Modbus、MMS
(a)domain-specific段
工控流量分析之Modbus、MMS
(b)服务统计
图12 confirmed包
编写脚本对itemId进行筛查,结果如图13所示。观察发现大部分字符都以LLN0开头,只有三个包的itemId与之不同。
工控流量分析之Modbus、MMS
图13 itemId筛查结果

       定位到数据包后,发现itemId开头为LLN6的两个包时间上较为连续,提取这两个包的itemId与其它包不同的部分。

       得到666i5250356j4249、616732557968356j。66是字母f的16进制ASCII码值、61和67是字母a和字母g的16进制ASCII码值,但字母l的ASCII码值应为6c,猜测对字母进行了移位,移动了6位。

       对两个串的字母进行替换,连接替换后的两个串得到666c5250356d4249616732557968356d。

      对其进行解码得到flRP5mBIag2Uyh5m,拼接获得flag{RP5mBI2Uyh5m}。  

      以上是对工控流量的一些简单分析,对于工控网络而言,可以考虑从以下几个方面进行安全防范:将工控网络与企业网络进行物理隔离,以减少潜在的攻击面;通过身份认证和访问控制机制限制访问;对工控流量进行加密,保护其机密性和完整性;定时对工控流量进行安全审计;定期对工控网络环境中的设备进行更新和维护等。

原文始发于微信公众号(瑞不可当):工控流量分析之Modbus、MMS

版权声明:admin 发表于 2023年8月22日 下午2:07。
转载请注明:工控流量分析之Modbus、MMS | CTF导航

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
暂无评论...