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

admin 2021年12月7日10:43:38评论119 views字数 1474阅读4分54秒阅读模式

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

 

作者:houjingyi

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

考虑另外一种exe和加载的dll不在同一个路径的情况,如果C:abcdefpoc.exe想要加载C:abclibtest.dll,可不可以写成LoadLibraryW(L”..libtest.dll”)呢?这也是会导致漏洞的,同样windows会把”..libtest.dll”直接当成”C:libtest.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的文档:

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

微软说你们可不能直接给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。

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

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

【技术分享】一种特殊的dll劫持非常糟糕的是Windows中非管理员用户是可以在C盘根目录下创建文件夹并向其中写入文件的,所以就导致了这种本地提权的场景。

 

小 结

1.确实不能理解Windows系统里面为什么有这么奇怪的设计,可能很多Windows开发也不知道。
2.还是像我之前文章里面说的,如果dll加载失败的时候开发者认真调试检查就能避免这样的漏洞(也正因为如此这种dll劫持的场景一般不会发生)。
3.Windows中非管理员用户是可以在C盘根目录下创建文件夹并向其中写入文件的,这给了很多这样本地提权场景利用的机会。
4.使用绝对路径往往能更安全一点,后面有机会我也可能继续分享一些我发现的相对路径导致的各种各样的本地提权或者RCE的场景。

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


- 结尾 -
经典推荐
【技术分享】简易 Linux Rootkit 编写入门指北(一):模块隐藏与进程提权
【技术分享】写写真实的Yara特征
【技术分享】物联网异常分析
赎金在哪里?看赎金去哪里摸清勒索去赎金
【技术分享】一种特殊的dll劫持
戳“阅读原文”查看更多内容

本文始发于微信公众号(安全客):【技术分享】一种特殊的dll劫持

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2021年12月7日10:43:38
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   【技术分享】一种特殊的dll劫持https://cn-sec.com/archives/432320.html

发表评论

匿名网友 填写信息