动态链接库(dll)可以作为执行任意代码的接口,并帮助恶意行为者实现其目标。dll是microsoft共享库的实现方式,通常以dll为文件扩展名,并且它们也是pe文件,与exe文件结构相同。
DLL可以包含PE文件支持的任何类型的内容,这些内容可能包括代码、资源或数据的任意组合。DLL的主要用途是在系统上的应用程序和进程之间共享这些内容,为Windows应用程序开发者提供高度的灵活性。
DLL在调用进程的内存中以相同的访问权限执行。这意味着,如果DLL包含任何异常,调用EXE不会得到任何保护。恶意攻击者可以通过DLL劫持或DLL代理等方法利用这一特性来执行恶意代码。
DLL搜索顺序简介
在日常工作中,我们会加载大量进程到系统中。使用Windows操作系统时,进程加载算法的一个关键步骤是将动态链接库(DLL)加载到内存中,以利用其功能并满足进程与DLL之间的依赖关系。每当启动进程时,都会发生此操作。
Windows操作系统可能包含同一DLL的多个版本。由于一个系统可能承载许多需要同一个DLL的进程,因此需要一种系统来确保从正确的路径加载所需的DLL,并确保加载的是最相关的版本。
应用程序开发者通过使用LoadLibraryExA或LoadLibraryA函数来加载特定库。这些函数接收一个路径参数,该参数指向所请求的DLL,并向调用进程返回模块的句柄。
- 当前目录
- 启动进程的目录
- C:\ Windows \ System32
- C:\ Windows \ System
- C:\ Windows
- SYSTEM环境变量“PATH”中包含的目录
- USER环境变量“PATH”中包含的目录
DLL攻击
DLL包含要由加载进程执行的代码,这可能会导致利用缺失的DLL或不安全实现的DLL来诱导系统执行恶意负载的情况,利用本机DLL搜索顺序。恶意行为者可能使用此技术来加载自己的DLL,该DLL可能包含任何类型的代码。
攻击利用过程
确定某个进程按特定搜索顺序搜索DLL,并且缺少DLL或错误实现的DLL之后,才能够进行下一步攻击。
第一步:确定DLL
首先,我们使用Sysinternals的ProcMon来筛选未找到以DLL结尾的路径的任何操作:
ProcMon下载:https://www.php.cn/link/b5146481a245e50255f5b24319c2711a
可以看到“Bginfo64.exe”找不到的对应DLL。

第二步:查找DLL和利用
在查找这些DLL时,我们得出Riched32.DLL是非本地DLL,因此,注册表中没有该DLL的默认搜索路径。但是如果我们正确配置它,系统最终也会加载它。
现在所需要做的就是在请求的路径中创建该DLL:

我们在请求路径中创建该DLL(Riched32.dll),为了方便演示,我们的DLL执行后,会弹出“hello HBT黑白天”的消息框来证明我们的DLL可以执行命令。
#define WIN32_LEAN_AND_MEAN
#include
extern "C" __declspec(dllexport) DWORD WINAPI MessageBOXThread(LPVOID lpParam) {
MessageBox(NULL, "hello hbt 黑白天", "hello hbt 黑白天", NULL);
return 0;
}
extern "C" __declspec(dllexport) BOOL APIENTRY DllMain(HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved) {
switch (ul_reason_for_call) {
case DLL_PROCESS_ATTACH:
CreateThread(NULL, NULL, MessageBOXThread, NULL, NULL, NULL);
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}我们将这个DLL命名为Riched32.dll并放入Bginfo64.exe的DLL文件夹中。
然后重新打开进程“Bginfo64.exe”。

出现该消息框,并且我们可以观察到该进程加载了DLL:

如果我们的DLL中包含恶意代码,是不是可以继承Bginfo64.exe执行命令?
最后一步:拿一个shell
确定了进程和易受攻击的路径之后,所缺少的就是创建我们希望执行的DLL有效负载。
我们可以使用“DLLicious”工具(https://www.php.cn/link/e3423656a3520cb9a9825048b5cb59aa。
用法
用法非常简单,只需使用Python3或“.\DLLicous.py”运行脚本。
我们可以:
- 用C语言将反向Shell编写DLL。
- 使用Base64nc.exe对NC二进制文件进行编码和解码,然后将其写入DLL的工作目录中,然后从该目录中发起攻击。另一个新功能是:nc.exe在DLL中也包含base64代码,而不是从Web下载或从SMB服务器复制它。

通过使用PowerShell和DLL代码中包含的NetCat的反向Shell,并尝试与kali上的侦听器联系,然后使用PowerShell打开shell。
我们可以看到执行劫持的进程后,将加载DLL并打开shell:

https://www.php.cn/link/1721075016476163d0405fdfe93667c1
https://www.php.cn/link/6ef43ab936ea0c3ff156b0e099c783ba
https://www.php.cn/link/b5146481a245e50255f5b24319c2711a
渗透测试、红队攻防、免杀、权限维持等技术,以及及时分享最新漏洞复现及EXP,国内外最新技术分享!
进来一起学习吧。










