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

    未经允许,禁止转载

  • 相关阅读:
    How to function call using 'this' inside forEach loop
    jquery.validate.unobtrusive not working with dynamic injected elements
    Difference between jQuery.extend and jQuery.fn.extend?
    Methods, Computed, and Watchers in Vue.js
    Caution using watchers for objects in Vue
    How to Watch Deep Data Structures in Vue (Arrays and Objects)
    Page: DOMContentLoaded, load, beforeunload, unload
    linux bridge
    linux bridge
    EVE-NG网卡桥接
  • 原文地址:https://www.cnblogs.com/lcxblogs/p/14505229.html
Copyright © 2011-2022 走看看