IEC 60870-5-104协议解析&模糊测试的一些策略
字数 4019 2025-08-05 08:19:13

IEC 60870-5-104协议解析与模糊测试策略

1. 协议简介

IEC 60870-5-104远动规约用于厂站与调度主站间的通讯,是电力系统中重要的通信协议。

1.1 设备角色

  • 调度端(主站/控制站/客户机):典型设备如SCADA系统
  • 服务端(子站/被控站/服务机):典型设备包括:
    • FTU(馈线终端)
    • DTU(站所终端)
    • TTU(配变终端)
    • RTU(远程终端单元)

1.2 协议基础

  • IEC 60870-5-104是基于IEC 60870-5-101协议在TCP/IP协议上的扩展
  • 默认端口:TCP 2404
  • 101协议基于串口通信,104协议基于以太网通信

2. 协议数据结构

2.1 基本结构

数据报文分为三个部分:

  1. APCI (Application Protocol Control Information):应用规约控制信息
  2. ASDU (Application Service Data Unit):应用服务数据单元
  3. APDU (Application Protocol Data Unit):应用规约数据单元

关系:APDU = APCI + ASDU

  • APDU最大长度为255字节
  • ASDU最大长度为249字节

2.2 APCI解析

APCI结构:

  1. 启动字符:68H(1字节)
  2. APDU长度域:包含APCI的四个控制域和ASDU长度
  3. 控制域
    • 控制域1和2:发送序列号(控制域1最后一位不参与计算)
    • 控制域3和4:接收序列号(控制域3最后一位不参与计算)

序列号计算

  • 采用小端模式
  • 实际序列号 = 存储值 × 2

示例

  1. 主站发送(0,0):

    • 控制域1和2:0000 0000 0000 0000 (0000H)
    • 控制域3和4:0000 0000 0000 0000 (0000H)
  2. 子站回复(0,1):

    • 控制域1和2:0000 0000 0000 0000 (0000H)
    • 控制域3和4:0000 0010 0000 0000 (0200H) → 传输为0002H

2.3 帧类型

I帧(信息帧)

  • 带有ASDU并确认对方帧
  • 发送和接收序列号有效
  • 最大长度255字节
  • 控制域1最低位为0

S帧(短帧)

  • 不带信息,仅用于确认
  • 仅接收序列号有效
  • 长度6字节
  • 控制域1最低位为1,倒数第二位为0

U帧(短帧)

  • 用于启动控制信息
  • 仅控制域1有效,其余为0
  • 长度6字节
  • 控制域1最低位为1,倒数第二位为1

U帧命令示例

  • 启动命令:0x07 → 68 04 07 00 00 00
  • 启动确认:0x0B → 68 04 0B 00 00 00
  • 停止命令:0x13 → 68 04 13 00 00 00
  • 停止确认:0x23 → 68 04 23 00 00 00
  • 测试命令:0x43 → 68 04 43 00 00 00
  • 测试确认:0x83 → 68 04 83 00 00 00

2.4 ASDU解析

ASDU是I帧中的有效数据载荷,不同ASDU数据类型对应不同信息元素内容。

2.4.1 类型标识

完整类型标识分类:

  1. 监视方向过程信息(上行)

    • 1: 单点信息
    • 2: 带短时标的单点信息
    • 3: 双点信息
    • 4: 带短时标的双点信息
    • 5: 步长位置信息
    • 9: 测量值,归一化值
    • 11: 测量值,标度化值
    • 13: 测量值,短浮点数
    • 15: 累计值
    • 30-40: 带CP56Time2a时标的各类信息
  2. 控制方向过程信息(下行)

    • 45: 单命令
    • 46: 双命令
    • 47: 步调节命令
    • 48: 设点命令,归一化值
    • 58-64: 带CP56Time2a时标的各类命令
  3. 监视方向系统信息(上行)

    • 70: 初始化结束
  4. 控制方向系统信息(下行)

    • 100: 总召唤
    • 101: 电能脉冲召唤命令
    • 102: 读命令
    • 103: 时钟同步命令
    • 104: 测试命令
    • 105: 复位进程命令

