
Windows 中的一个本地权限提升 (LPE) 漏洞于 2022 年 9 月 9 日由 Andrea Pierini (@decoder_it) 和 Antonio Cocomazzi (@splinter_code) 报告给微软。该漏洞允许主机上拥有低权限账户的攻击者以 SYSTEM 权限读/写任意文件。
虽然该漏洞本身不会直接允许以 SYSTEM 身份执行命令,但我们可以将其与多个攻击向量结合来实现这一目标。恰好在 2 月 13 日,BlackArrowSec 发布了一个利用 StorSvc 服务的权限提升 PoC,只要攻击者能够将 DLL 文件写入 PATH 中的任何目录,即可允许攻击者以 SYSTEM 权限执行代码。
LocalPotato PoC 利用了 NTLM 认证中一种称为 NTLM 本地认证的特殊情况下的缺陷,欺骗一个特权进程对攻击者针对本地 SMB 服务器启动的会话进行认证。结果是攻击者最终拥有一个连接,该连接使其能够以被欺骗进程的权限访问任何共享,包括像 C$ 或 ADMIN$ 这样的特殊共享。
该漏洞利用的执行过程如下:
通过拥有对 SMB 共享的特权连接,攻击者可以在目标机器的任何位置读取或写入文件。虽然这不允许我们直接对易受攻击的机器运行命令,但我们将结合不同的攻击向量来实现这一目标。
请注意,该漏洞存在于 NTLM 协议中,而非 SMB 服务器,因此,理论上相同的攻击向量可用于任何通过 NTLM 进行认证的服务。但在实践中,选择攻击协议时必须处理一些注意事项。PoC 使用 SMB 服务器来避免针对其他协议类似攻击向量的某些额外保护,甚至实现了一个快速绕过方法,使漏洞利用能够在 SMB 服务器上工作。 原始漏洞利用作者的帖子 - (https://decoder.cloud/2023/02/13/localpotato-when-swapping-the-context-leads-you-to-system/)
到目前为止,我们使用 LocalPotato 将任意文件写入目标机器。要获得特权 shell,我们仍然需要弄清楚如何利用任意写入来运行命令。
最近,发现了另一个权限提升向量,攻击者可以劫持一个缺失的 DLL,以 SYSTEM 权限运行任意命令。这个向量的唯一问题是攻击者需要将一个 DLL 写入系统的 PATH 目录中才能触发它。默认情况下,Windows PATH 只包含仅特权账户可以写入的目录。虽然可能会发现某些机器因安装特定应用程序而修改了 PATH 变量并使其容易受到攻击,但该攻击向量仅适用于特定场景。将此攻击与 LocalPotato 结合可以克服这一限制,并实现一个完全可行的权限提升漏洞利用。
StorSvc 和 DLL 劫持 正如 BlackArrowSec (https://github.com/blackarrowsec/redteam-research/tree/26e6fc0c0d30d364758fa11c2922064a9a7fd309/LPE via StorSvc) 所发现的,攻击者可以向“StorSvc”服务提供的“SvcRebootToFlashingMode”方法发送一个 RPC 调用,这反过来会触发尝试加载一个名为“SprintCSP.dll”的缺失 DLL。 如果你不熟悉 RPC,可以将其视为一个公开函数的 API,以便可以远程使用它们。在这种情况下,StorSvc 服务公开了 SvcRebootToFlashingMode 方法,任何可以访问该机器的人都可以调用它。 由于 StorSvc 以 SYSTEM 权限运行,在 PATH 中的某个位置创建 SprintCSP.dll 将在调用 SvcRebootToFlashingMode 时被加载。
编译漏洞利用 漏洞利用链接 - (https://github.com/decoder-it/LocalPotato) 要使用此漏洞利用,你需要首先编译提供的两个文件:
让我们从处理“RpcClient.exe”开始。如前所述,我们需要根据目标机器的 Windows 版本更改漏洞利用。为此,我们需要更改“LPE via StorSvc\RpcClient\RpcClient\storsvc_c.c”的前几行,以便选择正确的操作系统。这将设置漏洞利用使用正确的 RPC 接口标识符。现在代码已更正,让我们打开一个开发者命令提示符并通过运行以下命令构建项目: 命令: C:\LPE via StorSvc\RpcClient> msbuild RpcClient.sln C:\LPE via StorSvc\RpcClient> move x64\Debug\RpcClient.exe C:\Users\user\Desktop\ (编译后的可执行文件将出现在你的桌面上。)
现在要编译“SprintCSP.dll”,我们只需要修改“C:\LPE via StorSvc\SprintCSP\SprintCSP\main.c”中的“DoStuff()”函数,使其执行一个授予我们机器特权访问权限的命令。为简单起见,我们将使 DLL 将当前用户添加到 Administrators 组。我们也可以从目标机器获取一个反向 shell。 我们现在通过运行以下命令编译 DLL,并将结果移回桌面: 命令: C:\LPE via StorSvc\SprintCSP> msbuild SprintCSP.sln C:\LPE via StorSvc\SprintCSP> move x64\Debug\SprintCSP.dll C:\Users\user\Desktop\
我们现在准备启动漏洞利用。确保你有“LocalPotato.exe”漏洞利用程序、“RpcClient.exe”和“SprintCSP.dll”文件。
检测与缓解
检测 现在我们已经了解了 localpotato 漏洞利用的工作原理以及如何将其与 StorSrv 服务链起来以 SYSTEM 身份执行代码,是时候看看如何在系统中检测此活动以及如何防止此类攻击了。
YARA 规则:由于此攻击涉及在命令行终端中带参数运行可执行文件,两种常见的检测方法是使用模式匹配工具 YARA 检测文件模式,并检查此黑客工具 localpotato.exe 执行产生的事件。由于攻击使用名为 localpotato.exe 的黑客工具,我们可以创建一个 YARA 规则来检测系统中是否存在此工具,方法是使用 YARA 或其他检测工具(如 THOR)扫描主机。 (YARA 规则已附加到此仓库中,此最小规则在 localpotato 可执行文件中查找常见字符串模式。)
Sigma 规则:SIGMA 是一种通用签名语言,用于根据事件日志中发现的模式编写检测规则。为了在网络中检测 localpotato,预计需要启用集中式日志监控。以下 SIGMA 规则取自 SIGMA 官方仓库 (https://github.com/SigmaHQ/sigma/blob/master/rules/windows/process_creation/proc_creation_win_hktl_localpotato.yml)。
我们可以使用这些 sigma 规则转换为现有的检测/监控工具,并搜索事件日志以搜寻潜在的攻击。
缓解