1
概述
DLL劫持漏洞的第一次出现在大众视野中是微软在2010年8月23日发布的2269637号安全公告中公开披露的信息,"DLL劫持漏洞(DLL Hijacking Exploit)。利用DLL劫持漏洞,病毒木马可以随着文档的打开而加载自身,病毒通过该漏洞可获得"系统控制权"。
2
背景
DLL是Dynamic Link Library的缩写,意为动态链接库。DLL文件即动态链接库文件,是一种可执行文件,它允许程序共享执行特殊任务所必需的代码和其他资源。通过使用 DLL,程序可以实现模块化,由相对独立的模块组成。在Windows系统中,许多的应用程序并不是一个完整的可执行文件,它们会被分割成一些相对独立的DLL文件并放置于系统当中。因为模块是彼此独立的,所以程序的加载速度更快,当我们执行其中某一个程序,相应的DLL文件就会被调用。一个程序可以有多个DLL文件,同样一个DLL文件有可能同时被不同的应用程序所使用。
3
DLL文件调用顺序
在Windows XP SP2版本之前
在Windows XP SP2之前,安全DLL查找模式(Safe DLL Search Mode)是默认禁用的,Windows查找DLL的目录以及对应的顺序如下:
1.进程对应的应用程序所在目录(安装目录)
2.当前目录(Current Directory)
3.系统目录
4.16位系统目录
5.Windows目录
6.PATH环境变量中的各个目录
在Windows XP SP2版本之后
在Windows XP SP2之后,安全DLL查找模式(Safe DLL Search Mode)是默认开启的,Windows查找DLL的目录以及对应的顺序如下:
1.进程对应的应用程序所在目录(安装目录)
2.系统目录
3.16位系统目录
4.Windows目录
5.当前目录
6.PATH环境变量中的各个目录
Windows 7版本及以上
在Windows7之后,微软为了更进一步的防御系统的DLL劫持,将一些容易被劫持的系统DLL写进了一个注册表项中,叫做KnownDLLs。那么凡是在此项目下的DLL文件就会被禁止从exe自身所在目录下调用,而只能从系统目录即system32目录下调用。
4
利用原理
我们已经知道了一个进程查询并调用一个DLL文件的顺序,如果一个进程在尝试调用一个DLL时没有指定该DLL的绝对路径,那么Windows将会按照对应操作系统的顺序去查询并调用该DLL。那么这时攻击者就可以编写恶意DLL并且将它放在优先于正常DLL所在的目录中,那么就能够达到欺骗系统优先加载恶意DLL,实现DLL“劫持”。
例如:在一个Windows 7以上操作版本的系统中,一个叫test.exe在运行时调用了原本存在于Windows目录下在a.dll,该DLL不存在于KnownDLLs当中并且该程序没有指定a.dll的绝对路径。
那么我们可以编造出恶意DLL将该恶意DLL命名为a.dll并且放在test.exe所在目录下,那么系统将会优先载入我们所编写的恶意DLL。
5
利用实例
我们使用工具Process Monitor来进行进程检测。
打开Process Monitor后发现检测的进程数量以及操作过多,那么我们现在打开filter来过滤筛选我们想要测试的进程,这里我拿LZhost.exe举例。
打开filter,在过滤选项中添加Process Name contains lz(这里填你想测试的进程名)然后添加Path ends with dll,这个选项帮我们过滤掉除了DLL以外的文件类型。
那么过滤完之后界面就变得简单明了许多,这个时候我们有两种劫持选择,其中一个选择是劫持该进程企图调用但是未能寻找到的DLL文件,另外一个选择则是直接替换现有的DLL文件。这里我演示的为第二种直接替换。
那么我们从列表中寻找到与我们的进程处于同一目录下的DLL文件,右键点击它查看stack。
发现该DLL文件使用了一个叫做LoadLibraryEx的API,我们在这里寻找这个API是因为如果这个DLL文件的调用stack里面有用到LoadLibraryEx这个API,证明这个DLL文件是被进程动态加载的,在这种情况下我们伪造的恶意DLL文件不需要写任何的导出函数就可以直接被成功加载了。
现在我们可以开始编写我们的恶意DLL了,打开Visual Studio选择新建一个动态链接库项目。
创建成功后编写如下代码:
// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "pch.h"
#include
BOOL APIENTRY DllMain(
HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
system("calc");
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
编写完成后生成DLL,找到生成的DLL将其重命名为上文提到的DLL文件并使用重命名的恶意DLL文件直接将原DLL文件替换。
替换完成后再次运行我们所测试的进程。
发现计算器弹出,DLL劫持漏洞成功利用。
1
END
1
往期精彩推荐
●利用Firmadyne进行固件模拟
●构造溯源蜜罐——伪造MySQL服务端
●Cisco RV110W 堆栈缓冲区溢出漏洞分析
●IoT产品固件提取方式
●应用抓包进阶
●Zeoticus勒索病毒技术分析
●NAND Flash 固件读取及解包处理
●如何正确的校验URL
CSL
联想GIC全球安全实验室(中国)
原文始发于微信公众号(联想全球安全实验室):Windows DLL劫持漏洞分析
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论