白加黑wwlib.dll复现

  1. 起因
  2. 白加黑概念
  3. 实验过程

起因

今日看到某分析文章,利用word的wwlib.dll实现白加黑。虽然这个操作很早就有了,翻了一下笔记发现没有测过,实验一波并做测试

白加黑概念

白exe,黑dll
所谓白exe指拥有数字签名的exe,数字签名也分三六九等。大厂的签名一般都很不错,WinWord.exe的数字签名即为微软的数字签名

实验过程

将WinWord.exe拖入IDA分析,追踪LoadLibraryW函数可以看到有几个调用

个人测试
(由于IDA不在虚拟机,直接把winword拖出到物理机看,和文章所测试的并不相同)

IDA不行的话
作者给出的其他的方法:
如果无法使用IDA静态分析我们可以使用API监控软件来观察,如火绒剑或API Monitor,当然也可以使用OD下断点来分析。(这里和使用IDA没什么区别,不同的PE文件用不同的方式来达到最好的效果)

OD断点LolibraryW,可以发现加载的wwlib.dll和其调用wwlib.dll内的函数

目前所知道的内容:

* 加载的wwlib.dll
    * 调用Fmain函数
    * 调用wdCommandDispatch函数
    * 调用wdGetApplicationObject函数

利用手段:

* vs自己写dll,实现调用的三个函数
* msf直接生成个dll,在dllmain函数直接实现劫持

wwlib.dll导出函数

其实wwlib.dll可以拖入到IDA分析导出函数,然后在编写。由于这里测试的时候出现了点问题,直接拿文章给出的图按着构造即可

#include "stdafx.h"
#include <iostream>
#include <Windows.h>
extern "C" __declspec(dllexport) int FMain(int a, int b, int c, int d);
extern "C" __declspec(dllexport) void wdCommandDispatch();
extern "C" __declspec(dllexport) void wdGetApplicationObject();
//extern "C" __declspec(dllexport) void DllCanUnloadNow(); //确定是否正在使用实现此功能的DLL。如果不是,则调用者可以从内存中卸载DLL。,不能重新定义
//extern "C" __declspec(dllexport) void DllGetClassObject();
//extern "C" __declspec(dllexport) void DllGetLCID();
int FMain(int a,int b,int c,int d) {
        MessageBoxA(0, "test", "test", MB_OK);
        exit(0);
        return 1;
}
void wdCommandDispatch() {

}
void wdGetApplicationObject() {
}
BOOL APIENTRY DllMain(
        HINSTANCE hinstDLL,  // handle to DLL module
        DWORD fdwReason,     // reason for calling function
        LPVOID lpReserved)  // reserved
{
        // Perform actions based on the reason for calling.
        switch (fdwReason)
        {
        case DLL_PROCESS_ATTACH:
               // Initialize once for each new process.
               // Return FALSE to fail DLL load.
               break;
        case DLL_THREAD_ATTACH:
               // Do thread-specific initialization.
               break;
        case DLL_THREAD_DETACH:
               // Do thread-specific cleanup.
               break;
        case DLL_PROCESS_DETACH:
               // Perform any necessary cleanup.
               break;
        }
        return TRUE;  // Successful DLL_PROCESS_ATTACH.
}

x86生成dll,替换掉原来的wwlib.dll即可看到定义的弹框

注意事项:
写好对应要劫持的dll函数生成后,注意原来dll的位数。不要原本是x86生成个x64,那铁定跑不了。(tm我在这踩了一个小时的坑,xswzj)

dllmain函数处劫持(在DllMain中DLL_PROCESS_ATTACH选项下(每次加载DLL首先执行的地方))

实现劫持dll并使得winword正常运行,像上面粗暴的方法去定义dll函数。然后等着exe去执行,返回预期不一致的话导致exe无法正常运行退出。使得恢复exe正常运行最简单的方法就是把原来的dll改名,然后在调用处调用dll的函数(仅限于可以看见调用的导出函数)

#include "stdafx.h"
#include <iostream>
#include <Windows.h>
extern "C" __declspec(dllexport) int FMain(int a, int b, int c, int d);
extern "C" __declspec(dllexport) void wdCommandDispatch();
extern "C" __declspec(dllexport) void wdGetApplicationObject();
//extern "C" __declspec(dllexport) void DllCanUnloadNow(); //确定是否正在使用实现此功能的DLL。如果不是,则调用者可以从内存中卸载DLL。,不能重新定义
//extern "C" __declspec(dllexport) void DllGetClassObject();
//extern "C" __declspec(dllexport) void DllGetLCID();
typedef int(*run)(int a,int b,int c,int d);
int FMain(int a,int b,int c,int d) {
        MessageBoxA(0, "test", "test", MB_OK);
        HMODULE v1 = LoadLibraryA("WWLIBS.DLL");
        run v2 = (run)GetProcAddress(v1,"FMain");
        return v2(a,b,c,d);
}
void wdCommandDispatch() {

}
void wdGetApplicationObject() {
}
BOOL APIENTRY DllMain(
        HINSTANCE hinstDLL,  // handle to DLL module
        DWORD fdwReason,     // reason for calling function
        LPVOID lpReserved)  // reserved
{
        // Perform actions based on the reason for calling.
        switch (fdwReason)
        {
        case DLL_PROCESS_ATTACH:
               // Initialize once for each new process.
               // Return FALSE to fail DLL load.
               break;
        case DLL_THREAD_ATTACH:
               // Do thread-specific initialization.
               break;
        case DLL_THREAD_DETACH:
               // Do thread-specific cleanup.
               break;
        case DLL_PROCESS_DETACH:
               // Perform any necessary cleanup.
               break;
        }
        return TRUE;  // Successful DLL_PROCESS_ATTACH.
}

效果如下

文章中重点:
如何发现存在DLL劫持漏洞的新可执行文件
其实网络世界中存在大把存在DLL劫持漏洞的应用程序,那么我们该如何选择对应的可执行文件呢?
1.独立的EXE文件来调用恶意DLL。(独立EXE必须为合法的白文件)
2.独立的EXE文件必须具有数字签名,并且该数字证书不会在短期内过期。
3.数字签名最好包括微软的数字签名。
4.独立的EXE必须使用Load来加载DLL且没有验证DLL。

防御与总结
首先对该类型的攻击有以下几个比较好的方法去防御。
1.可以检查网络连接异常的进程:首先我们可以将正常的网络通信进程链进行记录,当发现该进程的网络活动与记录的进程链不符时,则可能受到了DLL劫持攻击。
2.在加载DLL时,先将文件读入内存中验证其数字签名或是哈希值,发现不匹配则不加载该DLL。
3.当然Microsoft提供了一些关于DLL安全性和针对DLL劫持漏洞的相关文档。

参考链接:https://www.freebuf.com/articles/system/227824.html


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。

文章标题:白加黑wwlib.dll复现

本文作者:九世

发布时间:2020-12-04, 14:39:36

最后更新:2020-12-04, 14:50:39

原始链接:http://422926799.github.io/posts/7b49de5f.html

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录