uac白名单挖掘

UAC介绍

用户帐户控制(User Account Control)是Windows Vista(及更高版本操作系统)中一组新的基础结构技术,可以帮助阻止恶意程序(有时也称为“恶意软件”)损坏系统,同时也可以帮助组织部署更易于管理 的平台

使用UAC,应用程序和任务总是在非管理员帐户的安全上下文中运行,但管理员专门给系统授予管理员级别的访问权限时除外。UAC会阻止未经授权应用程序的自动安装,防止无意中对系统设置进行更改

一句话来说,就是分权限了,有些操作必须保证当前用户具有某个权限才能成功

查看令牌权限

查看用户的令牌权限:

1
whoami /priv

输出会列出当前用户的拥有的所有权限(Privileges),包括权限的名称和当前状态(启用或禁用)。

例如我去查看管理员权限(cmd窗口我用管理员模式打开的)

1728722366947

这是普通用户的权限:
1728723045018

普通用户是无法通过 API 直接获取或启用 SeDebugPrivilege 等高权限特权的。 只有是管理员账户的时候,才能通过API去提升自己的权限

一些权限的解释:

**SeDebugPrivilege**:允许调试和访问系统中的所有进程。

**SeBackupPrivilege**:允许备份文件,忽略常规文件的安全限制。

**SeRestorePrivilege**:允许还原文件,同样忽略文件安全限制。

**SeShutdownPrivilege**:允许关闭系统。

提升权限的步骤

  1. 获取进程的访问令牌(token): 你需要通过 OpenProcessToken 获取当前进程的访问令牌,来查看或修改该进程的权限。
  2. **查找 SeDebugPrivilege**: 使用 LookupPrivilegeValue 获取 SeDebugPrivilege 的权限标识符(LUID)。
  3. 调整进程权限: 使用 AdjustTokenPrivileges 函数来修改访问令牌,明确启用 SeDebugPrivilege

VS里设置exe的UAC执行级别

在Vs中设置exe的UAC级别

1728643523913

asInvoker(以调用者权限运行)

highestAvailable(以用户最高可用权限运行):可以用之前的 whoami /priv查看已开启的权限,如果是需要管理员权限的话,那么还是会触发uac弹框

requireAdministrator(要求管理员权限运行,会弹框)

挖掘UAC白名单

白名单的uac程序需要满足以下几个条件:

  1. 程序的manifest标识的配置属性 autoElevate :
    autoElevate 是 Windows 中应用程序清单文件中的一个属性,用于指定程序是否能够在某些情况下自动提升到管理员权限,而不弹出 UAC 提示框。 这个属性通常被用于一些由微软签署的系统组件或某些特殊程序。

  2. 程序不弹出UAC弹窗

    程序不弹出 UAC 弹窗意味着它在运行时自动获得了管理员权限,而不需要用户的额外操作。

    否则需要rdp远控,去进行确认

  3. 从注册表里查询Shell\Open\command键值对

    通常以shell\open\command命名的键值对存储的是可执行文件的路径,如果exe程序运行的时候找到该键值对,就会运行该键值对的程序,而因为exe运行的时候是静默提升了权限,所以运行的该键值对的程序就已经过了uac。所以我们把恶意的exe路径写入该键值对,那么就能够过uac执行我们的恶意exe。

通常,具备 autoElevate 属性的程序是由微软开发的并且被系统信任的关键系统工具。例如:

  • 系统组件:一些 Windows 内部工具和系统服务(如 taskmgr.exemsconfig.exe)可能具有 autoElevate 属性,允许它们在需要时自动提升到管理员权限。
  • 微软签名的应用程序:具有强身份认证的程序,通常是微软官方发布的应用程序。

对于一般的第三方应用程序,启用 autoElevate不可能的。该机制受 Windows 的严格控制,普通开发者编写的应用程序,即使在清单文件中设置了 autoElevate,也不会被系统允许自动提升权限。

我们从C:\Windows\System32具有autoElevate属性的exe选一个

1728729555011

例如ComputerDefaults.exe

我们用Process Monitor进行监控

1728729698907

然后出现一堆事件

1728729783064

我们进行查找,只要发现Shell\Open\command这样的键值对,我们就可以搞事情, 当用户通过某个程序或快捷方式尝试打开系统设置时,系统会查阅这个注册表项,以确定如何启动设置应用。这个命令通常会指向设置应用的可执行文件。

还有一个叫做:
shell\openas\command
penas 子键:这个子键可能用于指定当用户选择“用其他应用程序打开”时,应该使用的程序。具体而言,openas 通常是通过右键菜单中的“打开方式”选项来实现的。

按下Ctrl + F进行查找

1728729862236

发现shell\openas\command还有

HKCR\AllProtocols\shell\openas\commandHKCU\Software\Classes\AllProtocols\shell\openas\command

HKCR 的设置适用于所有用户,因此定义了系统范围的协议打开方式。HKCU 的设置只适用于当前用户,允许用户自定义其特定的打开方式。

当 Windows 访问注册表时,会先查看 HKCU 的设置,然后查看 HKCR 的设置。如果同一个路径下存在多个设置,HKCU 的设置通常会覆盖 HKCR 中的设置。

根据我们在Process Monitor找到的信息

1728732585335

我们去注册表按照它的样式做好,然后再打开一遍

1728732416951

然后用Process Monitor查看

1728732992340

发现又去找了command项底下的DelegateExecute键值

所以我们合理推测, 首先运行ComputerDefaults.exe这个程序之前,会查询HKCU:\Software\Classes\ms-settings\shell\open\command这个目录是否存在,若存在继续寻找同目录下是否有DelegateExecute这个键值对,若两者都存在则执行HKCU:\Software\Classes\ms-settings\shell\open\command指向的exe路径

于是我们将默认的键值改为例如

1728734452645

然后现在我们启动
1728734470700

发现启动的是我们的扫雷程序:

1728734488225

然后用OpenArk去看,发现权限大大滴有,和管理员权限是一样的

1728734665441