2.4.2 可变结构体(VSQ)

  • SQ=0:信息对象地址不连续(每个对象都有地址),信息无序
  • SQ=1:信息对象地址连续(只有第一个有地址,后续+1),信息有序

2.4.3 传送原因(COT)

两字节组成:

  • 第1字节高两位:
    • T:测试标志(0=非测试,1=测试)
    • P/N:积极/消极确认(0=肯定确认,1=否定确认)
  • COT:6比特

常见传送原因:

  • 1: 周期、循环(上行)
  • 2: 背景扫描(上行)
  • 3: 突发(上行)
  • 4: 初始化(上行)
  • 5: 请求或被请求(上行/下行)
  • 6: 激活(下行)
  • 7: 激活确认(上行)
  • 20: 响应站召唤(上行)
  • 44: 未知类型标识(上行)

2.4.4 地址结构

  1. ASDU公共地址(Addr)

    • 站地址:1-254(255为广播地址)
    • 通常一对一通信,默认值为1
  2. 信息对象地址(IOA)

    • 3字节
    • IOA=000000H表示功能性报文(如总召、对时)
    • 典型地址范围:
      • 遥信:0001H-4000H
      • 遥测:4001H-5000H
      • 遥控:6001H-6100H
      • 遥调:6201H-6400H

2.4.5 信息元素集

示例:单点信息(SIQ)解析:

  • SPI(最低位):单点遥信状态(0=分,1=合)
  • IV:有效性(0=有效,1=无效)
  • NT:刷新标志(0=当前值,1=非当前值)
  • SB:取代标志(0=正常,1=人工置数)
  • BL:封锁标志(0=未封锁,1=封锁)

3. 典型通信流程

3.1 总召唤流程

  1. 主站下发总召命令
  2. 子站回复确认总召命令
  3. 子站上送信息
  4. 子站回复激活终止报文

报文示例

  • 总召激活:68 0e 04 00 1a 00 64 01 06 00 01 00 00 00 00 14

    • 64: 总召类型标识
    • 06: 激活总召
    • 14: 总召信息元素(全局询问)
  • 确认激活:68 0e 1a 00 06 00 64 01 07 00 01 00 00 00 00 14

  • 子站上送单点信息:68 17 1c 00 06 00 01 8a 14 00 01 00 01 00 00 01...

    • 01: 单点信息类型
    • 14: 响应总召
    • 010000: IOA地址01
    • 01: SIQ(合位)
  • 激活终止:68 0e 2a 00 06 00 64 01 0a 00 01 00 00 00 00 14

    • 0a: 激活终止

3.2 遥控命令

3.2.1 控制方式

  1. 直接控制

    • 主站下发执行命令 → 子站回复确认执行
  2. 选择控制

    • 主站下发选择命令 → 子站确认选择
    • 主站下发执行命令 → 子站确认执行
    • 子站回复激活终止

3.2.2 单点命令示例

  1. 单点遥合

    • 激活预置:68 0e 0c 00 22 00 2d 01 06 00 01 00 01 60 00 81

      • 2d: 单点命令
      • 81: 合位(1) + 选择(1)
      • IOA: 24577(0x006001)
    • 确认预置:68 0e 22 00 0e 00 2d 01 07 00 01 00 01 60 00 81

    • 激活执行:68 0e 0e 00 24 00 2d 01 06 00 01 00 01 60 00 01

      • 01: 合位(1) + 执行(0)
    • 激活终止:68 0e 26 00 10 00 2d 01 0a 00 01 00 01 60 00 01

  2. 单点遥分

    • 报文结构与遥合类似,最后一位改为00(分位)

