工业控制网络(Industrial Control Network)是指用于连接和管理工控系统中的设备和组件的网络。工控网络在工业环境中扮演重要角色,用于监测、控制和管理各类工业设备和过程,例如自动化生产线、电力系统、水处理厂等。工控网络对实时性、可靠性的要求很高,在网络环境中涉及各种不同类型的设备(可编程逻辑控制器PLC、远程终端单元RTU和传感器等设备)和设备之间的通信协议(Modbus、MMS等协议)。
由于工控系统的特殊性,工控网络也面临着安全挑战和威胁:工控系统可能受到恶意软件和病毒的攻击;远程访问工控系统可能会存在安全风险,攻击者可能通过远程连接获取对工控系统的控制权;攻击者会通过嗅探、监听工控网络上的数据流量,收集敏感信息同时监视系统的运行状态,未经授权的访问工控系统,对系统进行干扰、篡改或破坏。
工控流量分析是应对以上问题的一种手段,通过对工控系统中的网络通信流量进行监测和分析,获取对网络流量的深入理解和洞察,从而发现潜在的安全风险和异常行为,然后采取相应的措施来保障工控系统的可用性、可靠性和安全性。而对工控流量进行分析,需要了解工控协议中各字段的含义和作用,同时要了解协议中功能码所代表的操作和含义,要关注网络流量包自身的特征,如数据包长度、响应时间等。下面结合具体工具和实例,对工控流量进行分析。
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)
Modbus是一种工业现场总线协议标准,总共涵盖三种协议:ModbusASCII、ModbusRTU和ModbusTCP。其中,ModbusASCII和ModbusRTU用于串行通信,ModbusTCP用于以太网通信。2004年,中国国家标准委员会把Modbus作为了国家标准。由于Modbus协议所具有的公开、支持多种电气接口、数据传输量大、实时性好等特点,它在工业控制系统中得到了广泛的应用,目前已成为工控领域通信协议的业界标准。工控流量分析时主要以ModbusTCP协议为主,Modbus协议的部分功能码和具体含义如表1所示。
功能码 |
含义 |
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 流量包详情
图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):用于跟踪请求和响应之间的关联关系。
GetVariableAccessAttributes |
用于获取变量访问属性,包括变量的数据类型、读写权限等信息。 |
Read |
用于读取变量的当前值或历史数据。 |
Write |
用于写入变量的值或进行变量的设置操作。 |
DefineNamedVariableList |
用于定义变量列表,其中可以包含多个变量。 |
GetNamedVariableListAttributes |
用于获取变量列表的属性信息,例如列表中包含的变量数量、变量的数据类型等。 |
ReportEventNotification |
用于报告事件通知,例如发生的报警、状态改变等。 |
InitiateDownloadSequence |
用于启动文件下载过程。 |
图9 异常包
定位到数据包后,发现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