mcpField
T
testing-ics-ot-protocols

testing-ics-ot-protocols

github.com/trilwu安全17748 次安装12 周前更新
代码仓库

关于 testing-ics-ot-protocols

面向工业控制网络授权评估的 ICS/OT 安全测试技能。鉴于测试可能影响物理流程,内容强调被动发现、按协议检查以及操作人员批准。

主要功能

  1. 01以安全为先的 OT 测试指引
  2. 02被动流量与资产发现
  3. 03常见 ICS 协议枚举
  4. 04区分只读与写入操作
  5. 05Purdue 模型网络分段审查

适用场景

  1. 01规划授权的 SCADA 评估
  2. 02盘点暴露的 ICS 设备与协议
  3. 03审查 IT/OT 分段和远程访问
  4. 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 崩溃。

强制约束:

  1. 主动测试期间,始终安排 OT 工程师或工厂操作员在场或随时待命。
  2. 获取书面授权,并明确涵盖 ICS/OT 资产——一般网络渗透测试的范围并不意味着包含 OT。
  3. 尽可能在维护窗口期间测试。未经明确且单独的授权,绝不测试安全仪表系统(SIS)。
  4. 从被动观察开始。只有被动阶段确认了设备类型且 OT 工程师批准后,才能进行主动枚举。
  5. 区分只读操作(读取寄存器、查询设备信息)和写入操作(设置线圈、写入寄存器、下发命令)。写入操作必须逐台设备获得批准。
  6. 每项写入操作都必须有回滚计划。在更改任何内容之前,先确认预期状态。
  7. 记录与每台设备的每次交互,包括时间戳和发送的准确命令。

协议概览

协议默认端口设计上是否需要身份验证加密备注
Modbus TCP502否否最常见的 ICS 协议;网络上的任何主机都能读取或写入
DNP320000可选(SA)否用于 SCADA 轮询;很少部署安全身份验证
EtherNet/IP (CIP)44818否否Rockwell/Allen-Bradley 生态系统
OPC UA4840是(多种模式)可选(TLS)较新的协议;安全性完全取决于配置
BACnet/IP47808 (UDP)否否楼宇自动化——HVAC、照明、门禁控制
S7comm102否否Siemens S7 PLC;已被具备一定防护能力的 S7comm-plus 取代
MQTT1883 / 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/

评论

支持 Markdown