3.2.3 双点命令示例

  1. 双点遥分

    • 激活预置:68 0e 08 00 1c 00 2e 01 06 00 01 00 01 60 00 81

      • 2e: 双点命令
      • 81: 低2位01(分位) + 选择(1)
    • 激活执行:68 0e 0a 00 1e 00 2e 01 06 00 01 00 01 60 00 01

  2. 双点遥合

    • 报文类似,低2位改为10(合位)

3.3 时钟同步流程

  1. 主站下发时钟同步命令
  2. 子站回复确认

报文示例

  • 时钟同步激活:68 14 04 00 1e 00 67 01 06 00 01 00 00 00 00 ab b8 3a 10 0b 01 18
    • 67: 时钟同步类型
    • ab b8 3a 10 0b 01 18: 时间值(Jan 11, 2024 16:58:47.275)

3.4 复位进程流程

  1. 主站下发复位命令
  2. 子站回复确认

报文示例

  • 复位激活:68 0e 08 00 2e 00 69 01 06 00 01 00 00 00 00 01
    • 69: 复位进程类型
    • 01: QRP复位信息

4. 模糊测试策略

4.1 测试目标

针对IEC 60870-5-104协议的实现进行模糊测试,发现潜在漏洞。

4.2 测试方法

  1. 协议字段变异

    • APCI控制域异常值
    • ASDU类型标识无效值
    • 传送原因异常值
    • 地址越界测试
  2. 报文序列测试

    • 异常序列(如未激活直接执行)
    • 重复报文
    • 序列号异常
  3. 边界值测试

    • 最大/最小长度APDU
    • 极端时间值
    • 特殊浮点数值
  4. 性能测试

    • 高频报文冲击
    • 长会话测试

4.3 重点关注点

  1. 协议解析

    • 异常格式报文处理
    • 长度字段校验
    • 序列号处理
  2. 状态机测试

    • 非法状态转换
    • 超时处理
    • 并发操作
  3. 安全机制

    • 认证绕过
    • 拒绝服务漏洞
    • 内存破坏漏洞

4.4 工具建议

  1. 通用模糊测试工具

    • AFL
    • Peach Fuzzer
    • Sulley
  2. 协议专用工具

    • 基于Scapy的自定义脚本
    • 协议模拟器(如OpenDNP3)
  3. 监控工具

    • Wireshark(带104解析插件)
    • 目标系统日志监控

5. 总结

IEC 60870-5-104协议是电力系统关键基础设施的重要组成部分,其安全性至关重要。通过深入理解协议结构和典型通信流程,可以设计有效的测试策略来验证协议实现的健壮性和安全性。模糊测试作为重要的测试手段,可以帮助发现潜在的协议实现漏洞,提高系统整体安全性。

