挖掘白加黑DLL劫持漏洞

Tips:

白程序+黑DLL

黑DLL需要优先正常DLL目录,并且DLL不在WIndows KnowDLLs列表中

1
reg query "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs"

image-20240221102021774

DLL劫持分为两种:

1.劫持不存在的DLL

2.劫持已存在的DLL

准备测试DLL

准备一个弹计算器的DLL 运行库MT编译x64和x86版本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include "pch.h"
#include <stdlib.h>

BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
//DLL进程装载
case DLL_PROCESS_ATTACH:
system("calc");
//DLL线程装载
case DLL_THREAD_ATTACH:
//DLL线程卸载
case DLL_THREAD_DETACH:
//DLL进程卸载
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}

劫持不存在的DLL

这种是最简单的情况

劫持程序uc.exe

利用Process Monitor工具 首先添加filter

1
2
3
Process name uc.exe
Result is NAME NOT FOUND
Path ends with .dll

image-20240221113144776

返回结果中找到iconv.dll

image-20240221113234544

其stack调用了LoadLibrary函数

LoadLibraryLoadLibraryEx一个是本地加载,一个是远程加载,如果DLL不在调用的同一目录下,就可以使用LoadLibrary(L"DLL绝对路径")加载。但是如果DLL内部又调用一个DLL,就需要使用LoadLibraryEx进行远程加载

image-20240221113404722

在iconv.dll同级目录下都是x64位的,所以替换的也是x64位dll

image-20240221113517102

替换后启动uc.exe,成功弹出计算器

image-20240221113558921

劫持已存在的DLL

还是利用Process Monitor添加filter

image-20240221150006453

1
2
3
Process name uc.exe
Result is SUCCESS
Path begins with D:\UltraCompare

image-20240221145848438

这里可以采用DLL转发方式,可以利用工具AheadLib+,但是这个工具内联了__asm在VS2022x64下不支持,只能用来生成x86的dll

image-20240221131153988

在github上找到了个好用的工具:

https://github.com/strivexjun/AheadLib-x86-x64

image-20240221151226028

点击Makefile后生成2个文件

image-20240221151340085

VS新建DLL项目导入这两个文件

image-20240221151425359

.asm文件需要设置属性

1
2
3
4
5
6
7
8
9
把 .asm 文件添加到工程一次
右键单击文件-属性-常规-
项类型:自定义生成工具
从生成中排除:否

然后复制下面命令填入
命令行: ml64 /Fo $(IntDir)%(fileName).obj /c /Cp %(fileName).asm
输出: $(IntDir)%(fileName).obj;%(Outputs)
链接对象: 是

image-20240221151535574

image-20240221151544478

之后运行库改MT,开始修改代码新增弹计算器的代码

老哥在生成的代码里加了新建线程执行,避免了白加黑CS的死锁问题

image-20240221151928771

之后又改了转发文件的代码转发到同目录的zlib1Org.dll

image-20240221152026911

因为找不到shlwapi.h文件一些API找不到标识符

在framework.h中添加#include <shlwapi.h>

image-20240221152141898

可以正常编译了,直接编译DLL

将编译好的DLL改名zlib1.dll原来的DLL改名zlib1Org.dll

image-20240221152353758

启动uc.exe 成功弹出计算器

image-20240221152458563

__END__