前言:

一般在内网渗透过程中,要对一些文件实行免杀,使用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,在进程启动的过程中会优先加载,实现劫持。

一般来说应用程序可以通过以下方式控制一个dll的加载路径:使用全路径加载、使用DLL重定向、使用manifest文件。如果上述三种方式均未指定,系统查找DLL的顺序将按照本部分描述的顺序进行。

然后这里有两个前提条件,对以下两种情况的DLL,程序不会查找,而是直接引用

  1. 对于已经加载到内存中的同名DLL,系统使用已经加载的DLL,并且忽略待加载DLL的路径。(注意对某个进程而言,系统已经加载的DLL一定是唯一的存在于某个目录下。)
  2. 如果该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劫持漏洞是比较直接的方法。
image

rattle

github链接:https://github.com/sensepost/rattle
image

Dll Hijack Auditor

下载地址:http://securityxploded.com/getsoftware_direct.php?id=7777
image

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

最后修改:2020 年 05 月 22 日 06 : 12 PM
如果觉得我的文章对你有用,请随意赞赏