DLL劫持技术总结
原本三天前想写了,因为懒。鸽了好久…
路鸣泽的脸被愤怒所占满,他的黄金瞳照亮了这片黑暗,他狂笑着,他咆哮着,他是疯子,他是君主,他是恶魔,他是被世界遗弃了的神!
DLL的加载方式
dll的加载方式有:静态加载、动态加载和延迟加载。
主要发生在动态加载和延迟加载
dll劫持是一种技术,而不是漏洞。DLL劫持之前先要了解dll的加载顺序
- 程序所在路径
- C:\Windows\System32
- C:\Windows\System
- C:\Windows
- 程序所在路径
- 环境变量里的路径寻找
示例
一个简单的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劫持的时候要注意以下几点(不可取)
- 需要重新启动
- 文件夹权限拒绝
以上两点是不可取的,比如将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" 转载请保留原文链接及作者。