权限提升 T1548.002 绕过UAC

2020-08-07 9,371

1. 什么是 UAC


用户帐户控制 (UAC) 是 Windows Vista 和 Windows Server 2008 开始引入的一种访问控制功能。借助 UAC,应用和任务将始终在非管理员帐户的安全上下文中运行,除非管理员专门授予管理员级别的访问系统权限。 UAC 可阻止自动安装未经授权的应用并防止意外更改系统设置。

我们在运行非微软官方的软件时,即使我们的账号是属于本地管理员组的,也会以普通用户的权限来运行软件。当软件需要更改系统配置或者修改系统关键位置时,往往需要提升自己的权限来执行这些操作,此时UAC就会提醒用户“你要请允许此应用对你的设备进行更改吗?” 。一但用户点击了“是”, 就会提升该软件的权限成管理员权限,接着该软件就可以修改关键的系统配置和路径了。


2. 为什么要绕过 UAC ?

在引入 UAC 后,即使我们控制的账号是属于本地管理员组的,也会以普通用户的权限来运行软件。但我们的很多操作是需要管理员权限的,如上一篇文章中的获取访问 
token 权限提升 T1134 Windows 令牌窃取及防御

这里可能会有个疑问,在获取 token 的文章中,我们不是可以在 cmd 上面以管理员身份来运行,然后在 UAC 窗口点“是”来获取管理员权限的 cmd 吗?为什么还要绕过 UAC ?

这是因为,我们获取主机的权限时,一般只是得到一个执行命令的 shell,是无法点击 UAC 窗口来同意提升权限的,所以我们这个 shell ,只是一个普通权限的 shell ,很多操作都做不了。

3. 如何绕过 UAC ?

在介绍绕过 UAC 的原理前,需要注意的是,Windows10 通过标记其完整性级别来保护流程。 完整性级别是信任指标。 "高" 完整性应用程序是执行修改系统数据(如磁盘分区应用程序)的任务的应用程序,而 "低" 完整性应用程序可执行可能会危害操作系统的任务,例如 Web 浏览器。 具有较低完整性级别的应用无法修改具有较高完整性级别的应用程序中的数据。 当标准用户尝试运行需要管理员访问令牌的应用时,UAC 要求用户提供有效的管理员凭据。

这里的高完整性程序,一般是系统的关键程序(如在 c:windowssystem32 目录中的微软签名的程序),这些程序是受信任的,在运行的时候会自动提升权限而不需要在 UAC 窗口中确认。绕过 UAC 的技术就是利用了这些自动提升权限的程序。

注意,要绕过 UAC,必须是该用户属于管理员组。

在下面的 github 项目上比较完整地列出了绕过 UAC 的方式
https://github.com/hfiref0x/UACME
这些技术大致可以分为两类:
  1. 注册表劫持。
  2. dll 劫持。

注册表劫持

注册表一般用来保存一些系统配置,当程序运行时,会读取注册表中的配置来运行。如 Windows 启动项就是保存在注册表中的,当开机时会读取注册表中的启动项来决定启动哪些程序。运行 regedit 可以查看注册表。


注册表劫持的原理是一些高完整性程序会读取注册表中的内容来作为命令执行,而这些内容是普通权限的程序可以修改的,因此只要把这些注册表的内容修改成恶意程序的路径,恶意程序就可以被高完整性程序执行,并且获得高完整性程序的管理员权限。常用的被劫持程序是 eventvwr.exe、mmc.exe 和 fodhelper.exe (windows 10)

通常 HKEY_CURRENT_USER (缩写是HKCU)中的注册表项是当前用户不需要管理员权限也可以修改的(上图箭头的注册表项),这就给注册表劫持提供了机会。

