DLL劫持杂记

DLL劫持杂记

原理

DLL可以看作包含代码和数据的库,可由多个程序同时使用,优化windows内存的重复使用。

windows程序在调用DLL时存在加载顺序,通过控制其中一级目录,把恶意DLL放在正常DLL存在的目录之前,使程序先加载恶意DLL,达到劫持目的。

windows搜索DLL顺序

1.包含可执行文件的目录。
2.Windows的系统目录,该目录可以通过GetSystemDirectory得到,一般为System32目录,若为32位程序跑在64位系统下,则为SysWOW64目录。
3.16位的系统目录,即Windows目录中的System目录。
4.Windows目录,该目录可以通过GetWindowsDirectory得到。
5.进程的当前目录。
6.PATH环境变量中所列出的目录。

win7以上设置了KnownDLLs,禁止表项内DLL从exe所在目录调用,只能从系统目录即SYSTEM32目录下调用,劫持时需要避免这些DLL

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs

一些方法可以改变加载程序的搜索顺序

1.SetDllDirectory 函数。如果传入一个有效路径,那么它将被插入在默认顺序的 1 与 2 之间。
2.HKEY_LOCAL_MACHINES\SYSTEM\CurrentControlSet\Control\Session Manager 下的 SafeDllSearchMode 键值。
3.调用 LoadLibraryEx 函数时使用 LOAD_WITH_ALTERED_SEARCH_PATH 等标志。

所谓白加黑,白的程序(带签名白名单软件)加上黑的代码(shellcode),躲过免杀软件检测的一种手段

劫持时最好选择对于白应用不必要的DLL,即缺失该DLL白应用也能打开

劫持的几种形式

1.直接将恶意dll暴力替换掉正常dll,软件正常功能会受影响
2.将恶意dll作为中间人,转发调用正常dll的导出函数,同时加入额外的恶意操作
3.利用加载顺序的机制,让恶意dll先于正常dll加载
4.利用软件本身缺失的dll加载恶意dll
5.更改环境变量或是.exe.manifest/.exe.local文件实现dll重定向

https://www.wangan.com/p/7fy7f39808b0ee04#KnowDLLs%E6%B3%A8%E5%86%8C%E8%A1%A8%E9%A1%B9

定位目标DLL侧重关注用到loadlibrary的 dll,原因是因为如果该 dll 的调用栈中存在有 LoadLibrary(Ex),说明这个 DLL 是被进程所动态加载的。在这种利用场景下,伪造的 DLL 文件不需要存在任何导出函数即可被成功加载,即使加载后进程内部出错,也是在 DLL 被成功加载之后的事情

白名单exe以及dll

exe

Msbuild.exe
Installutil.exe
Regasm.exe
Regsvcs.exe
Mshta.exe
Cmstp.exe
Msiexec.exe

DLL

url.dll
zipfldr.dll
Ftp.exe
notepad++   NppShell_06.dll、libcurl.dll Msimg32.dll
EasyConnectInstaller    fkdll.dll
印象笔记    EvernoteThumbnailer.exe     libcef.dll     encrashrep.dll 

DLL劫持demo

来源:https://bbs.kanxue.com/thread-263668.htm

不让用fopen

image-20230124111853483

在代码加一条忽略即可

image-20230124111943740

VS2022编译的exe复制到虚拟机会提示缺少必要的DLL,实际操作可选择vs2015之前的版本进行编译,或许可解决(未验证),这里安装visualC++组件未解决

image-20230124112925138

本机验证:火绒即杀

替换正常dll

复现:https://www.freebuf.com/articles/system/333690.html

定位可劫持目标:该DLL位于用户目录下,有时可以通过把exe复制出来提示缺少某个dll来确定

image-20230124193031733

libcurl.dll会调用这俩API,可劫持可能性存在

image-20230124193424714

导出源码放到vs2022修改编译

遇到的问题:

image-20230123211939926

改成Context.Rip,eip编译x86目标

image-20230123212134869

对于这段代码,把dll入口源文件dllmain.cpp后缀改为.c

工具

扫描可劫持DLL

https://github.com/sensepost/rattler/

image-20230124203226327

使用过程中会不断运行exe,尽量避免gui应用

发表评论