概述
PLC Program Tool 是一个工程工作站程序,用于OT 环境中对信捷PLC 进行配置和组态。从安全角度来看,获得对包含工程工作站程序的机器的访问权限可以让攻击者完全干预 PLC 和其他高度敏感的 OT 设备,从而产生不利后果。因此,攻击者可以利用这些应用程序中的漏洞作为完全控制 OT 网络的最后一步。针对工程工作站的攻击者可能会感染较低级别的设备,例如 PLC、传感器或泵。
一类漏洞核心的恶意项目文件
项目文件通常是包含 OLE 文件、SQLite 数据库、专有二进制格式、文本文件和在工程工作站内创建的目录的存档文件格式。工程师使用这些程序来监视、配置可编程逻辑控制器 (PLC) 和其他控制系统并与之通信。
项目文件中包含的程序逻辑管理 ICS 设备并监督流程,它还可能包括网络配置数据,有时还包括完整的 OT 网络布局。对于以工业网络为目标的攻击者来说,武器化的项目文件可能是此类活动的核心。
当用工程师站程序打开工程文件时,该程序可以快速与相关设备进行通讯。或者,OT 工程师有时可以从 PLC 上传项目文件,但这需要运行网络发现工具来查找 PLC 的网络地址或手动输入相关网络参数。因此,许多公司选择使用项目文件,每个文件都包含一个或多个 PLC 的配置。
当工程师站程序打开时,攻击者编写的特制项目文件可能会触发漏洞。例如,在这种情况下,攻击者可以将用于存储文件的网络共享中的合法文件替换为会触发程序漏洞的特制文件。我们在PLC Program Tool 中发现了此类漏洞,该漏洞可让攻击者在打开被利用的项目文件后在易受攻击的端点上运行任意代码。
OT环境建立
(1)在实验室设置中运行的信捷 PLC在信捷组态软件,“PLC Program Tool”的工程工作站程序。查找工程文件漏洞首先要调查工程工作站程序使用的工程文件的结构。以信捷PLC Program Tool为例,相关文件为*.xdp文件:
(2)信捷PLC工程文件结构为.xdp文件这些项目文件可以很容易地识别为 zip 文件,如下面的PK\x03\x04所示:
几乎任何存档实用程序(例如 7z)都可以提取它们。更有趣的是,当程序打开一个项目文件时,它会立即将其解压缩到位于其安装目录中的一个临时目录中:
XDPPro.exe 将几个文件写入 C:\Program Files\XINJE\XDPPro\tmp
此行为表明程序假定它正在以管理员权限执行。这与提取的文件是 zip 文件相结合,立即让人怀疑是否可以利用 zip slip 漏洞(任意文件覆盖漏洞)来获得任意写入权限。
很快,确实发现了一个 zip slip 漏洞(CVE-2021-34605),该漏洞可以为攻击者提供具有程序权限的任意写入权限;在大多数情况下,这些将是管理员权限。下一个问题是如何从任意文件写入中执行代码。由于在加载项目文件后立即执行代码最有意义,可以在打开项目文件时检查程序在做什么:
XDPPro.exe 尝试从 C:\Program Files\XINJE\XDPPro 加载 DNSAPI.dll,没有找到它并回退到 C:\Windows\System32
有趣的是,它正在尝试使用LoadLibrary从其本地目录加载 .dll 文件。当 LoadLibrary 没有找到它们时,它会恢复到在 C:\Windows\System32 中搜索它们。在这里,我们发现了第二个漏洞 CVE-2021-34606,这是一个经典的 DLL 劫持漏洞。
为了创建一个完整的漏洞利用,链接了两个漏洞:一旦一个特制的恶意项目文件被信捷PLC程序工具打开,就会触发zip slip漏洞并将一个.dll文件写入程序目录在程序文件中。稍后在加载新项目的过程中,将加载此 DLL 而不是真正的 DLL(位于Windows\System32中)。
加载 DLL 后,恶意代码会在其 DLLMain 过程或程序导入的函数之一中执行。攻击者现在可能会在 OT 网络上站稳脚跟。