DLL劫持

DLL劫持

DLL劫持原理

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

原理虽然简单,但是劫持DLL的选取和编写则要有些技巧,不是所有的DLL都可以被劫持的,有些DLL是受系统保护的,譬如user32.dll等,这些是不能劫持的。在一些老的DLL劫持病毒里面一般是选取usp10.dll,lpk.dll等,原因很简单,一般的应用程序都会加载它们,而且没有被系统保护

简单总结下DLL劫持和DLL注入的区别:

DLL劫持 DLL注入
主动性 被动,等待目标运行 主动,目标必须已经在运行
是否需要跳板 不需要 需要,由第三方来帮助注入
是否容易拦截 不容易 容易
是否容易免疫 容易 不容易
DLL的编写要求 伪造真实DLL一样的导出函数表 可以按自己的流程写导出函数

DLL原理利用

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

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

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

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

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

  5. 当前目录(运行的某个文件所在目录,比如C:\Documents and Settings\Administrator\Desktop\test);

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

windows 7 以上版本

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

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs

那么最终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劫持的攻击原理和防御方案:

前文提到过一种老的DLL劫持的利用,劫持usp10.dll,lpk.dll等等。这些DLL的实际目录在system32下,病毒利用DLL的搜索排名第一的是应用程序自身所在的目录,释放同名的劫持DLL到应用程序目录下,这样应用程序启动时就会先加载了劫持DLL,达到自身目的。应用程序加载了劫持DLL之后又有两种后续的攻击方案,一种是转发调用到正常的DLL,使应用程序毫无觉察,同时秘密在后台下载更多的下载器木马等。另一种就是直接破坏造成程序无法运行,这种主要用于干掉杀软等安全软件。

通用免疫方案:

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session
Manager\KnownDLLs]在此注册表项下定义一个“已知DLL名称”,那么凡是此项下的DLL文件就会被禁止从EXE自身目录下调用,而只能从系统目录,也就是system32目录下调用。据此可以写一个简单的DLL劫持免疫器

新的DLL劫持的攻击原理和防御方案:

很多应用程序都是支持插件和扩展的,尤其是一些播放器软件,支持解码插件,第一次安装的时候可能只装了常见的一些音视频解码插件,在遇到一些特殊的音视频格式时就需要实时去网络上拖取一个解码插件下来进行解码操作,软件会首先尝试加载这个解码插件(通常是一个DLL),这个时候一些设计有缺陷的产品(譬如不是通过绝对路径加载插件)在加载DLL时就会搜索上面提到过的各个路径。一般这种情况下,恶意攻击者会在网络上提供一些用户感兴趣的视频图片之类的,用户下载压缩包解压后,其实压缩文件中包含着两个以上的文件,用户很难发现,解压后,劫持DLL和视频或者图片文件是放在同一个目录的,当然劫持DLL文件的属性是系统隐藏,之后用户双击那个视频图片之后便被DLL劫持了,这实际上是利用的DLL搜索时会搜索当前目录这个特点来进行DLL劫持的

防御方案:

暂无通用的防御方案,因为劫持的都是一些第三方的DLL,暂时只能通过下载保护之类的途径进行保护(这类攻击最终还是会转去下载更多的盗号木马或者下载器之类的,然后进行一些盗号、破坏等等的事情)。

你可能感兴趣的:(笔记)