让信息安全
变得简单

几乎300个Windows 10可执行文件易受DLL劫持

Windows 10

一个简单的VBScript可能足以使用户获得管理特权并完全绕过Windows 10上的UAC。

在普华永道英国安全研究人员Wietze Beukema的最新报告中  ,我们了解到将近300个Windows 10可执行文件容易受到DLL劫持的攻击。

“事实证明,System32文件夹中的近300个可执行文件容易受到相对路径DLL劫持的攻击。您知道吗,使用一个简单的VBScript,其中一些EXE可以用于提升此类执行,而完全绕开UAC?” Beukema解释说。

此处提到的漏洞是相对路径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
来源:wietzebeukema.nl

“这使我们能够识别每个应用程序查询的所有DLL,这将是所有潜在的可劫持DLL候选对象。但是并不能自动得出所有这些也都已加载(并因此执行)的结果。”研究人员解释说。 

“找出正确加载了哪些DLL的最可靠方法是编译我们自己的DLL版本,并在成功加载后将其写入唯一文件。如果我们随后对所有目标可执行文件和DLL重复上述方法,则将导致文件收集,这些文件告诉我们已确认哪些DLL容易受到DLL劫持。

但是,对攻击者构成挑战的是编译一个可以由可执行文件启动的自定义版本的DLL,而不会出现任何问题。为了获得对合法DLL结构的可靠了解,Beukema建议使用DLL Export Viewer之类的工具进行分析。

该工具通过枚举所有外部函数名称来深入了解我们试图重新编译的DLL结构,这些名称随后将在DLL Hijacking漏洞中重复使用。

查找易受攻击的可执行文件的方法
查找易受攻击的可执行文件的方法
来源:wietzebeukema.nl

研究人员提供了一个完整的库列表,这些库是劫持攻击的理想选择。

他补充说:“这些不仅仅是理论上的目标,这些已经过测试并证实是有效的。该列表包括287个可执行文件和263个唯一的DLL。”

通过GitHub提供了带有这些库的完整列表的CSV文件。 

一些限制

研究人员针对此示例攻击所解释的一些警告包括:

  • 仅运行不需要任何参数的可执行文件
  • 避免使用具有高级GUI和错误报告功能的应用程序
  • 避免使用C ++编写的DLL。

研究人员已经在Windows 10 64位(操作系统内部版本18362.476)上对此进行了测试,但表示:“某些DLL无法在32位Windows上运行。您可以使用32位GCC编译C文件,然后运行良好。”

请注意,此处解释的攻击可能不适用于所有Windows构建,如Twitter线程中突出显示。

绕过UAC

Windows用户帐户控制(UAC)是Windows Vista及更高版本中添加的一项安全功能,该功能询问用户是否打算在执行高风险应用程序之前将其运行。

UAC提示
Windows UAC提示
来源:BleepingComputer

从Windows 7开始,由于反复要求用户授权合法的流程,这些流程可能很快变得烦人,因此M​​icrosoft在UAC框架内引入了内置的“例外”。有效地,这使受信任的系统DLL可以“自动提升”特权,而不必使用UAC提示来打扰用户。

“考虑到这一点,您可以尝试通过使用标记为自动提升的可执行文件来尝试以提升的特权运行任意代码,该可执行文件也容易受到DLL劫持的影响。如上一节所述,大约有35种这样的可执行文件。” Beukema解释说。

如果成功利用了已执行的恶意DLL,则可以将其用于创建提升权限的命令提示符,从而以管理特权对计算机进行完全访问。

DLL劫持启动提升的命令提示符
DLL劫持启动提升的命令提示符
来源:Wietze Beukema

不过,这里有一个障碍。在期望任何DLL的“自动提升”特权之前,操作系统希望这些DLL存在于受信任的目录中,该目录不是用户可写的。

“要解决的问题是受信任目录的问题:自动提升的可执行文件和自定义DLL都必须位于受信任目录中,但是这些都不是用户可写的。”

一些模仿技术在这里很方便,例如创建一个模拟的“ C:\ windows \ system32”目录(在Windows之后紧跟一个空格)。这个名称异常的文件夹可能会诱使可执行文件将攻击者创建的目录视为“受信任位置”。

是否能够创建这样的目录应被视为安全漏洞尚有争议,因为它为攻击者提供了利用DLL劫持漏洞的途径。

“这是否是适当的安全漏洞尚待商–微软辩称不是,但至少是一个缺陷,因为大多数(非企业)Windows计算机默认情况下都使用’管理员帐户’。无论哪种方式,这都为我们提供了一种出色的手段,通过它可以使DLL劫持更加强大。”研究人员说。

但是为什么,VBScript? 

作者建议使用VBScript的原因之一是因为创建名称包含尾随空格的Windows目录不是通过“传统方式”可以实现的。

“您可以像原始研究人员一样,编译一些C语言来完成此操作,但是事实证明,VBScript实际上也可以为我们做到这一点。以下概念验证表明,仅需几行代码,您就可以使它起作用:”

用VBScript编写的PoC,可创建模拟“可信目录”
用VBScript编写的PoC,可创建模拟的“可信目录”
来源:Wietze Beukema

当受到用户质疑时,Beukema 解释了为什么他在利用容易受到DLL劫持的可执行文件时选择了VBScript。

“我知道……这只是因为PowerShell不允许您这样做,而VBScript却可以。而且由于它是VBScript,因此您无需带上自己的编译二进制文件即可使用此技巧,这意味着,除了自定义DLL之外,您还可以使用Living of the Land +脚本来完成所有工作。”

检测和预防技术

Beukema提出了一些预防方法,可以用来阻止此类攻击,例如,如果您的计算机上存在模拟Windows \文件夹中的活动,则可以对其进行查找。同样,如果最终用户足够了解要执行的操作,则将UAC设置调整为“始终通知”可以帮助防止此类攻击。

另一个策略是监视DLL创建和从意外文件路径加载的实例:

“您可以从意外路径中寻找前面提到的任何DLL的创建或加载,特别是在诸如%appdata%之类的临时位置。毕竟,可以更改加载DLL的(合法)应用程序的名称,但DLL的文件名始终是固定的。”

Beukema建议,在构建应用程序时,开发人员应强制使用绝对而非相对路径来加载DLL,以及其他几种技术。

这些都不是足够简单的。但是,如果适当地结合使用,预防措施(如研究人员所解释的那样)可以长期阻止DLL劫持攻击。

*编译:Domino
*来自:bleepingcomputer
分享到: 更多 (0)