前言
DLL劫持漏洞是老生常谈的一个漏洞,已经被前辈们各种奇技淫巧玩烂。但DLL劫持技术在后渗透和域渗透中的权限提升和权限维持都起到了至关重要的作用。本文简单剖析DLL劫持技术并通过实例应用来查看如何在渗透工作中利用此项技术。
0x01 DLL劫持原理
什么是DLL?
DLL的全称是Dynamic Link Library,中文叫做“动态链接文件”,在Windows操作系统中,DLL对于程序执行是非常重要的,因为程序在执行的时候,必须链接到DLL文件,才能够正确地运行。
DLL劫持漏洞产生原因
开发者在调用DLL时没有指定绝对路径,那么Windows就会按照特定的顺序去查找DLL,因此,黑客如果能够优先将DLL置于有效目录,就能够欺骗系统加载恶意DLL,实现DLL劫持。
本次劫持微信DLL原理
可以看到在微信正常运行时会直接调用dbghepl.dll
,在被dll劫持后会先调用dbghepl.dll
(恶意dll)然后再进入dbgheplOrg.dll
保证程序功能正常,但在其中dbghepl.dll
(恶意dll)被调用时,会加载我们的恶意代码。
0x02 DLL选择
首先下载安装最新版微信并运行,使用Process Monitor查看微信运行后调用的DLL情况。
- Process Monitor工具下载地址:https://learn.microsoft.com/zh-cn/sysinternals/downloads/procmon
这里我们需要将图示红框中的功能关闭,它们分别是注册表监控、网络监控、进程线程监控,我们只需要监控文件系统。
接下来我们需要筛选出微信程序的文件监控,在Filter中选择Filtel..,创建如下规则:
添加并应用规则后,我们可以更直观地观察微信程序调用DLL的情况。存在劫持漏洞的DLL一般存在以下几个特征:
- 不在注册表项HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs中
- 先从程序当前目录调用,并在搜索不到后进入系统目录调用
打开微信登录界面后,这里发现有几个DLL符合特征,我们选择dbghelp.dll
进行测试:
观察导入的DLL,类似kernel32.dll、user32.dll等受系统保护的重要DLL,劫持难度比较大,所以,我们选择dbghelp.dll
。至于,判断是不是受系统保护的DLL,可以查看注册表里面的键值,里面的DLL都是系统保护的,加载路径固定。
可以看到dbghelp.dll
并不存在系统保护的注册表项中
事实上,对于在可能存在劫持漏洞DLL的查找上面已经有相关的懒人工具,如DLL Hijacking Auditor、rattler、DLLHijack_Detecter等等,但相应的存在一定的误报率和运行问题。
0x03 劫持DLL制作
编写一个劫持DLL,需要两个步骤:
- 查看被劫持DLL的导出函数表
- 编写实现劫持DLL向原DLL的函数转发,并在过程中加入你的恶意代码
这对不熟悉编程技术的安全从业者来说是一个复杂的过程,但我们可以使用AheadLib或DLL_Hijacker.py这两款工具来生成相应的cpp代码,只要简单加入我们的劫持代码并重新编译出DLL即可。
工具下载地址:
- AheadLib:https://www.baidu.com/
- DLL_Hijacker:https://github.com/coca1ne/DLL_Hijacker
生成cpp代码
这里我们使用AheadLib工具成对应的cpp代码,点击生成得到得到dbghelp.cpp
制作DLL
首先通过cs生成一个payload
选择C和一个监听器
会生成一个payload.c
文件
文件内容
接下来我们在VS2019中新建项目,选择动态链接库(DLL),其他选默认就i好
用刚才生成的dbghelp.cpp
内容,覆盖掉dllmain.cpp文件,并且添加#include "pch.h"
然后在文件底部入口函数中添加代码
unsigned char buf[] = "你的buf";
void* exec = VirtualAlloc(0, sizeof(buf), MEM_COMMIT,PAGE_EXECUTE_READWRITE);
//利用win32内存分配函数分配内存,用PAGE_EXECUTE_READWRITE设置内存也属性为读写
memcpy(exec, buf, sizeof(buf));//分配好内存之后,将buf内容拷贝到内存中
CreateThread(0, 0, LPTHREAD_START_ROUTINE(exec),0,0,0); //创建shellcode线程,将buf的修改为线程类型
//前两个参数默认为0就行,然后给可执行内存的地址,因为目前只是地址将其转换为线程函数,它没有参数,所以其它的给0
选择Release模式,然后生成
将原来的dbghelp.dll
重命名dbghelpOrg.dll
,再将刚生成的Dll1.dll
重命名dbghelp.dll
再放到微信安装目录中
打开微信,成功上线cs
如果需要权限维持,则需要把dbghelp.dll
和dbghelpOrg.dll
文件放到目标机器中,最好是做完免杀后