3. 工控协议解析入门

在工控网络流量取证中,协议解析是“从字节到语义”的关键一步。只有先识别出流量属于哪种工控协议,再理解其报文结构,才能进一步提取操作对象、功能码、地址、值和时间序列,为异常检测与复盘提供证据。本章围绕五类常见协议,介绍其基本报文结构与识别方法。

一、核心原理:工控协议解析的三个层次

工控协议解析通常分为三个层次:链路与传输层识别、协议头识别、应用层语义解析。链路与传输层关注以太网类型、IP、TCP/UDP端口;协议头识别关注固定字段、魔数、长度、版本、功能码;应用层语义解析则把功能码、地址、数据值映射为“读/写/控制”等操作。

与IT协议不同,工控协议多为二进制、紧凑、面向过程控制,字段含义与设备行为强相关。例如Modbus TCP的“功能码+起始地址+数量”直接对应线圈或寄存器的读写;S7comm的“ROSCTR+功能+数据项”对应PLC的存储区访问;DNP3与IEC 104则带有链路层、传输层和应用层多层封装,识别时需逐层剥离。

识别优先级建议:先看端口与连接方向,再看固定魔数/版本字段,最后看功能码与地址范围。端口可被篡改,固定字段和功能码组合更可靠。

二、五类协议的基本报文结构与识别要点

下面用一张结构关系图展示五类协议在封装层次、典型端口和关键识别字段上的差异。图中每个协议块都标注了“最值得先看的字段”,便于在Wireshark或自研解析器中快速定位。

五类工控协议封装层次与关键识别字段 封装层次 以太网 / IP TCP / UDP 链路层 (DNP3/104) 传输层 (DNP3/104) 应用层 (全部协议) 数据模型 (地址/值/质量) Modbus TCP 端口 502 · MBAP头(事务ID/协议ID/长度/单元ID) + PDU(功能码+数据) 关键识别:协议ID=0x0000,功能码0x01/0x03/0x05/0x06/0x10 S7comm 端口 102 · TPKT + COTP + S7 PDU(ROSCTR/功能/数据项) 关键识别:TPKT版本=3,COTP类型=0xF0,ROSCTR=0x01/0x03/0x07 DNP3 端口 20000 · 链路层(0x0564) + 传输层 + 应用层(功能码/对象头) 关键识别:起始字节0x0564,链路功能码,应用功能码0x01/0x02/0x81 IEC 60870-5-104 端口 2404 · APCI(启动字符0x68/长度/控制域) + ASDU(类型标识/传送原因/公共地址) 关键识别:启动字符0x68,APCI长度,ASDU类型标识如0x64/0x2D/0x01 OPC UA 端口 4840 · 二进制/HTTPS · 消息头(消息类型/块大小) + 安全通道 + 服务请求 关键识别:消息类型如HEL/ACK/OPN/MSG/CLO,服务节点ID

三、方法流程:从流量到协议语义的解析步骤

  1. 抓包与分流:使用tcpdump或Wireshark按端口和IP过滤,先分离出工控流量。
  2. 端口初判:502→Modbus TCP,102→S7comm,20000→DNP3,2404→IEC 104,4840→OPC UA。
  3. 固定字段校验:检查魔数、版本、启动字符等,排除误判。
  4. 功能码/类型标识提取:定位应用层功能码或ASDU类型标识,判断操作类型。
  5. 地址与值解析:提取寄存器地址、对象地址、数据值和质量位。
  6. 会话重组:按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主站,而是来自一台未授权笔记本。该案例说明:协议解析不仅要看“是什么协议”,还要看“谁在什么时间对什么地址做了什么操作”。

取证提示:Modbus TCP的单元ID常用于区分网关后的串行设备;S7comm的COTP TSAP可区分机架与槽位;DNP3的链路地址和应用地址可定位具体RTU;IEC 104的公共地址可区分不同厂站;OPC UA的会话ID和安全通道ID可关联用户身份。

五、常见误区与复盘要点

误区 表现 纠正方法
只看端口判断协议 非标准端口导致漏判或误判 结合固定字段、功能码和会话行为综合判断
忽略多层封装 DNP3/IEC 104只看到TCP载荷,未剥离链路层 按链路层→传输层→应用层逐层解析
把功能码当唯一依据 不同协议功能码含义不同,混淆读写 建立协议-功能码对照表,结合地址和值判断
不重组会话 只看到单个报文,无法还原操作序列 按TCP流或事务ID重组请求-响应
忽略时间同步 多协议日志时间偏差,无法关联 统一NTP或记录抓包时间戳,做时间对齐

复盘时,建议建立“协议识别清单”:对每个工控会话记录协议类型、端口、关键字段、功能码、地址范围、操作类型、时间戳和源/目的资产。这样既能快速定位异常,也能为后续章节的流量取证与攻击链还原提供结构化数据。

注意:OPC UA在二进制模式下消息类型为HEL、ACK、OPN、MSG、CLO等,若使用HTTPS封装则需先解密TLS。取证时应同时保存原始流量和解析结果,避免二次解析丢失证据。

掌握上述五类协议的基本报文结构与识别方法后,面对混合工控网络时,可以先按端口和固定字段快速分类,再逐层解析应用层语义,最终形成可追溯的操作序列。这是工控网络流量取证从“看见流量”走向“理解行为”的基础能力。