DLL劫持技术权限提升及防范

点击星标,即时接收最新推文

0deffa0d787465eb5914dda33cc9f621.png

本文选自《内网安全攻防:红队之路》

扫描二维码五折购书

DLL劫持技术权限提升及防范  

Dll劫持原理介绍  

DLL(Dynamic Link Library)文件为动态链接库文件,又称“应用程序拓展”,是一种文件类型。在程序运行中,可能会需要一些相对独立的动态链接库,而这些预先放置在系统中的动态链接库文件。当我们执行某一个程序时,相应的DLL文件就会被调用。DLL 是一个包含可由多个程序同时使用的代码和数据的库,一个应用程序可使用多个DLL文件,一个DLL文件也可能被不同的应用程序使用,这样的DLL文件被称为共享DLL文件。

DLL劫持指的是,恶意程序通过劫持或者替换正常的动态链接库,欺骗正常程序加载精心准备的恶意动态链接库。DLL劫持发产生大多与动态链接库加载顺序顺序有关,不同的系统查找DLL的目录以及对应的顺序略有差异,大概可以分为Windows XP SP2之前、在winxdows xp sp2之后这两种情况。

  • 在Windows XP SP2之前,Windows查找DLL的目录以及对应的顺序如下:

  • 进程对应的应用程序所在目录。

  • 当前目录(Current Directory)。

  • 系统目录(通过 GetSystemDirectory 获取)。

  • 16位系统目录。

  • Windows目录(通过 GetWindowsDirectory 获取)。

  • PATH环境变量中的各个目录。

在Windows XP SP2之后到Windows 7 ,引入了一个名为SafeDllSearchMode的安全机制,SafeDllSearchMode默认为开启状态,此时Windows查找DLL的目录以及对应的顺序如下:

  • 进程对应的应用程序所在目录。   

  • 当前目录(Current Directory)。

  • 系统目录(通过 GetSystemDirectory 获取)。

  • 16位系统目录。

  • Windows目录(通过 GetWindowsDirectory 获取)。

  • PATH环境变量中的各个目录。

在Windows7之后,在原来SafeDllSearchMode的规则下,额外引入了KnownDLLs概念,以缓解DLL劫持问题。KnownDLLs 是一个注册表项,位于HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs,如图所示,此项下的所有匹配到的DLL文件就会被禁止从程序自身所在的目录下调用,而只能从系统目录即SYSTEM32目录下调用。

编写测试DLL  

测试DLL劫持漏洞需要编写一个用于测试DLL劫持的测试DLL程序,为了保证一定的通用性,该程序使用DllMain作为触发点,程序代码如下:

#include "pch.h"
BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved){
switch (ul_reason_for_call)
{
       case DLL_PROCESS_ATTACH:
       MessageBoxA(0,"Process attach",0,0);
       break;
       case DLL_PROCESS_DETACH:
       MessageBoxA(0,"Process detach",0,0);
       break;
       case DLL_THREAD_ATTACH:
       MessageBoxA(0,"Thread attach",0,0);
       break;
       case DLL_THREAD_DETACH:
       MessageBoxA(0,"Thread detach",0,0);
       break;
}
return TRUE;
}

将以上代码编译为DLL,当程序存在DLL劫持漏洞,调用DllMain会弹出对应的消息框。

可以编写一个Demo程序,使用Windows api LoadLibraryA函数来加载这个DLL,程序代码如下:

#include
#include
           
int main()
{
    HMODULE hModule = LoadLibraryA("payload.dll");
    FreeLibrary(hModule);
    return 0;
}

此时,运行该程序将使用LoadLibraryA函数加载测试DLL,弹出MessageBox对话框,如图所示。

50fd2033cb73bebcad66198968a67f95.png

DLL劫持测试弹框图

手动挖掘DLL劫持漏洞  

Putty.exe是知名的ssh连接客户端,本次使用Putty的0.62版本,演示如何挖掘一个可利用的DLL劫持漏洞,并使用上节编写的测试payload来触发MessageBox对话框。

首先启动Process Monitor,根据实际情况添加过滤条件,如下图4-40、4-41所示,过滤条件为进程名为Putty.exe的条目以及结果为NAME NOT FOUND的条目。   

c760935d592c69512056e36a886509c3.png

过滤putty.exe文件名

fc986645d1aa3341a4d31f12fb806fe2.png

过滤NAME NOT FOUND的结果

随后启动Putty.exe,捕获到以下条目。如图所示,可以看到Putty.exe加载了UIAutomationCore.dll,且该DLL名不在KnownDLLs列表中。

da324e5107df0462d46fe0461400db5c.png

putty过滤结果    

将编写的测试DLL放到Putty.exe同级目录,并重命名为UIAutomationCore.dll,点击putty.exe,启动程序,如图所示,此时弹出了MessageBox对话框,证明此时已经挖掘出一个putty的DLL劫持漏洞。

0e7298d5284bdd12af33516eea534359.png

Putty DLL劫持漏洞触发弹框

通过本次实验,介绍了如何手工挖掘一个入口点为DllMain的DLL劫持漏洞。实际上,除DllMain以外,DLL还有着很多其他的入口函数,通过更加深入的挖掘,可以找到更多的DLL劫持漏洞。

使用DLLHSC自动挖掘DLL劫持漏洞  

DLLHSC是一个C++编写的开源项目,下载地址为https://github.com/ctxis/DLLHSC,主要用于DLL劫持漏洞的自动化挖掘。

使用如下命令,将启动程序并打印它所加载的非KnownDLLs列表,而且不是WinSxS依赖的DLL文件名,如图所示。

DLLHSC.exe -e putty.exe -lm

47f0e0617ee1b956158b7340c7b2372d.png

DLLHSC -lm挖掘DLL劫持

使用如下命令,将加载可行性文件,并且Hook LoadLibrary和LoadLibraryEx函数,打印加载的DLL文件名,如图所示。

DLLHSC.exe -e putty.exe -rt

a80ca301e686506e291f7e3f7cc6a917.png

DLLHSC -rt挖掘DLL劫持

DLL劫持漏洞的防御措施  

在软件开发过程中,开发者需要格外注意使用安全函数来加载动态函数库,尽量使用绝对路径加载库函数,对于加载的DLL要验证MD5、签名等信息,来防止DLL劫持漏洞产生。

对于主机侧,可以尝试监控 DLL 创建的额外进程或其他实例,攻击者通过触发DLL劫持通常会有其他恶意操作来达到进一步提权的目的。

DLL劫持漏洞往往附带着其他攻击手法,可以安装EDR等安全软件防止攻击者利用DLL劫持漏洞进一步攻击。

—  实验室旗下直播培训课程  —

d33ed5e91480b713da084e4439a8424f.png

980b82a0471475503ecb30da3736496b.jpeg

3603eb88162e331ad7435f16c9fd0df5.jpeg61aa2add5cb3d10ba2de9ebabf321c09.png

d4df19e52b365d9f36c7fb4566046265.png

a9fcaef2028a0ad0c1441fa768bcdc1e.jpeg

14bcda158c5013cde242a9e87219ef75.jpeg

9655c8a2a434b5bdb3a3aefca8d1ae53.jpeg

f32da28b9f4361d777dc3a3d0ec95abb.png

和20000+位同学加入MS08067一起学习

914e3f453c84ee1d96e747e64f607757.gif           

  • 23
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值