UAC简介及基于模拟可信目录的绕过

1.什么是UAC?

UAC(User Account Control)是微软公司在Windows Vista及更高版本操作系统中采用的一种安全机制。它的主要作用是防止用户在不知情的情况下一不小心安装一些应用程序或者一不小心修改系统的一些设置。感觉作用有点像PowerShell的执行策略,都是防止部分傻白甜用户在不知情的情况下就运行了危险的应用程序或者脚本。直观上来讲UAC在我们日常使用中最明显的体现就是以下这样一个弹窗。点击这个程序就会以管理员的身份运行。 也就是说,UAC最直观的作用就是可以保护我们在不知情的情况下不让程序以管理员的身份运行。

2.为什么要绕过UAC?

以下实验在Win7下进行。首先我以管理员用户直接双击运行了一个msf的后门。然后在meterpreter会话中运行getsystem,得到的结果如下。 可以发现提权失败了。这也就是UAC起到的作用。为此我们可以使用一些自带的ByPass UAC的插件来绕过UAC使我们具有真正的管理员权限。 利用上图的插件我们就会获取到一个真正的管理员权限运行的backdoor。此时再使用getsystem我们发现,已经可以正常执行了。

3.UAC实现原理

当管理员登录到计算机时,vista以后的Windows操作系统会为该用户创建两个访问令牌:标准用户访问令牌管理员访问令牌。标准用户访问令牌包含的用户特定信息与管理员访问令牌包含的信息相同,但是已经删除管理 Windows 权限和 SID。程序也被分成了两类,一类是不执行管理任务的标准用户应用程序管理员应用程序。平常我们作为管理员登陆时使用的默认UAC模式称为管理审核模式,也就是当我们运行一个管理员应用程序时,会弹出来一个上文当中的审核窗口。UAC验证流程如下图所示:

从这张图中我们可以看到在开启UAC的条件下,想要创建一个管理员权限的进程主要有以下几条途径:

  • 1.创建该进程的父进程本身拥有管理员权限
  • 2.该进程要求提升至管理员权限,弹出提权提示框,管理员用户点击同意该进程以管理员身份运行。

当然以上说法是官方提供的思路,事实上,系统当中还有一些可执行文件,尽管明显是需要管理员权限的,但在使用的过程中却并不会弹出一个提权提示窗口等待用户同意。比如,Windows应用商店

4.UAC认证分析

经过各路神仙大佬的分析,我们知道了控制UAC认证的dll名为appinfo.dll。验证的主要过程放在了一个名为RAiLaunchAdminProcess的函数中,这个函数会将所执行文件的路径和参数作为参数进行验证。这个函数会去根据上图中创建管理员权限应用程序的验证过程进行验证,判断是否需要弹出权限提升窗口是否需要。win7开始引入了一种自动提升机制,因而存在一个白名单在该白名单中的程序可以自动提升到管理员权限而不需要用户批准。

4.1 自动提升机制流程

RAiLaunchAdminProcess中,会调用AiIsEXESafeToAutoApprove来判断该程序是否属于可以自动提升权限的程序。

抛开对于系统是否开启自动提升机制的检查等操作,AiIsEXESafeToAutoApprove针对可执行程序是否属于可自动提升程序的验证机制大致如下:

  • 1.验证该可执行程序的manifestautoElevate的值是否为True。

  • 2.检查该应用程序名称是否属于白名单中,白名单应用包括如下几个。

    • cttunesvr.exe
    • inetmgr.exe
    • migsetup.exe
    • mmc.exe
    • oobe.exe
    • pkgmgr.exe
    • provisionshare.exe
    • provisionstorage.exe
    • spinstall.exe
    • winsat.exe
  • 3.调用WTGetSignatureInfo检查文件签名是否正确

  • 4.检查可执行文件是否保存在受信任的文件夹下,大部分C:\Windows目录下的文件夹都是受信任的文件夹

4.2 Bypassing UAC by Mocking Trusted Directories

Appinfo.dll中使用了RtlPrefixUnicodeString函数来匹配应用程序所在文件夹是否是一个首信任的文件夹。我们可以调用CreateDirectory函数配合\\?\ 开头来创建一个名字中包含有空格的文件夹(默认情况下windows不允许创建名字里有空格的文件夹)。 当我们执行的文件路径传给路径检查函数的时候,该函数会调用GetLongPathNameW来获取文件的绝对路径,但是这个函数会把路径中的空格过滤掉。这样在调用RtlPrefixUnicodeString对比受信任路径的时候,我们自己新建的文件夹也就变成了一个受信任的文件夹。因此只需要挑选一个受信任的文件夹路径,自己新建一个包含空格的该路径。将一个白名单中的exe拷贝到伪造的文件夹中。然后就可以用dll劫持等方法来ByPass UAC。

参考链接

https://docs.microsoft.com/zh-cn/windows/security/identity-protection/user-account-control/how-user-account-control-works https://medium.com/tenable-techblog/uac-bypass-by-mocking-trusted-directories-24a96675f6e https://www.cnblogs.com/Chesky/p/UAC_Bypass.html#_caption_5