如何快速识别DLL劫持漏洞

DLL劫持

DLL劫持漏洞是一个比较古老的漏洞类型。当一个Windows程序运行时,会尝试去动态加载一些所需的DLL,不同版本的操作系统会有不同的尝试加载顺序。优先级最高的都是当前安装程序路径下,还有就是如系统路径下,然后可能是当前文件路径。

DLL劫持的利用

当能够实现安装程序路径下任意文件写的话,肯定会导致DLL劫持的发生;在XP SP2之前的话,在当前进程尝试加载当前进程目录(即安装程序目录)失败之后,将尝试加载当前目录,如果当前目录存在一个同样名称的DLL,将会被加载。第二种情况是,尝试去加载一个不存在的DLL,这个主要是因为版本更新之后,有些DLL被废弃或者其他原因,但是加载部分并没有去除。
因此这部分利用就是将程序的漏洞,导致一直尝试加载失败,直至当前路径。场景为:若Firefox存在DLL劫持漏洞,那么让用户下载一个HTML文件以及一个恶意的DLL,这两个文件处于同一个路径,那么打开HTML文件将导致恶意DLL的执行。

DLL搜索顺序

  1. 如果已经加载到内存中,将不再进行搜索
  2. 如果DLL在已知DLL List中,将copy一份已知DLL,也不进行搜索
    已知DLL在注册表HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs.

搜索顺序将依赖于 SafeDllSearchMode 是否打开。
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SafeDllSearchMode
为0表示disable,1表示enable

1
2
3
4
Safe DLL search mode is enabled by default starting with Windows XP with Service Pack 2 (SP2).
Safe DLL search mode is enabled by default. To disable this feature, create the
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SafeDllSearchMode
registry value and set it to 0.

即能够表示在XP SP2中如果没有该表项,表示默认开启状态

漏洞缓解

SetDllDirectory API,当给这个API传递一个空字符串时,将可以将当前目录从DLL搜索顺序中排除掉。

识别流程

使用环境&工具

1
2
Win 7 32 bit Sp1
process monitor

因为process monitor能够查看所有进程在尝试加载的文件以及顺序,因此设置好规则就能够判断是否存在DLL劫持漏洞。
现假设准备检测Firefox的安装程序是否存在DLL劫持。
Firefox打开后,进程中包含”Firefox”关键字,因此规则为:
Firefox
Firefox在桌面上,我们需要判断是否在尝试加载当前目录的DLL,因此设置路径为当前目录
设置当前路径
然后过滤掉加载成功的DLL
过滤成功DLL
保存之后,然后打开Firefox安装程序,我们发现尝试在桌面加载的DLL程序,此时只需要构造一个DLL相同名字的恶意DLL即可实现恶意DLL执行。
尝试加载的DLL
构造恶意DLL
点击实现利用

参考

https://msdn.microsoft.com/en-us/library/windows/desktop/ms682586(v=vs.85).aspx
http://www.programlife.net/a-deep-insight-into-dll-hijacking-vulnerability.html
http://www.freebuf.com/articles/78807.html
https://security.tencent.com/index.php/blog/msg/20

CVE-2016-1247 nginx提权环境搭建 PoDoFo 0.9.5 NULL pointer dereference
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×