3. 工控协议解析入门
在工控网络流量取证中,协议解析是“从字节到语义”的关键一步。只有先识别出流量属于哪种工控协议,再理解其报文结构,才能进一步提取操作对象、功能码、地址、值和时间序列,为异常检测与复盘提供证据。本章围绕五类常见协议,介绍其基本报文结构与识别方法。
一、核心原理:工控协议解析的三个层次
工控协议解析通常分为三个层次:链路与传输层识别、协议头识别、应用层语义解析。链路与传输层关注以太网类型、IP、TCP/UDP端口;协议头识别关注固定字段、魔数、长度、版本、功能码;应用层语义解析则把功能码、地址、数据值映射为“读/写/控制”等操作。
与IT协议不同,工控协议多为二进制、紧凑、面向过程控制,字段含义与设备行为强相关。例如Modbus TCP的“功能码+起始地址+数量”直接对应线圈或寄存器的读写;S7comm的“ROSCTR+功能+数据项”对应PLC的存储区访问;DNP3与IEC 104则带有链路层、传输层和应用层多层封装,识别时需逐层剥离。
二、五类协议的基本报文结构与识别要点
下面用一张结构关系图展示五类协议在封装层次、典型端口和关键识别字段上的差异。图中每个协议块都标注了“最值得先看的字段”,便于在Wireshark或自研解析器中快速定位。
三、方法流程:从流量到协议语义的解析步骤
- 抓包与分流:使用tcpdump或Wireshark按端口和IP过滤,先分离出工控流量。
- 端口初判:502→Modbus TCP,102→S7comm,20000→DNP3,2404→IEC 104,4840→OPC UA。
- 固定字段校验:检查魔数、版本、启动字符等,排除误判。
- 功能码/类型标识提取:定位应用层功能码或ASDU类型标识,判断操作类型。
- 地址与值解析:提取寄存器地址、对象地址、数据值和质量位。
- 会话重组:按TCP流或事务ID重组请求-响应,形成操作序列。
以Modbus TCP为例,一次读保持寄存器的请求报文如下:
MBAP Header:
事务ID: 0x0001
协议ID: 0x0000
长度: 0x0006
单元ID: 0x01
PDU:
功能码: 0x03 (读保持寄存器)
起始地址: 0x0000
寄存器数量: 0x000A
识别时,先看协议ID是否为0x0000,再看功能码是否为0x03,最后看地址范围是否落在设备实际寄存器区间。若功能码为0x10(写多个寄存器),则属于写操作,在取证中应重点记录。
四、案例场景:一次异常写操作的协议级复盘
某变电站监控网络出现PLC寄存器被异常修改。取证人员从流量中提取到一段Modbus TCP会话:源IP为工程师站,目的IP为PLC,端口502。请求PDU功能码为0x10,起始地址0x0064,寄存器数量0x0002,写入值为0x0001和0x0000。响应PDU功能码0x10,起始地址0x0064,数量0x0002,表示写入成功。
进一步关联S7comm流量,发现同一时间段有对DB块的写操作,ROSCTR=0x07(用户数据),功能码为0x05(写变量)。结合DNP3和IEC 104的链路层日志,确认异常操作并非来自正常SCADA主站,而是来自一台未授权笔记本。该案例说明:协议解析不仅要看“是什么协议”,还要看“谁在什么时间对什么地址做了什么操作”。
五、常见误区与复盘要点
| 误区 | 表现 | 纠正方法 |
|---|---|---|
| 只看端口判断协议 | 非标准端口导致漏判或误判 | 结合固定字段、功能码和会话行为综合判断 |
| 忽略多层封装 | DNP3/IEC 104只看到TCP载荷,未剥离链路层 | 按链路层→传输层→应用层逐层解析 |
| 把功能码当唯一依据 | 不同协议功能码含义不同,混淆读写 | 建立协议-功能码对照表,结合地址和值判断 |
| 不重组会话 | 只看到单个报文,无法还原操作序列 | 按TCP流或事务ID重组请求-响应 |
| 忽略时间同步 | 多协议日志时间偏差,无法关联 | 统一NTP或记录抓包时间戳,做时间对齐 |
复盘时,建议建立“协议识别清单”:对每个工控会话记录协议类型、端口、关键字段、功能码、地址范围、操作类型、时间戳和源/目的资产。这样既能快速定位异常,也能为后续章节的流量取证与攻击链还原提供结构化数据。
掌握上述五类协议的基本报文结构与识别方法后,面对混合工控网络时,可以先按端口和固定字段快速分类,再逐层解析应用层语义,最终形成可追溯的操作序列。这是工控网络流量取证从“看见流量”走向“理解行为”的基础能力。