DLL劫持技术总结

  1. DLL的加载方式
  2. 示例
  3. 为什么可以成功劫持?
  4. 注意事项
  5. 防范DLL劫持

原本三天前想写了,因为懒。鸽了好久…

路鸣泽的脸被愤怒所占满,他的黄金瞳照亮了这片黑暗,他狂笑着,他咆哮着,他是疯子,他是君主,他是恶魔,他是被世界遗弃了的神!

DLL的加载方式

dll的加载方式有:静态加载、动态加载和延迟加载。
主要发生在动态加载和延迟加载

dll劫持是一种技术,而不是漏洞。DLL劫持之前先要了解dll的加载顺序
DLL搜索过程

  1. 程序所在路径
  2. C:\Windows\System32
  3. C:\Windows\System
  4. C:\Windows
  5. 程序所在路径
  6. 环境变量里的路径寻找

环境变量

示例

一个简单的DLL加载
正常加载

缺少DLL的整个DLL寻找过程(使用Procmon观察)

此时可以生成一个恶意的DLL放到其中的一个路径。就可以进行恶意调用

效果

为什么可以成功劫持?

msf生成的dll使用了DllEntryPoint函数

根据API搜索,得出结果

DllEntryPoint函数是进入动态链接库(DLL)的可选方法。 如果使用该函数,则在初始化和终止进程和线程时,或者在调用LoadLibrary和FreeLibrary函数时,系统会调用该函数。 DllEntryPoint是库定义的函数名称的占位符。 实际名称必须在构建时指定。

所以使用LoadLibraryA等函数进程DLL调用的时候,通过DllEntryPoint函数重新定义要执行的函数,从而实现执行恶意代码。当不使用LoadLibraryA进行DLL加载的时候(DllEntryPoint函数重新定义要执行的函数)这种方法是无效的。没有办法通过这种方法劫持,只能通过使用IDA分析DLL调用的外部函数(例如静态加载)。或者程序检查DLL的导出函数,是否有加载的函数名,如果没有。则不加载DLL,并效验DLL的md5是否一致

注意事项

DLL劫持的时候要注意以下几点(不可取)

  1. 需要重新启动
  2. 文件夹权限拒绝

以上两点是不可取的,比如将DLL放入C:\Windows\System32是不可取的。压根没权限,实战中毫无作用

而DLL可以造成提权的原因是:加载DLL使用SYSTEM权限,当DLL可成功劫持的时候即可造成权限提升
例如文章作者所述:
当一个拥有LocalSystem权限进行启动的服务,执行的进程的DLL可控。如下图所示

防范DLL劫持

如何防止DLL劫持?
使用LoadLibraryEx函数代替LoadLibraryA
程序检查DLL的导出函数,是否有加载的函数名,如果没有。则不加载DLL,并效验DLL的md5是否一致

在LoadLibraryEx里的dwFlags参数使用以下两个方式可以阻止DLL搜索的过程:
LOAD_LIBRARY_SEARCH_APPLICATION_DIR
LOAD_LIBRARY_SEARCH_SYSTEM32

LOAD_LIBRARY_SEARCH_APPLICATION_DIR只允许在程序目录进行DLL搜索(通过将程序所在目录的文件夹权限拉高防止劫持)

LOAD_LIBRARY_SEARCH_SYSTEM32只允许在C:\Windows\System32进行DLL搜索

参考链接:
https://docs.microsoft.com/en-us/windows/win32/api/libloaderapi/nf-libloaderapi-loadlibraryexa -
LoadLibraryEx API
https://itm4n.github.io/windows-dll-hijacking-clarified/?tdsourcetag=s_pctim_aiomsg - Windows DLL Hijacking (Hopefully) Clarified
https://zhuanlan.zhihu.com/p/57279354 - Windows下Dll的加载方式及错误处理


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。

文章标题:DLL劫持技术总结

本文作者:九世

发布时间:2020-04-29, 12:43:43

最后更新:2020-04-29, 13:00:11

原始链接:http://jiushill.github.io/posts/fd82243.html

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录