前言:
一般在内网渗透过程中,要对一些文件实行免杀,使用dll劫持就可以初步达成免杀效果,比如杀软对某些厂商的软件是实行白名单的。另外dll劫持还可以实现提权的效果,比如notepad++ v6.0即可实现提权效果。
DLL文件
动态链接库英文为DLL,DLL是一个包含可由多个程序,同时使用的代码和数据的库。在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL文件,放置于系统中。当我们执行某一个程序时,相应的DLL文件就会被调用。
通过使用 DLL,程序可以实现模块化,由相对独立的组件组成。例如,一个计帐程序可以按模块来销售。可以在运行时将各个模块加载到主程序中(如果安装了相应模块)。因为模块是彼此独立的,所以程序的加载速度更快,而且模块只在相应的功能被请求时才加载。
DLL劫持
dll劫持是通过改变dll文件的加载顺序,让我们恶意的dll在正常的dll前面加载,就可以进行劫持操作。
关于dll文件加载的顺序官方文档:https://docs.microsoft.com/zh-cn/windows/win32/dlls/dynamic-link-library-search-order
windows查找dll目录以及对应的顺序:
windows xp sp2之前(无SafeDllSearchMode)
- 进程对应的应用程序所在目录
- 当前目录
- 系统目录
- 16位系统目录
- windows目录
- PATH环境变量中的各个目录
windows xp sp2之后
- 进程对应的应用程序所在目录(可理解为程序安装目录比如C:ProgramFilesuTorrent)
- 系统目录(即%windir%system32)
- 16位系统目录(即%windir%system)
- Windows目录(即%windir%)
- 当前目录(运行的某个文件所在目录,比如C:Documents and SettingsAdministratorDesktoptest)
- PATH环境变量中的各个目录
默认的注册表为:HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SafeDllSearchMode
从WindowsXPSP2开始,SafeDllSearchMode默认开启,SafeDllSearchMode的存在是为了阻止在XP时代存在的DLL劫持漏洞
强制关闭SafeDllSearchMode的方法:HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SafeDllSearchMode
值改为1.
windows 7以上版本
- 系统没有了SafeDllSearchMode而采用KnownDLLs,凡是此项下的DLL文件就会被禁止从exe自身所在的目录下调用,而只能从系统目录即SYSTEM32目录下调用,其注册表位置:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs
- 如果调用的dll“不常见”,也就是并未出现在KnownDLLs的列表中,dll搜索的第一顺序均为程序的当前目录,这里就存在一个DLL劫持漏洞:在程序同级目录下预先放置一个同名的dll,在进程启动的过程中会优先加载,实现劫持。
- 系统没有了SafeDllSearchMode而采用KnownDLLs,凡是此项下的DLL文件就会被禁止从exe自身所在的目录下调用,而只能从系统目录即SYSTEM32目录下调用,其注册表位置:
一般来说应用程序可以通过以下方式控制一个dll的加载路径:使用全路径加载、使用DLL重定向、使用manifest文件。如果上述三种方式均未指定,系统查找DLL的顺序将按照本部分描述的顺序进行。
然后这里有两个前提条件,对以下两种情况的DLL,程序不会查找,而是直接引用
- 对于已经加载到内存中的同名DLL,系统使用已经加载的DLL,并且忽略待加载DLL的路径。(注意对某个进程而言,系统已经加载的DLL一定是唯一的存在于某个目录下。)
- 如果该DLL存在于某个Windows版本的已知DLL列表(unkown DLL)中,系统使用已知DLL的拷贝(包括已知DLL的依赖项)。已知DLL列表可以从如下注册表项看到:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs
。
发现dll
Process Monitor
我们这里可以使用Process Monitor(进程监听器)进行分析。
通过Process Monitor查看DLL劫持漏洞是比较直接的方法。
rattle
github链接:https://github.com/sensepost/rattle
Dll Hijack Auditor
下载地址:http://securityxploded.com/getsoftware_direct.php?id=7777
dll劫持演示实例
可参考:https://payloads.online/archivers/2018-06-09/1
总之:我们只需要在已经加载的dll列表中,查找不在Knowdlls注册表中的dll,然后将恶意的dll放在程序的当前目录下即可。
参考文章:
https://patrilic.top/2019/08/23/DLL%20Hijacking/
https://www.cnblogs.com/bmjoker/p/11031238.html