UAC(User AccountControl)是从windows vista开始出现的技术 通过限制应用程序的执行权限来达到提升操作系统安全性的目的

在开启UAC的前提下,即使管理员用户,默认也只能获取到标准权限 当用户某些动作可能会影响系统安全性和稳定性的时候,就会弹窗请求管理员权限 提醒用户该操作属于敏感操作

Screenshot 2022-03-15 13.03.54.png

工作流程

通过UAC,应用程序和任务可始终在非管理员账户的安全上下文中运行,除非管理员特别授予管理员级别的系统访问权限
UAC可以阻止未经授权的应用程序自动进行安装
防止无意中更改系统设置。

image.png

https://docs.microsoft.com/en-us/library/bb38468.aspx

从上图可知,如果启动进程需要管理员权限

  1. 进程已经拥有管理权限控制
  2. 进程被用户允许通过管理员权限运行

UAC实现方法

概念

  1. ACL(Access Control List):windows中所有资源都有ACL,这个列表决定了拥有何种权限的用户/进程能够这个资源。
  2. 在开启了UAC之后,如果用户是标准用户,windows会给用户分配一个标准Access Token
  3. 如果用户以管理员权限登录,会生成两份访问令牌,一份是完整的管理员访问令牌(Full Access Token),一份是标准用户令牌权限启动Explorer.exe进程,如果用户同意,则赋予完整管理员权限访问令牌进行操作

image.png

UAC架构

基本架构如下:
image.png

触发UAC

  1. 配置windows update
  2. 增加或删除用户帐户
  3. 改变用户的帐户类型
  4. 改变UAC设置
  5. 安装ActiveX
  6. 安装或移除程序
  7. 安装设备驱动程序
  8. 设置家长控制
  9. 将文件移动或复制到Program Files或Windows目录
  10. 查看其他用户文件夹

UAC虚拟化

Virtualization也被称为重定向(Data Redirection).在权限判定的过程中,如果用户的权限没有达到程序所需的权限,UAC就会重定向该文件夹
例如如果程序尝试写到
C:\Program Files\Contoso\Settings.ini目录下
但用户没有写入权限,这个写操作就会被重定向至
C:\Users\Username\AppData\Local\VirtualStore\Program Files\contoso\settings.ini.

UAC虚拟化分为文件虚拟化和注册表虚拟化

image.png
以下情况虚拟化不可用

  1. 64位程序
  2. 非交互式程序
  3. 模拟令牌的进程(Processes that impersonate)
  4. 内核模式调用方
  5. 带有requestedExecutionLevel(请求执行等级)的可执行程序


文件虚拟化(File Virtualization)

image.png

Luafv.sys实现的是改变写入文件位置

注册表虚拟化

image.png

Ntoskrnl.exe 实现的是改变写入注册表位置

UAC分析

Process Explorer和IDA

  1. 先用procexp查看现有进程
  2. 右键使用管理员权限运行一个文件以弹出UAC提示框,可以看到多了一个进程consent.exe
  3. 这个进程中有一个dll appinfo,UAC主要实现文件在于 appinfo.dll这个文件中
  4. 查看此dll的string

    http://www.win7dll.info/appinfo_dll.html

Screenshot 2022-03-15 14.01.58.png

确定这个dll和UAC直接相关

  1. 若想进一步观看可以用IDA进行逆向

总结

在触发UAC时候,系统会创建一个consent.exe进程,该进程用以确定是否创建管理员进程(通过白名单和用户选择判断),然后creatprocess

请求进程将要请求的进程cmdline和进程路径通过LPC接口传递给appinfo的RAiLuanchAdminProcess函数,该函数首先验证路径是否在白名单中,并将结果传递给consent.exe进程,该进程验证被请求的进程签名以及发起者的权限是否符合要求,然后决定是否弹出UAC框让用户进行确认。这个UAC框会创建新的安全桌面,屏蔽之前的界面。同时这个UAC框进程是SYSTEM权限进程,其他普通进程也无法和其进行通信交互。用户确认之后,会调用CreateProcessAsUser函数以管理员权限启动请求的进程。