【技术分享】一种特殊的dll劫持

VSole2021-07-22 16:07:02

去年我分享了我发现的CVE-2020-3535:Cisco Webex Teams windows客户端dll劫持漏洞。当时我文章中说:

考虑另外一种exe和加载的dll不在同一个路径的情况,如果C:\abc\def\poc.exe想要加载C:\abc\lib\test.dll,可不可以写成LoadLibraryW(L”..\lib\test.dll”)呢?这也是会导致漏洞的,同样windows会把”..\lib\test.dll”直接当成”C:\lib\test.dll”。我在另外某个知名厂商的产品中发现了这样的代码,我已经报告给了厂商,还在等厂商给我答复。我可能会在90天的期限或者厂商发布安全公告之后补充更多细节。

实际上我发现了两个产品中都有这样的代码,分别是IBM(R) Db2(R)和VMware ThinApp。具体细节我发到full disclosure里面了:

VMware ThinApp DLL hijacking vulnerability

IBM(R) Db2(R) Windows client DLL Hijacking Vulnerability(0day)

我们看看LoadLibrary的文档:

微软说你们可不能直接给LoadLibrary一个相对路径啊,你们应该先用GetFullPathName获取dll的绝对路径,再把绝对路径作为参数调用LoadLibrary。那么当我们给LoadLibrary提供一个相对路径的时候到底发生了什么呢?以VMware ThinApp中的LoadLibraryExW(L"\\DummyTLS\\dummyTLS.dll", 0, 0)为例我们来简单分析一下Windows的ntdll.dll是怎么处理dll路径的。这里的流程是:KernelBase!LoadLibraryExW->ntdll!LdrpLoadDll->ntdll!LdrpPreprocessDllName,我们来看LdrpPreprocessDllName。

代码的意思是调用RtlDetermineDosPathNameType_Ustr判断路径的类型,这里返回了4也就是RtlPathTypeRooted,后面调用LdrpGetFullPath就得到C:\DummyTLS\dummyTLS.dll这样的一个路径了。所以这里处理的逻辑就是只要你是一个相对路径,Windows就认为你是一个相对于磁盘根目录(一般也就是C盘)的路径。可以参考ReactOS的代码。

非常糟糕的是Windows中非管理员用户是可以在C盘根目录下创建文件夹并向其中写入文件的,所以就导致了这种本地提权的场景。

小 结

1.确实不能理解Windows系统里面为什么有这么奇怪的设计,可能很多Windows开发也不知道。

2.还是像我之前文章里面说的,如果dll加载失败的时候开发者认真调试检查就能避免这样的漏洞(也正因为如此这种dll劫持的场景一般不会发生)。

3.Windows中非管理员用户是可以在C盘根目录下创建文件夹并向其中写入文件的,这给了很多这样本地提权场景利用的机会。

4.使用绝对路径往往能更安全一点,后面有机会我也可能继续分享一些我发现的相对路径导致的各种各样的本地提权或者RCE的场景。

dll劫持相对路径
本作品采用《CC 协议》,转载必须注明作者和本文链接
BypassUAC技术总结
2022-05-02 06:57:08
用户帐户控制(User Account Control,简写作UAC)是微软公司在其[Windows Vista](https://baike.baidu.com/item/Windows Vista)及更高版本操作系统中采用的一种控制机制,保护系统进行不必要的更改,提升操作系统的稳定性和安全性。
管理员在正常情况下是以低权限运行任务的,这个状态被称为被保护的管理员。我们劫持该exe文件的dll,可以达到Bypass UAC提权的目的。通过将恶意DLL放在真实DLL之前的搜索位置,就可以劫持搜索顺序,劫持的目录有时候包括目标应用程序的工作目录。实践出真知2这里使用第三种方法进行实验,实验对象是eventvwr.msc,它是管理工具中的事件查看器,它依赖于mmc.exe来运行。
Bypass UAC 技术总结
在本文中,我们将简要介绍一下用户帐户控制,即UAC。我们还将研究它如何潜在地保护免受恶意软件的攻击并忽略UAC提示可能给系统带来的一些问题。
C:\Users\dyy\AppData\Local\Programs\Python\Python38\Scripts\oci.dll使用 cs 生成恶意 dll,重命名为?后放置到该目录下手动挖掘Process Monitor 查找可用 dll,设置如下图所示配置完可以保存导出配置,下次直接导入使用使用?进行测试,运行程序 filter 加载所使用的 dll 文件这里可以看出来,当?文件编写一个基础的弹窗 dllJAVA1. // dllmain.cpp : 定义 DLL 应用程序的入口点。CS 上线cs 生成 c 的 payload生成的?填入到下面相应的位置上CPP1
DLL劫持的防御策略
去年我分享了我发现的CVE-2020-3535:Cisco Webex Teams windows客户端dll劫持漏洞。实际上我发现了两个产品中都有这样的代码,分别是IBM(R) Db2(R)和VMware ThinApp。
在过去的一年里,一群攻击者通过恶意谷歌广告或虚假的 Facebook 个人资料传播窃取恶意软件的信息,以 Facebook 商业账户所有者为目标。
红队人员拿到一台主机权限后首先会考虑将该机器作为一个持久化的据点,种植一个具备持久化的后门,就需要用到权限维持
VSole
网络安全专家