关于 testing-ics-ot-protocols
面向工业控制网络授权评估的 ICS/OT 安全测试技能。鉴于测试可能影响物理流程,内容强调被动发现、按协议检查以及操作人员批准。
主要功能
- 01以安全为先的 OT 测试指引
- 02被动流量与资产发现
- 03常见 ICS 协议枚举
- 04区分只读与写入操作
- 05Purdue 模型网络分段审查
适用场景
- 01规划授权的 SCADA 评估
- 02盘点暴露的 ICS 设备与协议
- 03审查 IT/OT 分段和远程访问
- 04检查协议认证与加密情况
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ trilwu/ secskills --skill testing-ics-ot-protocols安装后在 Claude Code 中输入/testing-ics-ot-protocols确认已加载。
详细介绍
测试 ICS/OT 协议
ICS/OT 协议的设计目标是在隔离网络中保持可靠运行,而非在联网环境中保障安全。大多数协议都没有身份验证、加密或完整性检查。危险不在于它们难以被利用,而在于利用漏洞可能造成物理后果,因此你在此处进行的所有操作都必须遵守安全约束。
适用场景
- 在经授权的测试中评估 SCADA 网络或 ICS 环境
- 测试范围内的 Modbus、DNP3、OPC UA、BACnet、EtherNet/IP、S7comm 或 MQTT 设备
- 按照 OT 安全要求执行 ICS 专项渗透测试
- 审查 OT 网络分段和 Purdue 模型合规性
- 评估进入控制系统网络的远程访问路径
- 盘点 ICS 资产并识别未经过身份验证的协议暴露
不适用场景
- 标准 IT 网络扫描 — 使用
enumerating-network-services - 将 HMI Web 界面作为常规 Web 应用进行测试 — 使用
testing-web-applications - 编写 ICS 专用检测规则 — 使用
engineering-detections
安全优先原则
OT 渗透测试并不是换几个端口进行 IT 渗透测试。由于目标设备控制着物理流程,双方的参与规则有着根本性差异。
主动扫描在 OT 环境中为何危险:
- PLC 和 RTU 运行精简的嵌入式固件。格式错误的数据包或意外连接可能导致设备崩溃、流程停止,或使设备进入危险的故障状态。
- 重启 PLC 可能需要现场操作,而它控制的流程可能无法承受中断。
- 有些设备会将任何 TCP 连接都视为命令会话——连接本身就是一种操作。
- Nmap 默认的服务探测曾导致生产环境中的 PLC 崩溃。
强制约束:
- 主动测试期间,始终安排 OT 工程师或工厂操作员在场或随时待命。
- 获取书面授权,并明确涵盖 ICS/OT 资产——一般网络渗透测试的范围并不意味着包含 OT。
- 尽可能在维护窗口期间测试。未经明确且单独的授权,绝不测试安全仪表系统(SIS)。
- 从被动观察开始。只有被动阶段确认了设备类型且 OT 工程师批准后,才能进行主动枚举。
- 区分只读操作(读取寄存器、查询设备信息)和写入操作(设置线圈、写入寄存器、下发命令)。写入操作必须逐台设备获得批准。
- 每项写入操作都必须有回滚计划。在更改任何内容之前,先确认预期状态。
- 记录与每台设备的每次交互,包括时间戳和发送的准确命令。
协议概览
| 协议 | 默认端口 | 设计上是否需要身份验证 | 加密 | 备注 |
|---|---|---|---|---|
| Modbus TCP | 502 | 否 | 否 | 最常见的 ICS 协议;网络上的任何主机都能读取或写入 |
| DNP3 | 20000 | 可选(SA) | 否 | 用于 SCADA 轮询;很少部署安全身份验证 |
| EtherNet/IP (CIP) | 44818 | 否 | 否 | Rockwell/Allen-Bradley 生态系统 |
| OPC UA | 4840 | 是(多种模式) | 可选(TLS) | 较新的协议;安全性完全取决于配置 |
| BACnet/IP | 47808 (UDP) | 否 | 否 | 楼宇自动化——HVAC、照明、门禁控制 |
| S7comm | 102 | 否 | 否 | Siemens S7 PLC;已被具备一定防护能力的 S7comm-plus 取代 |
| MQTT | 1883 / 8883 (TLS) | 可选 | 可选(TLS) | IoT/ICS 消息传递;代理常常未设访问限制 |
被动侦察
从这里开始。被动观察不会带来干扰设备的风险,并能在接触任何设备之前提供所需的资产清单。
使用 ICS 解码器的 Wireshark:
# Capture on the OT network interface (mirror/span port or tap)
tcpdump -i eth0 -w ics_capture.pcap -n
# Wireshark filters for ICS protocols
# Modbus
modbus
# DNP3
dnp3
# EtherNet/IP
enip
# OPC UA
opcua
# BACnet
bacnet
# S7comm
s7comm
# MQTT
mqtt
从被动捕获中提取的信息:
- 设备 IP 地址和 MAC 地址(通过 OUI 查询识别供应商——Siemens、Rockwell、Schneider、ABB)
- 协议分布——正在使用哪些协议,以及它们所在的网段
- 轮询模式——主从关系、轮询间隔、读取了哪些寄存器
- 协议横幅或响应字段中可见的固件版本
- 意外流量——OT 网段上的 IT 协议、通信模式超出预期的设备
- MQTT CONNECT 数据包、OPC UA 会话或基于 HTTP 的 HMI 中未加密的凭据
通过被动观察建立资产清单:
建立一张表格:IP、MAC、供应商(通过 OUI 查询)、观察到的协议、角色(主站/从站/HMI/历史数据库)、可见的固件版本。这将作为主动枚举范围的依据。
主动枚举(获得授权后)
仅在满足以下条件后继续:(1)被动侦察已完成;(2)OT 工程师已审核资产列表并批准主动测试;(3)范围明确包含主动 ICS 枚举。
安全使用 nmap 扫描 ICS:
# NEVER use aggressive timing or default scripts against OT devices
# Use slow timing and specific ICS scripts only
# Modbus device discovery
nmap -Pn -sT -p 502 --script modbus-discover TARGET
# Siemens S7 device info (read-only query)
nmap -Pn -sT -p 102 --script s7-info TARGET
# BACnet device enumeration
nmap -Pn -sU -p 47808 --script bacnet-info TARGET
# EtherNet/IP enumeration
nmap -Pn -sT -p 44818 --script enip-info TARGET
# OPC UA discovery
nmap -Pn -sT -p 4840 --script opcua-endpoints TARGET
# IMPORTANT: Use -Pn (skip host discovery), -sT (full connect, not SYN scan),
# and NEVER use -A, -sV with high intensity, or broad script categories
# against OT devices.
专用 ICS 扫描工具:
# plcscan — lightweight PLC scanner
plcscan -t TARGET
# Redpoint Nmap scripts (Digital Bond)
# These are ICS-specific and safer than generic nmap scripts
nmap --script redpoint/ -p 502,44818,47808,102,20000 TARGET
特定协议测试
Modbus TCP(端口 502)
Modbus 没有身份验证。任何能访问端口 502 的主机都可以读取传感器、写入线圈并控制 PLC。这是设计如此——它于 1979 年为隔离环境中的串行链路而创建。
读取线圈和寄存器(只读,风险较低):
# Using modbus-cli
modbus read TARGET 0 10 # Read 10 holding registers starting at address 0
modbus read -s coil TARGET 0 10 # Read 10 coils starting at address 0
# Using mbtget
mbtget -a 1 -r1 -n 10 TARGET # Read 10 holding registers, unit ID 1
mbtget -a 1 -r2 -n 10 TARGET # Read 10 input registers
# Python with pymodbus
python3 -c "
from pymodbus.client import ModbusTcpClient
client = ModbusTcpClient('TARGET')
client.connect()
result = client.read_holding_registers(0, 10, unit=1)
print(result.registers)
client.close()
"
重要的 Modbus 功能码:
FC 01 - Read Coils (digital outputs)
FC 02 - Read Discrete Inputs (digital inputs)
FC 03 - Read Holding Registers (analog outputs / config)
FC 04 - Read Input Registers (analog inputs)
FC 05 - Write Single Coil ← WRITE — requires explicit approval
FC 06 - Write Single Register ← WRITE — requires explicit approval
FC 15 - Write Multiple Coils ← WRITE — requires explicit approval
FC 16 - Write Multiple Registers ← WRITE — requires explicit approval
FC 43 - Read Device Identification
需要报告的发现: 如果能从过程控制网络之外访问端口 502,则控制系统没有访问控制。这几乎总是严重级别——记录网络路径以及可以读取的寄存器。
OPC UA(端口 4840)
OPC UA 是唯一在设计时就考虑了安全性的 ICS 协议。它实际上是否安全,取决于配置方式。
发现与端点枚举:
# List OPC UA endpoints and their security modes
# Using opcua-client-gui or UaExpert
# Python with opcua library
python3 -c "
from opcua import Client
client = Client('opc.tcp://TARGET:4840')
endpoints = client.connect_and_get_server_endpoints()
for ep in endpoints:
print(f'Endpoint: {ep.EndpointUrl}')
print(f' Security Mode: {ep.SecurityMode}')
print(f' Security Policy: {ep.SecurityPolicyUri}')
print(f' User Token: {[t.TokenType for t in ep.UserIdentityTokens]}')
"
需要检查的身份验证模式:
- 匿名——无需凭据。如果此端点存在且可访问,请报告。
- 用户名/密码——测试默认凭据(admin/admin、user/password、opcua/opcua)。
- 证书——最强的模式。确认系统会验证证书,而非仅仅接受证书。
常见的 OPC UA 发现:
- 启用了匿名身份验证,同时也存在经过身份验证的端点
- 安全模式设为 None(不签名或加密)
- 接受未经验证的自签名证书
- 用户名/密码端点使用默认凭据
DNP3(端口 20000)
# DNP3 enumeration — identify master/outstation roles
nmap -Pn -sT -p 20000 --script dnp3-info TARGET
# Check for DNP3 Secure Authentication (rarely deployed)
# Most DNP3 implementations have no authentication at all
BACnet(UDP 端口 47808)
# BACnet device discovery
nmap -Pn -sU -p 47808 --script bacnet-info TARGET
# BACnet enumeration with BAC0
python3 -c "
import BAC0
bacnet = BAC0.lite(ip='YOUR_IP/24')
devices = bacnet.whois()
print(devices)
"
S7comm(端口 102)
# Siemens S7 PLC information
nmap -Pn -sT -p 102 --script s7-info TARGET
# Identifies: module name, serial number, plant identification,
# firmware version, hardware version, CPU state
常见发现
这些问题出现在大多数 ICS 评估中:
1. 网络扁平化(IT-OT 融合) 影响最大的一项发现。企业 IT 与控制系统之间没有网络分段,意味着任何被入侵的工作站都能直接访问 PLC。可尝试从 IT 网络分段访问 ICS 端口进行测试。
2. HMI 和工程工作站使用默认凭据 HMI Web 界面、操作站上的 VNC 服务以及工程软件通常使用出厂默认凭据。测试前,请查阅供应商文档,确认默认凭据。
3. 未经身份验证的协议暴露在非过程网络中 Modbus、S7comm 和 BACnet 均不具备身份验证机制。如果这些端口可从过程控制网络之外访问,任何被入侵的主机都能控制物理过程。
4. 未加密协议传输敏感数据 凭据、过程值和配置数据以明文传输。可通过抓包展示可读数据作为证明。
5. 远程访问网关控制薄弱 VPN 集中器、跳板主机或提供 OT 网络远程访问的蜂窝调制解调器。检查是否启用了多因素身份验证、会话日志记录和访问限制。
6. 固件过时且存在已知漏洞 ICS 设备运行的固件通常比当前版本落后多年,因为打补丁需要停机。记录版本并关联已知 CVE,但未经明确批准,不要尝试利用漏洞。
7. Historian 和数据二极管配置错误 连接 IT 与 OT 的 Historian 应位于 DMZ 中。数据二极管应确保单向流动。通过流量分析进行验证。
网络分段审查
根据 Purdue 企业参考架构进行评估:
Level 5 Enterprise network (corporate IT)
Level 4 Site business planning (ERP, email)
─── IT/OT DMZ ───
Level 3 Site operations (historians, OPC servers)
Level 2 Area supervisory control (HMI, engineering workstations)
Level 1 Basic control (PLCs, RTUs, controllers)
Level 0 Process (sensors, actuators, field devices)
需要验证的内容:
- Level 3 和 Level 4 之间是否设有 DMZ?IT 与 OT 之间不应直接传输流量。
- 是否在需要的地方部署了数据二极管或单向网关?
- Level 5/4 主机能否访问 Level 1/0 设备?(不应能访问。)
- 远程访问 OT 是否必须通过跳板主机或堡垒主机?
- OT 内部的东西向流量是否进行了分段(Level 2 与 Level 1 分隔,并划分独立的过程区域)?
- 防火墙规则是默认拒绝并明确允许,还是默认允许?
防御审查清单
审查 ICS 安全态势而非发起攻击时:
- 资产清单已建立且保持最新(了解 OT 网络中的每台设备)
- 网络分段遵循 Purdue 模型或同等的分区方案
- IT-OT DMZ 已部署防火墙和监控
- 远程访问需要 MFA,且会进入跳板主机,而非直接进入 OT
- ICS 协议流量受到监控(Claroty、Dragos、Nozomi 或同等产品)
- 已建立 OT 资产的补丁管理流程(即使补丁不常安装)
- 所有 HMI、交换机和工程软件的默认凭据均已更改
- OT 环境已落实 USB 和可移动介质管理策略
- 已为 PLC 程序和配置制定备份与恢复流程
- 事件响应计划包含 OT 专属场景(而不仅是 IT 应急预案)
- 安全仪表系统(SIS)位于隔离网络中,无法从过程控制网络访问
应当摒弃的错误想法
- “我们可以像扫描普通网络那样扫描它。” 做不到。SYN 扫描可能导致 PLC 崩溃,进而中断物理流程。OT 扫描需要了解特定设备、采用缓慢的扫描时序,并安排能够介入的工程师。
- “它与外界隔离,所以我们不需要测试。” 空气隔离很少能经受现实考验。USB 驱动器、维护笔记本电脑、蜂窝调制解调器和供应商 VPN 都会建立绕过隔离的路径。
- “OT 团队说我们不能碰任何东西。” 那就只进行被动评估——捕获流量和审查架构仍能发现重要问题。不要跳过这项工作。
- “我们发现 Modbus 端口开放了,这就够了。” 记录网络路径、可以读取哪些寄存器,以及这些寄存器控制什么。“端口 502 开放”是扫描结果,不是发现的问题。
- “只读测试不需要 OT 工程师在场。” 在某些设备上,读取操作也会产生副作用。工程师知道哪些设备较为敏感。让他们随时了解情况。
- “我们写入一个线圈来证明影响。” 在生产环境中写入 PLC 可能造成物理损坏。应在不实际写入的情况下证明写入能力,或在维护窗口期间安全关闭流程后进行测试。
- “供应商说该协议是安全的。” 供应商关于专有协议安全性的说法并非证据。应进行测试。许多“专有”协议都能被轻易逆向工程,或者仅靠安全隐匿性来提供保护。
参考资料
enumerating-network-services— 标准 IT 网络服务枚举engineering-detections— 为 ICS 特定威胁编写检测规则reporting-security-findings— 组织 ICS 发现的问题,以发挥最大影响- IEC 62443(工业自动化安全);NIST SP 800-82(ICS 安全指南)
- MITRE ATT&CK for ICS:https://attack.mitre.org/techniques/ics/