4840 - Pentesting OPC UA

Tip

学习和实践 AWS 黑客技术:HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE) 学习和实践 Azure 黑客技术:HackTricks Training Azure Red Team Expert (AzRTE)

支持 HackTricks

基本信息

OPC UA, 缩写自 Open Platform Communications Unified Access, 是一种关键的开源协议,广泛用于制造、能源、航空航天和国防等行业,用于数据交换和设备控制。它能让不同厂商的设备互通,尤其是 PLC。

其配置支持强大的安全措施,但为了兼容旧设备,这些措施常被削弱,从而使系统暴露于风险。此外,发现 OPC UA 服务有时也很棘手,因为网络扫描器如果遇到非标准端口可能无法检测到它们。

Default port: 4840 (binary opc.tcp). Many vendors expose separate discovery endpoints (/discovery), HTTPS bindings (4843/443), or vendor-specific listener ports such as 49320 (KepServerEX), 62541 (OPC Foundation reference stack) and 48050 (UaGateway). Expect multiple endpoints per host, each advertising transport profile, security policy and user-token support.

内置 NodeId为什么重要
i=2253 (0:Server)包含 ServerArray、厂商/产品字符串和命名空间 URIs。
i=2256 (ServerStatus)显示运行时间、当前状态,及可选的构建信息。
i=2267 (ServerDiagnosticsSummary)显示会话计数、已中止的请求等。非常适合用于指纹识别暴力破解尝试。
i=85 (ObjectsFolder)遍历暴露的设备标签、方法和告警的入口点。
PORT     STATE SERVICE REASON
4840/tcp open  unknown syn-ack

Pentesting OPC UA

要发现 OPC UA 服务器的安全问题,请使用 OpalOPC 进行扫描。

opalopc -vv opc.tcp://$target_ip_or_hostname:$target_port

发现与枚举 操作手册

  1. 定位所有 OPC UA 传输
nmap -sV -Pn -n --open -p 4840,4843,49320,48050,53530,62541 $TARGET

如果环境使用 LDS-ME multicast discovery,请在 UDP 组地址上重复。

  1. 指纹识别端点
  • 通过每个传输调用 FindServers/GetEndpoints,捕获 SecurityPolicyUriSecurityModeUserTokenType、application URI 和 product 字符串。
  • 枚举命名空间以便解析厂商特定的 NodeIds;滥用命名空间冲突以诱使客户端加载由攻击者控制的 schema。
  1. 遍历地址空间
  • ObjectsFolder (i=85) 开始,递归 Browse/Read 以查找可写的过程变量、Method 节点和 historian/log 节点。
  • 查询 ServerStatus.BuildInfo 以了解固件来源,并检查 ServerCapabilities.OperationLimits 以评估耗尽服务器资源的难易程度。
  • 如果允许匿名访问,立即在维护方法上测试 Call(例如,ns=2;s=Resetns=2;s=StartMotor)。许多厂商忘记将角色权限绑定到自定义方法。
  1. 会话滥用
  • 重用或克隆来自其他会话的 AuthenticationToken 值(通过 MITM 或诊断暴露捕获)以劫持现有订阅。
  • 通过创建数十个非活动会话将服务器置于 SessionDiagnostics 泛滥状态;某些栈在超过 MaxSessionCount 限制后会崩溃。

使用 OpalOPC 的自动评估

  • 扫描器可以交互运行或无头运行,这对 CI/CD 风格的 OT 基线很有用。将其机器可读的发现结果管道到你的报告流程中,以在几分钟内突出显示匿名登录、弱策略、证书验证错误和可写变量。
  • 将 OpalOPC 输出与手动浏览结合:将发现的端点列表反馈到自定义工具中,然后有选择地武器化高影响节点(例如 MotorControl/StartStopRecipeManager/Upload)。

攻击旧版安全策略 (Basic128Rsa15)

  • Bleichenbacher-style oracle: 仍然允许已弃用的 Basic128Rsa15 策略的系统(通常通过诸如 CMPOPCUASTACK_ALLOW_SHA1_BASED_SECURITY 的构建标志切换)会泄露填充验证差异。通过向 CreateSession / OpenSecureChannel 握手发送精心构造的 PKCS#1 v1.5 blob 来恢复服务器证书的私钥,然后冒充服务器或解密流量。
  • Authentication bypass: OPC Foundation 的 .NET Standard 栈在 1.5.374.158 之前的版本(CVE-2024-42512)及其依赖产品允许未认证的攻击者强制使用该旧策略并随后跳过应用层认证。一旦你掌握了密钥材料,就可以提交任意的 UserIdentityTokens、重放签名的 ActivateSession 请求,并作为受信任的工程工作站操作工厂。
  • 操作流程:
  1. 使用 GetEndpoints 枚举策略并记录任何 Basic128Rsa15 条目。
  2. CreateSession 中显式协商该策略(SecurityPolicyUri),然后运行你的 oracle 循环直到恢复出密钥。
  3. 滥用该密钥伪造高权限会话、切换角色,或通过作为恶意反向代理悄然降级其他客户端。
  • CODESYS Runtime Toolkit (<3.5.21.0) 在集成商使用 CMPOPCUASTACK_ALLOW_SHA1_BASED_SECURITY 编译时会重新启用 Basic128Rsa15。翻转该标志,重新运行上述 oracle 工作流,你就可以 leak 运行时的私钥以冒充受信任的工程工作站,直到部署了 3.5.21.0 或更高补丁版本。
  • OPC Foundation 同时发布了针对 HTTPS 绑定的 CVE-2024-42513。即使目标声称使用 TLS,也要确保其未在代理后端对二进制传输悄然回退到 Basic128Rsa15。