IEC 60870-5-104协议解析与模糊测试策略 1. 协议简介 IEC 60870-5-104远动规约用于厂站与调度主站间的通讯,是电力系统中重要的通信协议。 1.1 设备角色 调度端(主站/控制站/客户机) :典型设备如SCADA系统 服务端(子站/被控站/服务机) :典型设备包括: FTU(馈线终端) DTU(站所终端) TTU(配变终端) RTU(远程终端单元) 1.2 协议基础 IEC 60870-5-104是基于IEC 60870-5-101协议在TCP/IP协议上的扩展 默认端口:TCP 2404 101协议基于串口通信,104协议基于以太网通信 2. 协议数据结构 2.1 基本结构 数据报文分为三个部分: APCI (Application Protocol Control Information):应用规约控制信息 ASDU (Application Service Data Unit):应用服务数据单元 APDU (Application Protocol Data Unit):应用规约数据单元 关系:APDU = APCI + ASDU APDU最大长度为255字节 ASDU最大长度为249字节 2.2 APCI解析 APCI结构: 启动字符 :68H(1字节) APDU长度域 :包含APCI的四个控制域和ASDU长度 控制域 : 控制域1和2:发送序列号(控制域1最后一位不参与计算) 控制域3和4:接收序列号(控制域3最后一位不参与计算) 序列号计算 : 采用小端模式 实际序列号 = 存储值 × 2 示例 : 主站发送(0,0): 控制域1和2:0000 0000 0000 0000 (0000H) 控制域3和4:0000 0000 0000 0000 (0000H) 子站回复(0,1): 控制域1和2:0000 0000 0000 0000 (0000H) 控制域3和4:0000 0010 0000 0000 (0200H) → 传输为0002H 2.3 帧类型 I帧(信息帧) 带有ASDU并确认对方帧 发送和接收序列号有效 最大长度255字节 控制域1最低位为0 S帧(短帧) 不带信息,仅用于确认 仅接收序列号有效 长度6字节 控制域1最低位为1,倒数第二位为0 U帧(短帧) 用于启动控制信息 仅控制域1有效,其余为0 长度6字节 控制域1最低位为1,倒数第二位为1 U帧命令示例 : 启动命令:0x07 → 68 04 07 00 00 00 启动确认:0x0B → 68 04 0B 00 00 00 停止命令:0x13 → 68 04 13 00 00 00 停止确认:0x23 → 68 04 23 00 00 00 测试命令:0x43 → 68 04 43 00 00 00 测试确认:0x83 → 68 04 83 00 00 00 2.4 ASDU解析 ASDU是I帧中的有效数据载荷,不同ASDU数据类型对应不同信息元素内容。 2.4.1 类型标识 完整类型标识分类: 监视方向过程信息(上行) : 1: 单点信息 2: 带短时标的单点信息 3: 双点信息 4: 带短时标的双点信息 5: 步长位置信息 9: 测量值,归一化值 11: 测量值,标度化值 13: 测量值,短浮点数 15: 累计值 30-40: 带CP56Time2a时标的各类信息 控制方向过程信息(下行) : 45: 单命令 46: 双命令 47: 步调节命令 48: 设点命令,归一化值 58-64: 带CP56Time2a时标的各类命令 监视方向系统信息(上行) : 70: 初始化结束 控制方向系统信息(下行) : 100: 总召唤 101: 电能脉冲召唤命令 102: 读命令 103: 时钟同步命令 104: 测试命令 105: 复位进程命令 2.4.2 可变结构体(VSQ) SQ=0:信息对象地址不连续(每个对象都有地址),信息无序 SQ=1:信息对象地址连续(只有第一个有地址,后续+1),信息有序 2.4.3 传送原因(COT) 两字节组成: 第1字节高两位: T:测试标志(0=非测试,1=测试) P/N:积极/消极确认(0=肯定确认,1=否定确认) COT:6比特 常见传送原因: 1: 周期、循环(上行) 2: 背景扫描(上行) 3: 突发(上行) 4: 初始化(上行) 5: 请求或被请求(上行/下行) 6: 激活(下行) 7: 激活确认(上行) 20: 响应站召唤(上行) 44: 未知类型标识(上行) 2.4.4 地址结构 ASDU公共地址(Addr) : 站地址:1-254(255为广播地址) 通常一对一通信,默认值为1 信息对象地址(IOA) : 3字节 IOA=000000H表示功能性报文(如总召、对时) 典型地址范围: 遥信:0001H-4000H 遥测:4001H-5000H 遥控:6001H-6100H 遥调:6201H-6400H 2.4.5 信息元素集 示例:单点信息(SIQ)解析: SPI(最低位):单点遥信状态(0=分,1=合) IV:有效性(0=有效,1=无效) NT:刷新标志(0=当前值,1=非当前值) SB:取代标志(0=正常,1=人工置数) BL:封锁标志(0=未封锁,1=封锁) 3. 典型通信流程 3.1 总召唤流程 主站下发总召命令 子站回复确认总召命令 子站上送信息 子站回复激活终止报文 报文示例 : 总召激活:68 0e 04 00 1a 00 64 01 06 00 01 00 00 00 00 14 64: 总召类型标识 06: 激活总召 14: 总召信息元素(全局询问) 确认激活:68 0e 1a 00 06 00 64 01 07 00 01 00 00 00 00 14 子站上送单点信息:68 17 1c 00 06 00 01 8a 14 00 01 00 01 00 00 01... 01: 单点信息类型 14: 响应总召 010000: IOA地址01 01: SIQ(合位) 激活终止:68 0e 2a 00 06 00 64 01 0a 00 01 00 00 00 00 14 0a: 激活终止 3.2 遥控命令 3.2.1 控制方式 直接控制 : 主站下发执行命令 → 子站回复确认执行 选择控制 : 主站下发选择命令 → 子站确认选择 主站下发执行命令 → 子站确认执行 子站回复激活终止 3.2.2 单点命令示例 单点遥合 : 激活预置:68 0e 0c 00 22 00 2d 01 06 00 01 00 01 60 00 81 2d: 单点命令 81: 合位(1) + 选择(1) IOA: 24577(0x006001) 确认预置:68 0e 22 00 0e 00 2d 01 07 00 01 00 01 60 00 81 激活执行:68 0e 0e 00 24 00 2d 01 06 00 01 00 01 60 00 01 01: 合位(1) + 执行(0) 激活终止:68 0e 26 00 10 00 2d 01 0a 00 01 00 01 60 00 01 单点遥分 : 报文结构与遥合类似,最后一位改为00(分位) 3.2.3 双点命令示例 双点遥分 : 激活预置:68 0e 08 00 1c 00 2e 01 06 00 01 00 01 60 00 81 2e: 双点命令 81: 低2位01(分位) + 选择(1) 激活执行:68 0e 0a 00 1e 00 2e 01 06 00 01 00 01 60 00 01 双点遥合 : 报文类似,低2位改为10(合位) 3.3 时钟同步流程 主站下发时钟同步命令 子站回复确认 报文示例 : 时钟同步激活:68 14 04 00 1e 00 67 01 06 00 01 00 00 00 00 ab b8 3a 10 0b 01 18 67: 时钟同步类型 ab b8 3a 10 0b 01 18: 时间值(Jan 11, 2024 16:58:47.275) 3.4 复位进程流程 主站下发复位命令 子站回复确认 报文示例 : 复位激活:68 0e 08 00 2e 00 69 01 06 00 01 00 00 00 00 01 69: 复位进程类型 01: QRP复位信息 4. 模糊测试策略 4.1 测试目标 针对IEC 60870-5-104协议的实现进行模糊测试,发现潜在漏洞。 4.2 测试方法 协议字段变异 : APCI控制域异常值 ASDU类型标识无效值 传送原因异常值 地址越界测试 报文序列测试 : 异常序列(如未激活直接执行) 重复报文 序列号异常 边界值测试 : 最大/最小长度APDU 极端时间值 特殊浮点数值 性能测试 : 高频报文冲击 长会话测试 4.3 重点关注点 协议解析 : 异常格式报文处理 长度字段校验 序列号处理 状态机测试 : 非法状态转换 超时处理 并发操作 安全机制 : 认证绕过 拒绝服务漏洞 内存破坏漏洞 4.4 工具建议 通用模糊测试工具 : AFL Peach Fuzzer Sulley 协议专用工具 : 基于Scapy的自定义脚本 协议模拟器(如OpenDNP3) 监控工具 : Wireshark(带104解析插件) 目标系统日志监控 5. 总结 IEC 60870-5-104协议是电力系统关键基础设施的重要组成部分,其安全性至关重要。通过深入理解协议结构和典型通信流程,可以设计有效的测试策略来验证协议实现的健壮性和安全性。模糊测试作为重要的测试手段,可以帮助发现潜在的协议实现漏洞,提高系统整体安全性。