关于bypassuac的探究
字数 1954 2025-08-09 13:33:40
Bypass UAC 技术探究与实现
1. UAC 基础知识
1.1 UAC 概述
用户帐户控制 (User Account Control) 是 Windows Vista 及更高版本操作系统中的核心安全功能,主要作用:
- 阻止恶意程序损坏系统
- 帮助组织部署更易管理的平台
- 应用程序和任务默认在非管理员帐户的安全上下文中运行
- 阻止未经授权应用程序的自动安装
- 防止无意中对系统设置进行更改
1.2 UAC 授权等级
通过组策略编辑器 (gpedit.msc) 可以配置 UAC 行为:
- 计算机配置 → Windows 设置 → 安全设置 → 本地策略 → 安全选项
- 找到"用户帐户控制: 管理员批准模式中管理员的提升权限提示的行为"
可配置选项:
- 不提示直接提升:关闭 UAC
- 在安全桌面上提示凭据
- 在安全桌面上同意提示
- 提示凭据
- 同意提示
- 非 Windows 二进制文件的同意提示(默认设置)
1.3 权限提升机制
- 程序只能在运行前要求提权
- 已运行的进程无法再申请提权
- 权限提升仅对此次进程有效
- 提升权限的两种方式:
- 自动提权请求(程序启动时申请)
- 手动提权请求("以管理员身份运行")
2. 程序提权配置
2.1 程序清单文件 (manifest)
在 Visual Studio 中,通过 manifest 文件配置应用程序权限级别:
<requestedExecutionLevel
level="asInvoker"
uiAccess="false"/>
可选权限级别:
- asInvoker:默认权限
- highestAvailable:最高权限
- requireAdministrator:必须是管理员权限
2.2 白名单程序
系统中有一些程序具有 autoElevate 属性为 True,会静默提升权限:
特征:
- manifest 中 autoElevate 属性为 true
- 运行时不弹出 UAC 弹窗
- 从注册表查询 Shell\Open\command 键值对
3. 寻找可用的 UAC 白名单程序
3.1 自动筛选脚本
使用 Python 脚本扫描 system32 目录下的可执行文件:
import os
from subprocess import *
path = 'c:\windows\system32'
files = os.listdir(path)
def GetFileList(path, fileList):
newDir = path
if os.path.isfile(path):
if path[-4:] == '.exe':
fileList.append(path)
elif os.path.isdir(path):
try:
for s in os.listdir(path):
newDir=os.path.join(path,s)
GetFileList(newDir, fileList)
except Exception as e:
pass
return fileList
files = GetFileList(path, [])
for eachFile in files:
if eachFile[-4:] == '.exe':
command = r'.\sigcheck64.exe -m {} | findstr auto'.format(eachFile)
p1 = Popen(command, shell=True, stdin=PIPE, stdout=PIPE)
if '<autoElevate>true</autoElevate>' in p1.stdout.read().decode('gb2312'):
copy_command = r'copy {} .\success'.format(eachFile)
Popen(copy_command, shell=True, stdin=PIPE, stdout=PIPE)
print('[+] {}'.format(eachFile))
with open('success.txt', 'at') as f:
f.writelines('{}\n'.format(eachFile))
3.2 筛选结果
筛选出的白名单程序(部分):
- ComputerDefaults.exe
- fodhelper.exe
- eventvwr.exe
- slui.exe
- msconfig.exe
- Taskmgr.exe
- wusa.exe
- 等40多个系统程序
4. UAC 绕过技术实现
4.1 技术原理
利用 ComputerDefaults.exe 的自动提权特性:
-
ComputerDefaults.exe 运行时查询注册表:
- HKCU\Software\Classes\ms-settings\Shell\Open\command
- HKCU\Software\Classes\ms-settings\Shell\Open\command\DelegateExecute
-
如果这两个键存在,则执行 command 指向的程序
-
由于 ComputerDefaults.exe 具有自动提权特性,其启动的程序也会继承高权限
4.2 关键注册表操作
-
创建注册表项:
RegCreateKeyExA( HKEY hKey, LPCSTR lpSubKey, DWORD Reserved, LPSTR lpClass, DWORD dwOptions, REGSAM samDesired, const LPSECURITY_ATTRIBUTES lpSecurityAttributes, PHKEY phkResult, LPDWORD lpdwDisposition ); -
设置注册表值:
RegSetValueExA( HKEY hKey, LPCSTR lpValueName, DWORD Reserved, DWORD dwType, const BYTE *lpData, DWORD cbData ); -
删除注册表项(用于清理痕迹):
RegDeleteTreeA( HKEY hKey, LPCSTR lpSubKey );
4.3 实现步骤
-
创建注册表路径:
HKCU\Software\Classes\ms-settings\Shell\Open\command -
设置 DelegateExecute 键值
-
设置 command 默认值为恶意程序路径
-
启动 ComputerDefaults.exe
-
恶意程序以高权限运行
-
删除创建的注册表项
5. 防御检测与绕过
5.1 杀软检测情况
-
Windows Defender:
- 直接修改注册表的操作通常不会被拦截
- 可以正常绕过 UAC
-
360安全卫士:
- 直接执行免杀后的程序可以绕过
- 注入 shellcode 到其他程序的方式无法绕过
5.2 注意事项
-
注入 shellcode 的方式无法绕过 UAC,因为注册表指向的是被注入的程序
-
直接修改注册表的方式较为敏感,但多数杀软不会拦截
-
建议使用免杀技术处理最终执行的 payload
6. 扩展思考
-
其他白名单程序:
- 除 ComputerDefaults.exe 外,还有多个系统程序可用
- 每个程序的注册表查询路径可能不同
-
防御措施:
- 监控敏感注册表位置的修改
- 限制高权限程序的子进程创建
- 启用增强的 UAC 设置
-
检测方法:
- 检查不常见的程序启动高权限进程
- 监控注册表中 ms-settings 等关键路径的修改
7. 总结
Bypass UAC 技术利用了 Windows 系统设计中的特性,通过合法的自动提权程序间接获取高权限。这种技术具有较高的隐蔽性,因为:
- 使用的是系统自带的白名单程序
- 注册表修改操作本身是合法的
- 最终的执行看起来像是系统行为
防御方需要从多个层面进行防护,包括但不限于注册表监控、进程行为分析和权限使用审计。