一文搞懂windows UAC机制逻辑及提权原理
字数 2381 2025-08-19 12:41:20

Windows UAC机制原理与Bypass提权技术深入分析

0x01 UAC机制概述

用户账户控制(UAC)是Windows的安全机制,用于限制应用程序的权限级别,防止未经授权的系统更改。

UAC判断流程

  1. ActiveX安装检查:现代Windows系统已弃用,默认返回"No"

  2. UAC滑块设置检查

    • 始终通知(最高级别):任何更改都会通知并冻结其他任务
    • 仅当程序尝试更改时通知(中高级别):不更改Windows设置时通知
    • 仅当程序尝试更改时通知(不调暗桌面)(中低级别):不冻结其他任务
    • 从不通知(最低级别):完全禁用UAC提示
  3. 安全桌面检查:决定UAC弹窗是否在灰色安全桌面显示

0x02 UAC流程逆向分析

进程创建流程

  1. 进程创建者:实际创建提权进程的是Appinfo服务(通过svchost启动),而非explorer.exe
  2. 关键函数调用链
    • windows_storage!CinvokeCreateProcessVerb::CallCreateProcess
    • AicLaunchAdminProcess (通过RPC与Appinfo服务通信)
    • RAiLaunchAdminProcess (Appinfo.dll中)

关键验证逻辑

  1. 路径检查

    • 检查文件路径是否匹配内置列表(g_Dirs, g_ExcludeWinDir, g_IncludedWinDir等)
    • System32和SysWow64目录下的文件会设置特殊标志(r15d的第21位)
  2. 自动审批检查(AiIsEXESafeToAutoApprove):

    • 检查manifest中autoElevate标志
    • 检查白名单(g_lpAutoApproveEXEList)和签名验证
    • 检查注册表设置:
      • EnableRestrictedAutoApprove (是否开启受限自动审批)
      • ValidateAdminCodeSignatures (是否要求管理员权限代码签名)
  3. consent.exe交互

    • 由Appinfo服务以挂起状态创建
    • 传递参数包含目标进程路径等信息
    • 用户确认后创建提权进程

0x03 UAC提权技术(Bypass UAC)

主要Bypass思路

  1. DLL劫持白名单进程

    • 利用IFileOperation向高权限目录写入DLL
    • 劫持白名单进程(如pkgmgr.exe)实现提权
    • 示例:UACME #23
  2. 篡改PE执行逻辑通过注册表

    • 修改低权限注册表键值
    • 利用特定程序(如fodhelper.exe)读取注册表执行命令
    • 示例:UACME #33
  3. 高权限COM组件利用

    • 利用存在任意命令执行接口的COM组件
    • 绕过COM组件调用者验证(修改PEB路径信息)
    • 示例:UACME #41 (CMSTPLUA组件)

COM组件调用验证

Windows通过以下信息验证COM调用者:

  • PEB中的_RTL_USER_PROCESS_PARAMETERSImagePathName
  • PEB中的_LDR_DATA_TABLE_ENTRYFullDllNameBaseDllName

0x04 检测与防御

检测思路

  1. 进程创建监控

    • 关注explorer.exe创建高权限进程的异常情况
    • 监控Appinfo服务创建的consent.exe进程
  2. 文件操作监控

    • 监控对System32/SysWow64目录的写入
    • 特别关注IFileOperation相关操作
  3. 注册表修改监控

    • 监控HKCU下shell\open\command等关键路径的修改
  4. COM组件调用监控

    • 监控非常规进程对高权限COM组件的调用

攻击场景

  1. 边界突破钓鱼:绕过UAC弹窗避免用户警觉
  2. 权限维持:获取管理员权限创建计划任务/服务
  3. AV对抗:关闭防火墙或杀毒软件需要管理员权限

0x05 技术验证与疑问

自动提权测试

  1. 修改manifest添加autoElevate标志
  2. 将程序放入System32目录
  3. 结果:仍会触发UAC弹窗(原因可能在于consent.exe中的额外验证)

附录:关键数据结构与函数

关键函数

  • CheckElevationEnabled - 检查UAC是否启用
  • AiIsEXESafeToAutoApprove - 检查程序是否可自动提权
  • AiLaunchConsentUI - 启动UAC确认界面
  • AipVerifyConsent - 验证consent.exe完整性

关键路径列表

  • g_Dirs - 基础路径匹配列表
  • g_ExcludeWinDir - 排除目录列表
  • g_IncludedWinDir - 包含目录列表
  • g_IncludedXmtExe - 特殊可执行文件列表
  • g_IncludedSysDir - 系统目录列表

注册表键值

  • HKLM\...\Policies\EnableRestrictedAutoApprove - 受限自动审批开关
  • HKLM\...\Policies\System\ValidateAdminCodeSignatures - 管理员代码签名验证要求

