uac白名单挖掘
uac白名单挖掘
UAC介绍
用户帐户控制(User Account Control)是Windows Vista(及更高版本操作系统)中一组新的基础结构技术,可以帮助阻止恶意程序(有时也称为“恶意软件”)损坏系统,同时也可以帮助组织部署更易于管理 的平台
使用UAC,应用程序和任务总是在非管理员帐户的安全上下文中运行,但管理员专门给系统授予管理员级别的访问权限时除外。UAC会阻止未经授权应用程序的自动安装,防止无意中对系统设置进行更改
一句话来说,就是分权限了,有些操作必须保证当前用户具有某个权限才能成功
查看令牌权限
查看用户的令牌权限:
1 | whoami /priv |
输出会列出当前用户的拥有的所有权限(Privileges),包括权限的名称和当前状态(启用或禁用)。
例如我去查看管理员权限(cmd窗口我用管理员模式打开的)
这是普通用户的权限:
普通用户是无法通过 API 直接获取或启用 SeDebugPrivilege
等高权限特权的。 只有是管理员账户的时候,才能通过API去提升自己的权限
一些权限的解释:
**SeDebugPrivilege
**:允许调试和访问系统中的所有进程。
**SeBackupPrivilege
**:允许备份文件,忽略常规文件的安全限制。
**SeRestorePrivilege
**:允许还原文件,同样忽略文件安全限制。
**SeShutdownPrivilege
**:允许关闭系统。
提升权限的步骤:
- 获取进程的访问令牌(token): 你需要通过
OpenProcessToken
获取当前进程的访问令牌,来查看或修改该进程的权限。 - **查找
SeDebugPrivilege
**: 使用LookupPrivilegeValue
获取SeDebugPrivilege
的权限标识符(LUID)。 - 调整进程权限: 使用
AdjustTokenPrivileges
函数来修改访问令牌,明确启用SeDebugPrivilege
。
VS里设置exe的UAC执行级别
在Vs中设置exe的UAC级别
asInvoker(以调用者权限运行)
highestAvailable(以用户最高可用权限运行):可以用之前的 whoami /priv
查看已开启的权限,如果是需要管理员权限的话,那么还是会触发uac弹框
requireAdministrator(要求管理员权限运行,会弹框)
挖掘UAC白名单
白名单的uac程序需要满足以下几个条件:
程序的manifest标识的配置属性 autoElevate :
autoElevate 是 Windows 中应用程序清单文件中的一个属性,用于指定程序是否能够在某些情况下自动提升到管理员权限,而不弹出 UAC 提示框。 这个属性通常被用于一些由微软签署的系统组件或某些特殊程序。程序不弹出UAC弹窗
程序不弹出 UAC 弹窗意味着它在运行时自动获得了管理员权限,而不需要用户的额外操作。
否则需要rdp远控,去进行确认
从注册表里查询Shell\Open\command键值对
通常以shell\open\command命名的键值对存储的是可执行文件的路径,如果exe程序运行的时候找到该键值对,就会运行该键值对的程序,而因为exe运行的时候是静默提升了权限,所以运行的该键值对的程序就已经过了uac。所以我们把恶意的exe路径写入该键值对,那么就能够过uac执行我们的恶意exe。
通常,具备 autoElevate
属性的程序是由微软开发的并且被系统信任的关键系统工具。例如:
- 系统组件:一些 Windows 内部工具和系统服务(如
taskmgr.exe
、msconfig.exe
)可能具有autoElevate
属性,允许它们在需要时自动提升到管理员权限。 - 微软签名的应用程序:具有强身份认证的程序,通常是微软官方发布的应用程序。
对于一般的第三方应用程序,启用 autoElevate
是 不可能的。该机制受 Windows 的严格控制,普通开发者编写的应用程序,即使在清单文件中设置了 autoElevate
,也不会被系统允许自动提升权限。
我们从C:\Windows\System32具有autoElevate属性的exe选一个
例如ComputerDefaults.exe
我们用Process Monitor进行监控
然后出现一堆事件
我们进行查找,只要发现Shell\Open\command
这样的键值对,我们就可以搞事情, 当用户通过某个程序或快捷方式尝试打开系统设置时,系统会查阅这个注册表项,以确定如何启动设置应用。这个命令通常会指向设置应用的可执行文件。
还有一个叫做:shell\openas\command
penas
子键:这个子键可能用于指定当用户选择“用其他应用程序打开”时,应该使用的程序。具体而言,openas
通常是通过右键菜单中的“打开方式”选项来实现的。
按下Ctrl + F进行查找
发现shell\openas\command
还有
HKCR\AllProtocols\shell\openas\command
和HKCU\Software\Classes\AllProtocols\shell\openas\command
HKCR
的设置适用于所有用户,因此定义了系统范围的协议打开方式。HKCU
的设置只适用于当前用户,允许用户自定义其特定的打开方式。
当 Windows 访问注册表时,会先查看 HKCU
的设置,然后查看 HKCR
的设置。如果同一个路径下存在多个设置,HKCU
的设置通常会覆盖 HKCR
中的设置。
根据我们在Process Monitor找到的信息
我们去注册表按照它的样式做好,然后再打开一遍
然后用Process Monitor查看
发现又去找了command项底下的DelegateExecute键值
所以我们合理推测, 首先运行ComputerDefaults.exe
这个程序之前,会查询HKCU:\Software\Classes\ms-settings\shell\open\command
这个目录是否存在,若存在继续寻找同目录下是否有DelegateExecute
这个键值对,若两者都存在则执行HKCU:\Software\Classes\ms-settings\shell\open\command
指向的exe路径
于是我们将默认的键值改为例如
然后现在我们启动
发现启动的是我们的扫雷程序:
然后用OpenArk去看,发现权限大大滴有,和管理员权限是一样的