zoukankan      html  css  js  c++  java
  • DLL劫持漏洞

    写文章的契机还是看沙雕群友挖了十多个DLL劫持的漏洞交CNVD上去了。。。

    就想起来搜集整理一下这部分

    0x01 前言

    DLL(Dynamic Link Library)文件为动态链接库文件,又称"应用程序拓展",是软件文件类型

    在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL文件,放置于系统中。当我们执行某一个程序时,相应的DLL文件就会被调用。一个应用程序可使用多个DLL文件,一个DLL文件也可能被不同的应用程序使用,这样的DLL文件被称为共享DLL文件

    如果在进程尝试加载一个DLL时没有指定DLL的绝对路径,那么Windows会尝试去按照顺序搜索这些特定目录时下查找这个DLL,只要攻击者能够将恶意的DLL放在优先于正常DLL所在的目录,就能够欺骗系统优先加载恶意DLL,来实现"劫持"

    0x02 原理

    Windows xp sp2之前

    Windows查找DLL的目录以及对应的顺序:

    1. 进程对应的应用程序所在目录;

    2. 当前目录(Current Directory);

    3. 系统目录(通过 GetSystemDirectory 获取);

    4. 16位系统目录;

    5. Windows目录(通过 GetWindowsDirectory 获取);

    6. PATH环境变量中的各个目录;

    例如:对于文件系统,如doc文档打开会被应用程序office打开,而office运行的时候会加载系统的一个dll文件,如果我们将用恶意的dll来替换系统的dll文件,就是将DLL和doc文档放在一起,运行的时候就会在当前目录中找到DLL,从而优先系统目录下的DLL而被执行。

    Windows xp sp2之后

    Windows查找DLL的目录以及对应的顺序(SafeDllSearchMode 默认会被开启):

    默认注册表为:HKEY_LOCAL_MACHINESystemCurrentControlSetControlSession ManagerSafeDllSearchMode,其键值为1

    1. 进程对应的应用程序所在目录(可理解为程序安装目录比如C:ProgramFilesuTorrent)

    2. 系统目录(即%windir%system32);

    3. 16位系统目录(即%windir%system);

    4. Windows目录(即%windir%);

    5. 当前目录(运行的某个文件所在目录,比如C:Documents and SettingsAdministratorDesktop est);

    6. PATH环境变量中的各个目录;

    Windows7 以上版本

    系统没有了SafeDllSearchMode 而采用KnownDLLs,那么凡是此项下的DLL文件就会被禁止从exe自身所在的目录下调用,而只能从系统目录即SYSTEM32目录下调用,其注册表位置:

    HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSession ManagerKnownDLLs

    那么最终Windows2003以上以及win7以上操作系统通过“DLL路径搜索目录顺序”和“KnownDLLs注册表项”的机制来确定应用程序所要调用的DLL的路径,之后,应用程序就将DLL载入了自己的内存空间,执行相应的函数功能。

    • 默认情况下,如果软件安装在c盘根目录,而不是c:Program Files,那经过身份验证的用户具有该目录的写权限,另外,perl,python,ruby等软件通常都添加到path变量中。那攻击者可以在当前目录中编写恶意DLL,只要重新运行exe程序就会中招。
    • SafeDllSearchMode + KnownDLLs二者结合可用来防范dll劫持,但是如果调用"不常见"的dll,也就是并未出现在KnownDLLs的列表中,那么无论SafeDllSearchMode是否开启,dll搜索的第一顺序均为程序的当前目录,这里就可能存在一个DLL劫持漏洞(在程序同级目录下预先放置一个同名dll,在进程启动的过程中会优先加载,实现劫持)

    综上,产生DLL劫持的条件

    1.利用的DLL不在'HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSession ManagerKnownDLLs'注册表中

    2.其dll是EXE程序首先加载的DLL,而不是依赖其他DLL加载的

    3.DLL被加载进内存中

    0x03 查找&&检测

    可以利用进程查看工具:ProcessExplorer(下载地址:https://docs.microsoft.com/zh-cn/sysinternals/downloads/process-explorer)、ProcessMonitor(下载地址:https://docs.microsoft.com/zh-cn/sysinternals/downloads/procmon)或者火绒剑来查看 应用程序加载的dll

    如果某程序的进程调用了注册表KnownDLLs中不存在的dll,就可能存在dll劫持

    我说的属于人工检测

    推荐常见的几种自动检测工具,检测可能利用dll劫持的文件:

    1.Rattler

    下载链接:https://github.com/sensepost/rattler/releases

    2.dll_hijack_detect

    下载链接:https://github.com/adamkramer/dll_hijack_detect/releases

    3.ChkDllHijack

    下载链接:https://github.com/anhkgg/anhkgg-tools

    0x04 利用

    可以用msf生成的dll木马放入软件根目录,替换可能存在dll劫持的文件

    也可以使用dll注入工具把dll木马注入到程序的其他进程中,进行劫持

    ( dll注入工具:InjectProc 下载链接:https://github.com/secrary/InjectProc/releases)

    还可以利用msf、cs生成shellcode,利用dll注入工具把shellcode生成dll文件,再利用PE工具把dll导入exe......甚至可以用NSIS打包做新的exe程序进行钓鱼

     未完待续。。。

    参考文章:https://www.cnblogs.com/backlion/p/7472021.html

    https://www.cnblogs.com/miruier/p/13893585.html

    https://mp.weixin.qq.com/s/rA7YYRuQpkyU6NQNCZCNnA

     分享几篇有意思的文章:https://www.freebuf.com/articles/system/241946.html

    https://www.cnblogs.com/swyft/articles/5580342.html

    https://www.freebuf.com/articles/system/243791.html

    未经允许,禁止转载

  • 相关阅读:
    IE9不能在线打开InfoPath表单的解决办法
    在Word中使用Quick Parts功能
    .NET WinForm程序在Windows7下实现玻璃效果和任务栏进度条效果
    如何对已经发布过的InfoPath模板进行修改
    .NET WinForm中给DataGridView自定义ToolTip并设置ToolTip的样式
    有关SharePoint Client Object应用的笔记
    解决VS 2010中编译程序时弹出"Type universe cannot resolve assembly"的错误
    SharePoint客户端对象模型"(400) Bad Request"错误
    C# Method Attribute and Reflection
    .NET WinForm下一个支持更新ProgressBar进度的DataGridView导出数据到Excel的类
  • 原文地址:https://www.cnblogs.com/lcxblogs/p/14505229.html
Copyright © 2011-2022 走看看