DLL侧加载技术分析以及如何进行武器化
downn 发表于 美国 渗透测试 1134浏览 · 2024-08-15 10:08

前言

DLL侧载(DLL Sidloading)是一种恶意软件常用的规避检测的攻击技术,攻击者利用应用程序加载动态链接库(DLL)的机制-顺序搜索和模糊调用,通过在特定位置放置恶意DLL,诱使应用程序加载并执行这些恶意DLL,以实现恶意代码的实行,提权操作或是和C2服务器通讯等恶意行为。

DLL顺序搜索机制

在Winodws中,大部分应用程序的操作都会涉及到动态链接库DLL,DLL是一个共享文件,为模块化、代码重用提供了很大的便利,当可执行文件需要用DLL中调用函数时,它会要求操作系统将该库加载到内存中。

通常,应用程序通过指定库名称(不带完整路径)来请求加载库。操作系统接收到这个请求后,会开始寻找动态库并将其加载到调用进程的地址空间中。为了确保正确找到并加载DLL,操作系统会按照特定的顺序遍历几个可能的位置。这个就是DLL顺序搜索的机制,通常DLL搜索的顺序如下:

  1. 应用程序加载的目录

  2. 系统目录-使用GetSystemDirectory ( )函数获取此目录的路径

  3. 16位系统目录

  4. Windows 目录 - 使用 GetWindowsDirectory ()函数获取此目录的路径

  5. 当前工作目录

  6. PATH 环境变量中列出的目录

由于DLL的搜索顺序,恶意软件可以在程序目录或当前工作目录中放置与系统库同名的恶意DLL,从而被程序优先加载,导致安全漏洞。

DLL侧加载

DLL侧加载就是一种利用Windows操作系统DLL搜索顺序的技术。通常是一个经过签名的合法可执行程序和一个恶意DLL,通过可执行程序侧加载恶意DLL从而实现代码执行、权限提升等恶意操作(因为Windows不会验证DLL的签名)。

DLL侧加载攻击

恶意软件利用DLL搜索顺序劫持进行武器化的方法主要有两种:

利用方式 特点 示例
被动利用 上传高信任度的独立可执行文件 上传合法系统工具,并放置恶意DLL
主动利用 利用预安装应用程序的不安全加载行为 在用户常用目录放置恶意DLL,等待加载

被动利用

被动利用DLL侧载是攻击者比较常用的一种攻击方式,它一般使用旧版本的签名库(来自旧版操作系统或其它高度可信的来源),将旧版可执行文件和恶意库放在具有‘写入’权限的文件夹中。启动可执行文件后,它会加载并执行同意文件夹中的恶意库。

通过加载合法签名的二进制文件来规避应用程序控制策略或其它安全解决方案。同时恶意库继承了可执行文件的访问权限。该方法适用于已经被入侵的系统,用于规避检测,而不是侧载恶意库的可执行文件。

主动利用

在主动利用的情况下,攻击者需要识别易受到DLL搜索顺序劫持的预安装应用程序或操作系统组件,并利用这个设计缺陷进行攻击。攻击者将恶意库放在DLL搜索顺序中的某个位置,当操作系统加载所需的DLL时,它会优先加载搜索顺序中找到的恶意库。

恶意库以调用进程相同的访问权限执行。在许多情况下,调用进程可能是管理员或系统权限,这样就完成了权限提升的操作。

关于持久性,如果调用应用程序定期加载库(例如,每日定期检查更新),搜索顺序劫持可以帮助建立持久性,使得恶意代码在系统中长期存在。

构建DLL侧加载攻击

如上DLL侧加载的主动利用,要想实施DLL侧加载攻击,需要有以下准备:

  • 查找包含可侧加载DLL的可执行文件
  • 确定可执行文件的导出
  • 构建恶意DLL
  • 将恶意DLL武器化并传播

查找可侧加载DLL的可执行文件

如何手动查找易受 DLL 侧加载攻击的可执行文件:

  • 在任何程序目录中,找到所有可执行文件。
  • 将这些可执行文件复制到一个空目录。
  • 运行文件并观察错误消息。
  • 如果可执行文件返回“未找到 DLL 文件”错误消息,启动 Process Monitor 工具,然后再次运行该可执行文件。
  • 观察进程监视器的输出。

如果进程监视器显示可执行文件尝试在运行它的同一目录或其他位置查找丢失的 DLL 文件,则您可能能够在 DLL 侧加载攻击中使用该可执行文件。

GUP.exe

GUP.exe 文件是WinGup的可执行文件,WinGup 是 Windows 可执行文件的通用更新程序,位于应用程序 Notepad++ 中。

为了确保GUP.exe能够侧加载DLL,我们将其复制到一个空目录下,单独运行它。

发现报错,初次推测该执行文件可以用于侧加载DLL。

打开Process Monitor 设置好过滤条件,删去dll文件后单独运行GUP.exe,监测Monitor中的GUP.exe进程。发现它在其它目录下寻找了libcurl.dll文件。

确定可执行文件的导出

通过DIE,可以知道GUP.exe 从libcurl.dll中导出了哪些函数:

可以查阅Curl文档根据需求构建函数,

curl文档:https://curl.se/libcurl/c/

由于我们仅仅只是为了进行DLL侧加载攻击的测试,这里不考虑原应用程序的正常运行.因此只需要在标头进行如下声明就好:

extern "C" {
    __declspec(dllexport) void curl_easy_setopt(void) { return; }
    __declspec(dllexport) void curl_easy_cleanup(void) { return; }
    __declspec(dllexport) void curl_easy_perform(void) { return; }
    __declspec(dllexport) void curl_easy_init(void) { return; }
}

构建恶意DLL

恶意命令存储在 DllUnregisterServer 方法中,并在 DllMain 中调用:

void DllUnregisterServer(void) {
    system("cmd.exe");
    return;
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) {
    switch (ul_reason_for_call) {
        case DLL_PROCESS_ATTACH:
            DllUnregisterServer();
            break;
        case DLL_THREAD_ATTACH:
            break;
        case DLL_THREAD_DETACH:
            break;
        case DLL_PROCESS_DETACH:
            break;
    }
    return TRUE;
}

在加载时,恶意版本的libcurl.dll执行了一个 PowerShell 命令,该命令从远程服务器 检索Meterpreter有效负载。

编译DLL

使用Visual studio来进行dll的编译:

  • 选择创建新项目,选择动态链接库DLL的模块
  • 在项目下的dllmain.cpp中将上述代码写入(不要忘记引用源文件)
  • 生成解决方案

武器化并投放植入DLL

武器化攻击路径:

  • 创建一个zip文档,打开一个快捷方式
  • LNK快捷方式文件启动cmd.exe进程。
  • cmd.exe进程启动GUP.exe进程。
  • GUP 进程侧载恶意 libcurl.dll 文件。
  • 恶意 libcurl.dll 文件启动 cmd.exe 进程。
  • cmd.exe进程启动PowerShell.exe进程,加载恶意命令。
  • PowerShell.exe 进程连接到命令和控制中心

创建一个快捷方式,对其进行修改,以调用cmd.exe执行GUP.exe.

GUP.exe会侧加载恶意libcurl.dll文件并启动Meterpreter负载.

将这些文件全部打包成一个zip文档.

为了真实性,再给LNK文件替换一个图标.这样DLL侧加载武器化就完成了.

实际运行一下,可以发现一闪而过的powershell窗口.同时

0 条评论
某人
表情
可输入 255