Windows DLL劫持漏洞分析

admin 2022年12月14日22:21:43评论25 views字数 2435阅读8分7秒阅读模式

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来进行进程检测。

Windows DLL劫持漏洞分析

打开Process Monitor后发现检测的进程数量以及操作过多,那么我们现在打开filter来过滤筛选我们想要测试的进程,这里我拿LZhost.exe举例。

Windows DLL劫持漏洞分析

打开filter,在过滤选项中添加Process Name contains lz(这里填你想测试的进程名)然后添加Path ends with dll,这个选项帮我们过滤掉除了DLL以外的文件类型。

Windows DLL劫持漏洞分析

那么过滤完之后界面就变得简单明了许多,这个时候我们有两种劫持选择,其中一个选择是劫持该进程企图调用但是未能寻找到的DLL文件,另外一个选择则是直接替换现有的DLL文件。这里我演示的为第二种直接替换。

那么我们从列表中寻找到与我们的进程处于同一目录下的DLL文件,右键点击它查看stack。

Windows DLL劫持漏洞分析

发现该DLL文件使用了一个叫做LoadLibraryEx的API,我们在这里寻找这个API是因为如果这个DLL文件的调用stack里面有用到LoadLibraryEx这个API,证明这个DLL文件是被进程动态加载的,在这种情况下我们伪造的恶意DLL文件不需要写任何的导出函数就可以直接被成功加载了。

现在我们可以开始编写我们的恶意DLL了,打开Visual Studio选择新建一个动态链接库项目。

Windows DLL劫持漏洞分析

创建成功后编写如下代码:

// 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;

}

Windows DLL劫持漏洞分析

编写完成后生成DLL,找到生成的DLL将其重命名为上文提到的DLL文件并使用重命名的恶意DLL文件直接将原DLL文件替换。

Windows DLL劫持漏洞分析

替换完成后再次运行我们所测试的进程。

Windows DLL劫持漏洞分析

发现计算器弹出,DLL劫持漏洞成功利用。


1

END

1

Windows DLL劫持漏洞分析

往期精彩推荐

●利用Firmadyne进行固件模拟

●构造溯源蜜罐——伪造MySQL服务端

●Cisco RV110W 堆栈缓冲区溢出漏洞分析

●IoT产品固件提取方式

●应用抓包进阶

●Zeoticus勒索病毒技术分析

●NAND Flash 固件读取及解包处理

●如何正确的校验URL

CSL

Windows DLL劫持漏洞分析

联想GIC全球安全实验室(中国)

[email protected]

原文始发于微信公众号(联想全球安全实验室):Windows DLL劫持漏洞分析

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年12月14日22:21:43
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Windows DLL劫持漏洞分析http://cn-sec.com/archives/1464592.html

发表评论

匿名网友 填写信息