寻找注册表劫持的一般思路如下:
1. 通过使用SysInternals工具 sigcheck 
(https://docs.microsoft.com/en-us/sysinternals/downloads/sigcheck)查看哪些程序可以自动提升权限。
2. 通过 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 。


由于eventvwr.exe是先读取 
HKCUSoftwareClassesmscfileshellopencommand ,发现不存在,然后才读取 HKCRmscfileshellopencommand 中的内容,并且这两个注册表项名称比较相似,我们可以猜测 eventvwr.exe 在HKCU 中的 command 键存在时,会先读取该键的值来执行。而 HKCU 是当前用户可以修改的 ,如果我们修改成恶意程序的路径,就有可能导致  eventvwr.exe 执行我们的程序,并且继承  eventvwr.exe 的管理员权限。

下面先登录之前搭建的 windows 7 虚拟机,输入 .admin (登录本机) 和密码


打开 cmd , 查看 admin 账号是否属于本地管理员
net localgroup administrators

发现 admin 账号属于本地管理员,但现在的 cmd 窗口是属于普通权限的,无法对系统文件进行修改,如向 c:windowssystem32 目录添加文件,所以我们要绕过 UAC 提升权限


通过下面命令添加注册表,并执行 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

这是在 windows 7 中通过劫持注册表绕过 UAC 的方法。该方法在 Windows 10 RS2 (15031) 后的版本失效了。

这里可以使用 Windows 10 中的 fodhelper.exe,该程序也是受信任的程序, 通过下面命令添加注册表,可以劫持 fodhelper.exe 运行恶意程序。
reg.exe add hkcusoftwareclassesms-settingsshellopencommand /ve /d "c:windowssystem32cmd.exe" /f
reg.exe add hkcusoftwareclassesms-settingsshellopencommand /v "DelegateExecute" /f
fodhelper.exe

绕过后 UAC ,清除注册表
reg.exe delete hkcusoftwareclassesms-settings /f >nul 2>&1
这里推荐使用修改注册绕过 UAC 的方法,因为不需要把文件上传到目标主机上。

dll 劫持

dll 劫持是也是绕过 UAC 常用的方法,在 UACME 项目中很多绕过方法都是使用 dll 劫持。dll 劫持也是一个比较大的主题。

一般操作如下,假设受信任的程序 c:windowssystem32testtest.exe 会加载 c:windowssystem32test.dll (不在 KnowsDLLS里面),如果把一个恶意的 dll 文件放到受信任的程序同一目录c:windowssystem32test 上,并且命名为 test.dll, 程序就会优先加载当前目录下的 test.dll 文件(我们的恶意 dll),因此原本要加载的 c:windowssystem32test.dll 文件就被劫持了。

通过这个思路,可以让受信任的程序加载恶意 dll 来执行 dll 中的代码,从获取管理员权限。

这里还有一个问题,受信任的程序存放的目录一般是系统关键路径,是需要管理员权限才能修改的,我们只有普通权限,是无法把 dll 文件复制到那里的。

这时要用到一个 COM 对象 IFileOperation ,这是一个自动提升权限的 COM 对象。COM 对象可以理解为一个接口,可以通过调用它来实现一些操作。该COM对象包含许多有用的方法,例如文件系统对象(文件和文件夹)的复制/移动/重命名/删除。

COM对象依赖于进程状态API(PSAPI)以标识它们在哪个进程中运行。PSAPI会解析进程 PEB 来获取当前进程的信息,但是攻击者可以获取自己进程的句柄并覆盖PEB来欺骗PSAPI,当 IFileOperation 对象判断当前进程是可信进程时,就会提升权限来运行。

这个操作有点复杂,大致过程是:恶意程序修改自身的 PEB 信息,伪装成 explorer.exe 可信程序,当调用 IFileOperation 对象复制 dll 到可信路径时, IFileOperation 对象认为恶意程序就是可信程序,就会自动提升权限,把 dll 复制到可信目录。

这里有具体的实现方法:
https://github.com/FuzzySecurity/PowerShell-Suite/blob/master/Bypass-UAC/Bypass-UAC.ps1


以 sysprep.exe 的 dll 劫持为例

把项目 clone 下来:

git clone  
cd PowerShell-Suite/Bypass-UAC
powershell -exec bypass
Import-Module .Bypass-UAC.ps1
Bypass-UAC -Method UacMethodSysprep

成功弹出具有管理员的权限的 powershell 窗口

我们打开 C:WindowsSystem32sysprep 目录,一个新的 dll 已经被复制到该目录下了,每次运行 sysprep.exe 都会加载该 dll


绕过 UAC 的方法有很多,这里只简单介绍了下常用的方式,更多方式可以查看 https://github.com/hfiref0x/UACME 项目,上面目前有 64 种绕过方式,把该项目下载下来,使用 vs 2019 编译后就可以使用所有的绕过方式了。

如要使用 fodhelper.exe 绕过 UAC 
Akagi64.exe 33 cmd


Bypass UAC 防御

  •   在本地安全策略-》安全选项-》用户账户控制:管理员批准模式中管理员的提升权限提示的行为设置成同意提示。这样即使是更改系统配置,也会出现 UAC 确认窗口,这个设置可以防御注册表劫持。

  •  把无关用户从本地管理员组中删除。
  •  将Windows更新到最新版本和补丁程序级别,以利用针对UAC绕过的最新保护措施。

  •  安装杀毒软件,对特定位置注册表的操作及恶意 dll 的落地进行查杀。







往期文章
权限提升 T1134 Windows 令牌窃取及防御

本文作者:timeshatter

本文为安全脉搏专栏作者发布,转载请注明:https://www.secpulse.com/archives/137074.html

Tags:
评论  (0)
快来写下你的想法吧!

timeshatter

文章数:13 积分: 130

安全问答社区

安全问答社区

脉搏官方公众号

脉搏公众号