2024-2025 漏洞观察清单

  • open62541 fuzz_binary_decode (CVE-2024-53429): 声明了超大 ExtensionObject 体的 SecureChannel 块会使解码器对已释放内存进行反引用,因此 pre-auth 攻击者可以重复使嵌入 open62541 ≤1.4.6 的 UA 服务器崩溃。重用 Claroty 语料库(opcua_message_boofuzz_db)或构造自己的 Boofuzz harness 来对 OpenSecureChannel 请求进行突变轰炸,直到 watchdog 杀死进程,然后重新枚举,因为许多集成商在重启后会回退到匿名模式。
  • Softing OPC UA C++ SDK / edgeConnector / edgeAggregator (CVE-2025-7390): TLS 客户端认证流水线接受任何重放了受信任 Common Name 的证书,因此你可以铸造一个一次性证书,复制某个工厂工程师的 CN,然后使用任意的 UserNameIdentityTokenIssuedIdentityToken 数据登录。将此与对 Basic128Rsa15 的降级结合可以剥离完整性检查并持续冒充操作员,直到重建信任列表为止。

为利用构建 OPC UA 客户端

  • 自定义客户端: 可插入的库(python-opcua/asyncua、node-opcua、open62541)允许你自行驱动利用逻辑。始终强制使用目标的命名空间索引以避免在厂商在固件更新后重新排序命名空间时意外跨命名空间写入。
  • 节点滥用清单:
  • 对生产标签执行 HistoryRead 以快照专有配方。
  • 使用 TranslateBrowsePathsToNodeIds 将可读的资产名称解析为可以交给 Claroty 等框架的 NodeIds。
  • 使用 Call + Method 节点触发维护任务(固件上传、校准、设备重启)。
  • 滥用 RegisterNodes 来固定频繁访问的节点,然后通过永不释放句柄来饿死合法客户端。
  • 会话加固测试: 尝试绑定数十个订阅,设置极低的发布间隔(低于 50 ms)并配以超大的被监控项队列。许多栈会错误计算 RevisedPublishingInterval,并因调度器溢出而崩溃。

Fuzzing 与漏洞开发工具

Claroty Team82 发布了开源的 opcua-exploit-framework,将多年 Pwn2Own 级别的研究打包为可重用模块:

  • 模式: sanity(轻量读取/浏览)、attacks(例如线程池饥饿、文件上传 DoS)、corpus(重放 fuzzing 有效载荷)、server(恶意 OPC UA 服务器以后门客户端)。
  • 使用示例:
# Run a DoS attack against a Prosys Simulation Server endpoint
python3 main.py prosys 10.10.10.10 53530 /OPCUA/SimulationServer thread_pool_wait_starvation

# Replay an entire Boofuzz corpus against open62541
python3 main.py open62541 192.168.1.50 4840 / opcua_message_boofuzz_db input_corpus_minimized/opcua.db
  • 恶意服务器场景: 捆绑的 asyncua-based 服务器允许你通过提供恶意地址空间来针对客户端软件(例如,返回带超大 ExtensionObject 的响应以触发 UA Expert 克隆的解析漏洞)。
  • 目标覆盖: 内置配置文件映射到 Kepware、Ignition、Unified Automation、Softing SIS、Triangle Microworks、Node-OPCUA、Python OPC UA、Milo、open62541 等,因此你可以快速在栈之间切换而无需重写有效载荷。
  • 集成建议: 将其输出与自己的 fuzzer 链接——先喷射 corpus 有效载荷,然后让 OpalOPC 再次验证崩溃是否使不安全的默认配置复活(匿名登录、设定点写入访问等)。

利用认证绕过

如果发现认证绕过漏洞,你可以相应配置一个 OPC UA client 并查看能访问到什么。这可能允许从仅读取过程值到实际操作重型工业设备的任意行为。

要了解你能访问的设备类型,请在地址空间中读取 “ServerStatus” 节点值并在 google 上查找使用手册。

Shodan

  • port:4840
  • port:62541 "OPC UA"
  • ssl:"urn:opcua"
  • product:"opc ua"

将搜索与厂商字符串("Ignition OPC UA""KepServerEX")或证书("CN=UaServerCert")结合,以在开始侵入性测试前优先考虑高价值资产。

References

Tip

学习和实践 AWS 黑客技术:HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE) 学习和实践 Azure 黑客技术:HackTricks Training Azure Red Team Expert (AzRTE)

支持 HackTricks