参考资源

  • UACME项目: https://github.com/hfiref0x/UACME
  • Microsoft UAC文档: https://learn.microsoft.com/zh-cn/windows/security/application-security/application-control/user-account-control/how-it-works
  • COM组件利用分析: https://3gstudent.github.io/通过COM组件IFileOperation越权复制文件
Windows UAC机制原理与Bypass提权技术深入分析 0x01 UAC机制概述 用户账户控制(UAC)是Windows的安全机制,用于限制应用程序的权限级别,防止未经授权的系统更改。 UAC判断流程 ActiveX安装检查 :现代Windows系统已弃用,默认返回"No" UAC滑块设置检查 : 始终通知(最高级别):任何更改都会通知并冻结其他任务 仅当程序尝试更改时通知(中高级别):不更改Windows设置时通知 仅当程序尝试更改时通知(不调暗桌面)(中低级别):不冻结其他任务 从不通知(最低级别):完全禁用UAC提示 安全桌面检查 :决定UAC弹窗是否在灰色安全桌面显示 0x02 UAC流程逆向分析 进程创建流程 进程创建者 :实际创建提权进程的是Appinfo服务(通过svchost启动),而非explorer.exe 关键函数调用链 : windows_storage!CinvokeCreateProcessVerb::CallCreateProcess AicLaunchAdminProcess (通过RPC与Appinfo服务通信) RAiLaunchAdminProcess (Appinfo.dll中) 关键验证逻辑 路径检查 : 检查文件路径是否匹配内置列表( g_Dirs , g_ExcludeWinDir , g_IncludedWinDir 等) System32和SysWow64目录下的文件会设置特殊标志(r15d的第21位) 自动审批检查 (AiIsEXESafeToAutoApprove): 检查manifest中 autoElevate 标志 检查白名单( g_lpAutoApproveEXEList )和签名验证 检查注册表设置: EnableRestrictedAutoApprove (是否开启受限自动审批) ValidateAdminCodeSignatures (是否要求管理员权限代码签名) consent.exe交互 : 由Appinfo服务以挂起状态创建 传递参数包含目标进程路径等信息 用户确认后创建提权进程 0x03 UAC提权技术(Bypass UAC) 主要Bypass思路 DLL劫持白名单进程 利用IFileOperation向高权限目录写入DLL 劫持白名单进程(如pkgmgr.exe)实现提权 示例:UACME #23 篡改PE执行逻辑通过注册表 修改低权限注册表键值 利用特定程序(如fodhelper.exe)读取注册表执行命令 示例:UACME #33 高权限COM组件利用 利用存在任意命令执行接口的COM组件 绕过COM组件调用者验证(修改PEB路径信息) 示例:UACME #41 (CMSTPLUA组件) COM组件调用验证 Windows通过以下信息验证COM调用者: PEB中的 _RTL_USER_PROCESS_PARAMETERS 的 ImagePathName PEB中的 _LDR_DATA_TABLE_ENTRY 的 FullDllName 和 BaseDllName 0x04 检测与防御 检测思路 进程创建监控 : 关注explorer.exe创建高权限进程的异常情况 监控Appinfo服务创建的consent.exe进程 文件操作监控 : 监控对System32/SysWow64目录的写入 特别关注IFileOperation相关操作 注册表修改监控 : 监控HKCU下shell\open\command等关键路径的修改 COM组件调用监控 : 监控非常规进程对高权限COM组件的调用 攻击场景 边界突破钓鱼 :绕过UAC弹窗避免用户警觉 权限维持 :获取管理员权限创建计划任务/服务 AV对抗 :关闭防火墙或杀毒软件需要管理员权限 0x05 技术验证与疑问 自动提权测试 修改manifest添加 autoElevate 标志 将程序放入System32目录 结果:仍会触发UAC弹窗(原因可能在于consent.exe中的额外验证) 附录:关键数据结构与函数 关键函数 CheckElevationEnabled - 检查UAC是否启用 AiIsEXESafeToAutoApprove - 检查程序是否可自动提权 AiLaunchConsentUI - 启动UAC确认界面 AipVerifyConsent - 验证consent.exe完整性 关键路径列表 g_Dirs - 基础路径匹配列表 g_ExcludeWinDir - 排除目录列表 g_IncludedWinDir - 包含目录列表 g_IncludedXmtExe - 特殊可执行文件列表 g_IncludedSysDir - 系统目录列表 注册表键值 HKLM\...\Policies\EnableRestrictedAutoApprove - 受限自动审批开关 HKLM\...\Policies\System\ValidateAdminCodeSignatures - 管理员代码签名验证要求 参考资源 UACME项目: https://github.com/hfiref0x/UACME Microsoft UAC文档: https://learn.microsoft.com/zh-cn/windows/security/application-security/application-control/user-account-control/how-it-works COM组件利用分析: https://3gstudent.github.io/通过COM组件IFileOperation越权复制文件