近300个 Windows 10 可执行文件易受 DLL 劫持攻击

 聚焦源代码安全,网罗国内外最新资讯!

编译:奇安信代码卫士团队

一个简单的 VBScript就能使用户获得管理员权限并完全绕过Windows 10  UAC

英国普华永道公司的安全研究员 Wietze Beukema 指出,近300个 Windows 可执行文件易受 DLL 劫持。他解释称,“System32 文件夹中近300个可执行文件易受相对路径 DLL 劫持。你知道吗?仅需一个简单的 VBScript,就能利用其中某些 EXE 提升这些执行且完全绕过 UAC。”

这里说的漏洞就是相对路径 DLL 劫持,即攻击者使合法的 Windows 可执行文件加载受攻击者控制的任意(通常具有恶意意图的) DLL。DLL 劫持攻击可使经验丰富的攻击者执行任意代码、提权并持久地停留在目标系统上。

Beukema 在博客文章中提到了多种 DLL 劫持技术,如 DLL 替换、DLL 代理、DLL 搜索路径劫持、Phantom DLL 劫持、DLL 重定向、WinSxS DLL 替换和相对路径 DLL 劫持。


示例演示

为演示实践中的相对路径 DLL 劫持,Beukema 主要关注的是 Windows 10 (v1909) 机器上 “C:\Windows\System32”文件夹中的库。他将合法的 winstat.exe 进程复制到系统上的 downloads 文件家中,之后运行进程监控工具 procmon,更好地了解该 EXE 在执行过程中查找的 DLL 类型。

研究人员指出,“它能让我们根据每个应用程序识别所有的 DLL,它们都是潜在的可被劫持的 DLL 候选资源。找出被正确加载的 DLL 的最可靠方法是编译自己的 DLL 版本,并使其在成功加载后写入一个唯一文件。如果我们为所有的目标可执行文件和 DLL 重复上述方法,那么就会得到易受 DLL 劫持攻击的 DLL的文件。”

不过,攻击者面临的挑战是需要编译一个由可执行文件发布的、不出任何问题的定制化版本 DLL。为更好地理解合法的 DLL 结构,Beukema 建议使用 DLL Export Viewer 等工具进行分析,从而使我们更好地了解 DLL 结构,我们可以通过枚举所有外部函数名称的方式进行重编译,之后这些 DLL 可用于 DLL 劫持攻击 exploit 中。

该研究员还提供了用于劫持攻击的库列表。他指出,“它们并非只是理论目标,而是经验证并证实能够运行的目标。该列表由287个可执行文件和263个唯一 DLL 组成。”

上述库(CSV 格式)的列表可见 GitHub:https://github.com/wietze/windows-dll-hijacking/


限制条件

Beukema 在这个示例攻击中指出,某些限制条件包括:

  • 仅运行无需任何参数的可执行文件

  • 避免具有高级 GUI 和出错报告能力的应用程序

  • 避免用 C++ 编写的 DLL。

Beukema 表示已在64位 Windows 10 系统(操作系统版本 18362.476)上进行了测试,他指出,“某些 DLLs 在32位 Windows 系统上不起作用。你可以用32位 GCC 编译C文件,之后就可顺畅运行。”

需要注意的是,该攻击可能无法适用于所有的 Windows 版本。


绕过 UAC

Windows 用户账户控制(UAC)是在 Windows Vista 及以上版本中新增的一个安全功能,它会询问用户是否同意执行高风险应用程序。

由于用户对 Windows 总是会询问是否授权合法进程感到厌烦,因此微软从 Windows 7 开始在 UAC 框架中引入内置“例外”。它可允许受信任的 DLL“自动提升”权限,而无需为用户弹出 UAC 消息。

Beukema 解释称,“这样,你可以尝试通过使用被标记为‘自动提升’易受 DLL 劫持攻击影响的可执行文件以提升后的权限运行任意代码。如之前所述,大约存在35个此类可执行文件。”如被成功利用,被执行的恶意 DLL 可被用于创建提升的命令弹出消息,从而能够以管理员权限完全访问计算机。

不过它带来的问题是,在对任何 DLL 进行“自动提升”权限之前,操作系统认为这些 DLL 会出现在一个受信任的、用户不可写的目录中。然而我们也可以通过一些模拟技术如创建一个假冒的 “C:\windows\system32” 目录(windows 后面会有一个尾部空格)。这个命名异常的文件夹可能会诱骗可执行文件将由攻击者创建的目录视作“受信任的位置”。

能够创建这类目录是否应当被视作安全漏洞还存在争议,因为它使攻击者能够利用 DLL 劫持漏洞。研究人员表示,“它是否应当被视作安全漏洞还值得商榷,微软认为并非漏洞,但鉴于多数(非企业)Windows 计算机默认使用‘管理员账户’,因此它至少应被视作是缺陷。不管是否是漏洞,它为我们提供了一种能使 DLL 劫持变得更加强大的绝妙方式。”


为何是 VBScript ?

Beukema 推荐使用 VBScript 的其中一个原因是,创建名称中含有尾部空格的 Windows 目录并不能通过“传统方式”实现。研究员指出,“只通过编译某些 C 语言就可实现,但事实上 VBScript 也可以办到。如下 PoC 表示只需要几行代码就可以实现这一目标:”

Beukema 回应用户提问时说明了他选择 VBScript 作为利用易受 DLL 劫持攻击的可执行文件的原因,“其实只是因为 PowerShell 无法实现,而 VBScript 可以办到。而且因为是 VBScript,你无需创建编译后的二进制就可使用该技术,也就是说除了定制化 DLL,你可以通过离地攻击 (Living off theLand) +脚本的方式做任何事情。”


检测和防御技术

Beukema 提供了一些可用于防御此类攻击的方法,比如,假设在机器上发现此类攻击,则在假冒的 windows \ 文件下查找活动。另外,将 UAC 设置调整为“总是通知”状态有助于防御此类攻击,但前提是用户具有技术知识能够理解将要执行的内容。

另外一个战略是监控 DLL 创建实例并从异常文件路径加载的实例,“你可从异常路径中创建或加载此前提到的任何 DLL,尤其是在临时位置如 %appdata% 查找。毕竟,加载 DLL 的(合法)应用程序的名称可被修改,而 DLL 的文件名称是固定不变的。”

Beukema 建议在构建应用程序时,开发人员应该使用绝对路径而非相对路径来加载 DLL 等。

虽然以上任何一种方法可能都无法做到万无一失,但如果结合使用这些防御措施,长期应该能够阻击 DLL 劫持攻击。

推荐阅读

如何利用Printconfig dll:从 iPhone 到 NT AUTHORITY\SYSTEM 的真实案例

原文链接

https://www.bleepingcomputer.com/news/security/almost-300-windows-10-executables-vulnerable-to-dll-hijacking/

题图:Pixabay License

本文由奇安信代码卫士编译,不代表奇安信观点。转载请注明“转自奇安信代码卫士 www.codesafe.cn”。

奇安信代码卫士 (codesafe)

国内首个专注于软件开发安全的

产品线。

    点个 “在看” ,加油鸭~

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值