【声明】本文所涉及的技术、思路和工具仅用于安全测试和防御研究,切勿将其用于非法入侵或攻击他人系统以及盈利等目的,一切后果由操作者自行承担!!!
前言
通常在运行一个EXE文件的时候,会先加载支持该EXE文件运行的DLL(动态链接库)文件,那如果把其中一个DLL文件替换成恶意DLL,DLL里面注入一个后门文件, 当被攻击者双击执行程序时,就会加载恶意DLL,进而触发后门文件,最终达到控制对方主机的目的。
替换DLL操作,也就是我们所说的“DLL劫持”,而“白+黑”里面的“白”则指的是EXE文件(带有数字签名),“黑”则指替换的恶意DLL。
0x01 DLL 劫持原理
当一个可执行文件在Windows上运行时,系统的加载器会将该可执行模块映射到进程的地址空间中。加载器会分析可执行模块的导入表,并寻找所需的DLL文件,并将它们映射到进程的地址空间中。导入表中只包含DLL的名称而没有路径信息,因此加载器必须在磁盘上搜索DLL文件。搜索路径按照特定规则顺序进行,恶意程序就是利用了这个特点,伪造了一个与系统DLL同名的DLL文件,该文件具有相同的导出表,并将每个导出函数重定向到真正的系统DLL函数。这样,当程序调用系统DLL时,它首先调用了在当前目录下伪造的DLL文件,完成相关功能后,再跳转到真正的系统DLL同名函数进行执行。
Windows XP SP2的系统以上DLL文件加载的搜索顺序如下:
(1)可执行程序加载的目录
(2)系统目录
(3)16位系统目录
(4)Windows目录
(5)运行某文件的所在目录
(6)路径环境变量中列出的目录
0x02 微信测试-弹"计算器弹窗"
首先寻找带有数字签名的可执行文件(这里我是利用微信),且必须是正常的签名才可以,直接右键->属性查看,因为带有数字签名的,通常都是被杀软标记为白名单的。
现在需要寻找一个被劫持的DLL文件,但是目前并不清楚,运行微信,会加载哪些DLL文件,这里有两种方式可以查找:
- 静态查找
把EXE文件单独放到一个文件夹中,执行,会报错缺少xxx.dll文件,如下图:
这种方式虽然可以找到加载的dll文件,但是并不完整
- 动态查找
使用Process Monitor工具或者其他进程查看工具也可以,查找加载的DLL文件,根据自己的需求先过滤出需要的进程,方便查找
接下来,选择一个dll(这里我选择的是dwmapi.dll),利用Visual Studio来伪造dwmapi.dll
挖掘白文件dll小技巧:
1) 最好选择系统搜索路径较靠前的DLL文件进行劫持,以确保被劫持的DLL文件被优先加载
2) 劫持应用中不存在的dll时(Result值为NAME NOT FOUND),最好选择loadlibrary这个api的dll(因为这个dll的调用栈中存在LoadLibrary(EX),也就表明这个dll是动态加载的),这时不需要再伪造dll所调用的导出函数
3) 劫持应用中存在的dll时(Result值为SUCCESS),这时需要伪造dll所调用的函数(可以使用VS自带的工具dumpbin查找),因此最好选择调用函数较少的DLL文件
首先创建项目->动态链接库
伪造dll代码,这里测试调用计算器:
将伪造好的dll,重命名dwmapi.dll,放到微信的当前路径下:
这时执行WeChat.exe,会发现弹出了计算器窗口,说明上面的操作过程均是正确的
0x03 QQ测试-上线Cobalt Strike
这里我们利用QQ来演示,但是这里我们选择去劫持应用中存在的dll文件,使用图片分离的方式来上线CS。
同样的,使用Process Monitor过滤出dll文件,过滤操作如下图:
这里,按照按照前面所讲到的dll文件搜索顺序,所以先找当前路径下的dll文件,我这里选择伪造的是TaskTray.dll(选择dll依然按照我们前面所讲到的技巧去选择,该dll是已经测试过的)。
这时伪造dll文件,我们有两个点特别需要注意,否则上不了线。
第一点是我们需要知道我们伪造的dll被调用时会用到哪些函数,这里使用VS自带的工具dumpbin来查看,具体用法如下图:
第二点就是我们需要确定伪造的dll是多少位的,这涉及到后面我们去生成shellcode的位数要对应,同样使用VS自带的dumpbin工具可以查看,使用方式如下图:
经过查看,发现该dll是32位的,接下来,去生成32位的shellcode,打开CS->有效载荷->Payload生成器,32位的shellcode一定不能勾选使用x64 payload
然后使用工具DKMC把shellcode写进图片里面,这里需要python2环境,具体用法如下:
进入DKMC后,选择gen,将刚才生成的shellcode写入
最后run执行,可以看到在DKMC的路径下生成了一个bmp后缀的图片
所有需要准备的内容已经准备完成,现在使用VS来生成伪造的dll文件,在编写伪造dll代码时,需要在dll调用的函数前面加上extern “C”,因为在构建dll的时候,编译器会为函数名进行改编,但是在构建可执行文件的时候,编译器不会对函数名进行更改,这时候当链接器试图链接可执行文件的时候,会发现可执行文件引用了一个不存在的符号并报错,因此这里在函数前面加上extern “C”就是来告诉我们的编译器不对变量名和函数名进行改编。
加载器部分代码:
然后将生成的dll文件,同图片一起放到QQ.exe路径下面,运行QQ,CS上线
0x04 杀软效果检测
火绒:
360:
win Defender:
尾声
通过前面讲到的方式,火绒、360以及Defender都能搞定,那么,除了上线以外,我们还可以运用到权限维持里面,比如说我们添加注册表,实现开机自启动的功能,那不就可以每次重启,都能拿到对方权限。
本文所涉及工具、源码,关注公众号【404攻防实验室】,回复【240202】,即可获得!!!