Windows 权限提升实战:令牌窃取、UAC 绕过、服务劫持
文章目录
- 写在前面
- 一、先建立正确的权限模型
- 1.1 账户、特权、完整性:三层不要混
- 1.2 快速勘察命令(授权环境)
- 1.3 提权分类地图
- 二、令牌窃取与令牌模拟
- 2.1 令牌是什么
- 2.2 为什么“模拟”会变成提权
- 2.3 关键条件(测试前先核对)
- 2.4 从侦察到验证的安全做法
- (1)确认特权
- (2)确认身份类型
- (3)在实验环境理解“管道假冒”
- 2.5 令牌盗窃的另一条线:从高权进程“借”令牌
- 2.6 检测点(蓝队)
- 2.7 加固项
- 三、UAC 绕过实战(原理、边界、防御)
- 3.1 再次明确:UAC 不是安全边界
- 3.2 过滤令牌与自动提升
- 3.3 实战评估步骤(授权)
- 3.4 常见绕过类别(概念级)
- (1)DLL 劫持 / 旁加载(配合高权或自动提升宿主)
- (2)COM 提升接口滥用
- (3)环境变量与 Shell 协议类
- (4)“用户同意”社会工程
- 3.5 检测点
- 3.6 加固项(比追 bypass 名单更重要)
- 四、服务劫持:最稳、最常见的配置型提权
- 4.1 为什么服务值得盯
- 4.2 服务提权的主要子类
- (1)服务二进制可写(Weak Service Binary Permissions)
- (2)未加引号的服务路径(Unquoted Service Path)
- (3)服务配置可写(Writable Service Control)
- (4)DLL 劫持 / 服务旁加载
- (5)与计划任务、驱动、服务恢复命令联动
- 4.3 授权测试中的枚举方法(不提供利用载荷)
- 查看服务与路径
- 检查未加引号路径(思路)
- 检查 ACL(思路)
- 4.4 一个典型攻击链(叙述)
- 4.5 检测点
- 4.6 加固项(可直接进基线)
- 五、三条线如何在实战中串联
- 5.1 常见杀伤链组合
- 5.2 红队(授权)报告应怎么写才专业
- 六、实验环境设计建议
- 七、综合加固清单(可打印)
- 7.1 账户与 UAC
- 7.2 令牌与高权进程
- 7.3 服务与任务
- 7.4 执行控制与 EDR
- 7.5 运营
- 八、应急:怀疑已被提权时做什么
- 九、结语
写在前面
Windows 提权不是“找到一个 CVE 然后一键 SYSTEM”这么浪漫。真实渗透与红队评估里,更常见的路径是:
- 先拿到一个普通用户或**本地管理员(未提升)**会话;
- 再在系统配置失误、服务权限过宽、令牌滥用、UAC 机制边界上完成提权;
- 最后才是内核漏洞或 0day。
本文聚焦三条在实战中出现频率极高、也最值得防守方吃透的路径:
- 令牌窃取 / 令牌模拟(Token Impersonation)
- UAC 绕过(UAC Bypass)
- 服务劫持(服务权限、可执行路径、DLL、计划任务相关)
一、先建立正确的权限模型
1.1 账户、特权、完整性:三层不要混
很多人把“我是 Administrators 组成员”直接等同于“我是 SYSTEM”。在现代 Windows 上这不成立。
至少分清三层:
| 层次 | 含义 | 典型表现 |
|---|---|---|
| 身份(Account) | 你是谁 | DOMAIN\alice/ 本地用户 |
| 特权(Privileges) | 令牌里打开了哪些特权 | SeDebugPrivilege、SeImpersonatePrivilege |
| 完整性(Integrity) | MIC 完整性级别 | Medium / High / System |
因此会出现这些“看起来矛盾”的现象:
- 你是本地管理员,但当前进程只有Medium IL,写不了
C:\Windows,这是 UAC 过滤令牌。 - 你是普通用户,但服务给了你SeImpersonatePrivilege,仍可能走向 SYSTEM。
- 你拿到了 High IL 管理员,也还不等于 SYSTEM——还差服务会话、SYSTEM 令牌或等价特权。
提权分析的第一件事不是搜 EXP,而是问:
我现在的令牌里,到底有什么?缺什么?目标要什么?
1.2 快速勘察命令(授权环境)
whoami whoami /groups whoami /priv whoami /all net user %username% net localgroup administratorsPowerShell(信息收集):
[System.Security.Principal.WindowsIdentity]::GetCurrent()|Select-Name,IsSystem,ImpersonationLevelGet-LocalGroupMember-Group"Administrators"重点看:
- 是否含
Mandatory Label\High Mandatory Level - 是否有
SeImpersonatePrivilege/SeAssignPrimaryTokenPrivilege/SeDebugPrivilege - 是否在
Administrators但处于过滤管理员令牌状态
1.3 提权分类地图
┌─ 配置型:服务路径/权限、计划任务、注册表 Run、弱 ACL 未提升访问 ─────────┼─ 机制型:UAC 边界、令牌模拟、管道假冒 └─ 漏洞型:驱动/内核/服务逻辑漏洞(本文不展开利用细节)令牌窃取偏机制型;UAC 绕过偏机制边界;服务劫持偏配置型。防守时三者要分开治,测试时三者常串联。
二、令牌窃取与令牌模拟
2.1 令牌是什么
访问令牌(Access Token)是 Windows 安全引用监视器判断“能否访问对象、能否执行特权操作”的核心结构。它大致包含:
- 用户 SID、组 SID
- 特权列表及其启用状态
- 默认 DACL、完整性级别
- 受限标记、会话 ID、模拟级别等
进程启动时通常携带主令牌(Primary Token);线程可以临时切换为模拟令牌(Impersonation Token),以便服务“以客户端身份”访问资源——这是合法设计,也是滥用点。
2.2 为什么“模拟”会变成提权
经典滥用链:
- 攻击者控制一个拥有SeImpersonatePrivilege的进程(许多服务账户默认具备)。
- 诱使或等待一个更高权限客户端连接到攻击者可控的命名管道 / RPC / ALPC 等接口。
- 服务端调用模拟 API,使当前线程获得客户端令牌。
- 若客户端是 SYSTEM 或高权账户,攻击者便可以该令牌创建进程或访问受保护资源。
这就是社区常说的Potato 家族(各种Potato)问题域的本质:
不是“魔法提权”,而是“有模拟特权的服务账户 + 能骗到 SYSTEM 来连我”。
2.3 关键条件(测试前先核对)
令牌模拟提权通常需要:
- 当前上下文具备
SeImpersonatePrivilege或SeAssignPrimaryTokenPrivilege;或 - 能注入/控制已有该特权的进程;或
- 能写服务/计划任务,使恶意代码以服务账户运行。
另外还要满足:
- 有可用的“触发高权回连”原语(打印假冒、RPC、特定系统行为等,随补丁变化);
- 目标系统版本与缓解措施未完全堵死该路径。
没有模拟特权、又不是管理员,就先别在 Potato 上死磕——去查服务 ACL、无人值守安装、凭据落地、内核漏洞面。
2.4 从侦察到验证的安全做法
(1)确认特权
whoami /priv若看到SeImpersonatePrivilege为 Enabled/Disabled(可启用),记录下来。Disabled 不等于没有,很多情况下可AdjustTokenPrivileges启用。
(2)确认身份类型
服务账户、IIS 应用池、SQL Agent、CI 跑库账户,是高发人群。
WebShell 落到应用池身份时,应第一时间查 priv,而不是先找内核 EXP。
(3)在实验环境理解“管道假冒”
原理课可以用微软文档与公开安全研究说明:
- 命名管道安全描述符过宽;
- 服务模拟客户端;
- 未正确校验客户端身份就抬权。
授权测试中,使用商业/开源评估工具前,应:
- 明确规则允许;
- 先在同版本靶机验证;
- 记录 Event Log 与 EDR 告警,供蓝队调规则。
本文不附带利用实现。
2.5 令牌盗窃的另一条线:从高权进程“借”令牌
当攻击者已经是本地管理员(高完整性),目标是 SYSTEM 或域管会话时,常见思路是:
- 启用
SeDebugPrivilege; - 打开目标高权进程;
- 复制其令牌;
- 以该令牌创建新进程。
这更接近“权限跃迁 / 凭证与会话滥用”,而不是从零打到管理员。
防守上要关注:调试特权谁有、敏感进程保护(PPL)、Credential Guard、管理员席位是否过多。
2.6 检测点(蓝队)
重点信号:
| 信号 | 为何可疑 |
|---|---|
| 非服务主机进程突然创建命名管道并等待连接 | 假冒准备 |
SeImpersonatePrivilege账户拉起异常子进程 | 模拟后落地 |
| 打印后台 / RPC / 异常 SYSTEM 进程链 | Potato 类链路 |
| 普通用户进程打开 lsass / winlogon 等 | 令牌或凭据操作 |
| 短时间内特权启用(Privilege Use 审计) | 提权准备 |
日志与控制:
- 开启特权使用审计(至少敏感特权成功)。
- 开启进程创建审计或 Sysmon(记录父进程、命令行、完整性)。
- 对 Web 目录、服务账户可写路径做 FIM。
2.7 加固项
- 最小化服务账户特权:能去掉 Impersonate 就去掉;不能去掉则隔离。
- Web / CI / 代理账户禁止本地交互登录,可写路径与命令解释器严格限制。
- 及时打补丁:打印后台、RPC、Win32k 等相关修复会改变利用条件。
- 开启LSA Protection / Credential Guard(兼容性评估后)。
- 用 WDAC/AppLocker 限制谁能创建可疑二进制。
- 对Potato 历史手法做 ASR 与行为规则覆盖(父进程链、管道+SYSTEM 子进程)。
三、UAC 绕过实战(原理、边界、防御)
3.1 再次明确:UAC 不是安全边界
微软长期观点是:UAC 主要用于减少意外的系统级更改,缓解部分恶意软件轻易获得高权,
不是对抗已获本地管理员资格攻击者的坚固安全边界。
但在企业里,UAC 仍然极有价值:
- 多数用户不应是管理员;
- 即便是管理员,日常也跑在过滤令牌下;
- 很多木马、盗号器、劣质安装器会撞在 UAC 提示上。
“UAC 绕过”讨论的是:
已是管理员组成员,但当前进程是 Medium IL,如何在无提示或弱提示下获得 High IL。
若当前用户根本不是管理员,谈 UAC 绕过没有意义——那是真提权,不是 bypass。
3.2 过滤令牌与自动提升
管理员登录后,系统创建:
- 完整管理员令牌(高完整性)
- 过滤令牌(中完整性,去掉大部分管理特权)
日常资源管理器等使用过滤令牌。
某些微软签名、声明了自动提升(auto-elevate)的二进制,可在特定条件下直接抬到高完整性——这是兼容性设计,也是绕过研究的主矿场。
攻击者研究的典型方向包括:
- 滥用auto-elevate程序的配置/插件加载逻辑;
- 利用受信任目录 + 未加引号路径 / DLL 搜索顺序;
- 利用环境变量、注册表、COM 提升接口等,让高权进程加载攻击者可控代码;
- 在未启用安全桌面时进行 UI 欺骗(较老/较弱环境)。
随着 Windows 10/11 不断修复,具体技巧名单在快速腐烂。防守应抓类别,而不是背某一个 EXP 名字。
3.3 实战评估步骤(授权)
步骤 1:确认是否值得做 UAC bypass
whoami /groups | findstr /i "Administrators Mandatory"- 不在 Administrators → 去做真提权。
- 已是 High IL → UAC 已过,转向持久化/凭据/横向。
- 在 Administrators 且 Medium → 才进入 bypass 评估。
步骤 2:看 UAC 策略强度
检查是否:
- 管理员批准模式开启
- 提示在安全桌面
- “仅提升签名且验证的可执行文件”等策略
策略越强,可滥用面越小;但不会变成零。
步骤 3:看应用兼容与企业软件
大量第三方“带提权的更新器”、错误配置的安装服务,比时髦 bypass 更好用。
授权测试应包含:软件清单、自动更新组件、企业运维脚本是否常驻高权。
步骤 4:在靶机验证检测能力
即使不演示具体利用,也应验证蓝队能否看到:
- 中完整性进程启动自动提升系统组件
- 紧接着高完整性进程加载用户目录 DLL
- 异常父进程关系(如办公进程 → 系统管理工具 → cmd)
3.4 常见绕过类别(概念级)
(1)DLL 劫持 / 旁加载(配合高权或自动提升宿主)
高权进程到不安全目录搜索 DLL,或对已知 DLL 名进行旁加载。
条件通常包括:可写搜索路径、缺 DLL、已知加载名。
(2)COM 提升接口滥用
部分 COM 对象以自动提升运行;若接口存在不安全方法(执行回调、写文件、启进程)且未充分校验,就会成为桥梁。
(3)环境变量与 Shell 协议类
通过污染特定环境变量或协议处理程序,影响提升后进程的行为。随着修复,很多已失效,但同类设计错误仍可能出现在第三方软件。
(4)“用户同意”社会工程
严格说不算技术 bypass,但实战成功率最高:伪造更新、伪造驱动安装、仿冒安全桌面。
安全意识与 Soft Approbation 策略同样是基线。
3.5 检测点
| 检测思路 | 说明 |
|---|---|
| 父进程链异常 | Medium 进程拉起 auto-elevate 系统程序后立刻出高权 shell |
| 模块加载路径 | 高权进程从用户可写目录加载 DLL |
| 命令行 | fodhelper、eventvwr、computerdefaults等经典宿主 + 异常注册表/参数(名单需随版本更新) |
| 注册表敏感键瞬时写入 | 提升相关键值被非安装程序写入 |
| UAC 设置被改 | 策略/注册表关闭提示或关闭管理员批准模式 |
Sysmon 建议关注:
- Event 1 进程创建(完整性、哈希、父进程)
- Event 7 镜像加载(Signed=false 且路径可疑)
- Event 13 注册表值更改
3.6 加固项(比追 bypass 名单更重要)
- 大多数人不要进本地管理员组——从根上取消 bypass 前提。
- UAC:启用管理员批准模式、安全桌面提示;禁止“从不通知”。
- 用WDAC限制可执行与可加载 DLL。
- 开启ASR(例如阻止 Office 创建子进程、阻止混淆脚本等)。
- 对自动提升相关注册表项做监控。
- 运维安装走 SCCM/Intune 系统上下文,而不是给每人管理员 + 关 UAC。
- 及时更新 Windows:很多公开 bypass 会随月度补丁失效。
一句话给管理层:
防 UAC 绕过的最高优先级,不是买“反 bypass 产品”,而是收回本地管理员权限。
四、服务劫持:最稳、最常见的配置型提权
4.1 为什么服务值得盯
Windows 服务默认以SYSTEM或高权服务账户运行。只要攻击者能:
- 改服务映像路径;或
- 替换服务 EXE/DLL;或
- 在服务启动时让其加载恶意库;或
- 利用服务修复/恢复命令执行任意程序;
就可能直接拿到 SYSTEM。
这类问题在老旧工业软件、自制服务、错误安装包里极其常见,且不依赖 0day。
4.2 服务提权的主要子类
(1)服务二进制可写(Weak Service Binary Permissions)
服务指向的 EXE,其 NTFS ACL 对普通用户可写/可改。
攻击者替换文件后,等待服务重启或触发重启,即可 SYSTEM 执行。
侦察思路:
- 枚举服务及其
binPath - 检查路径 ACL 与文件 ACL
- 关注非
System32的第三方路径
(2)未加引号的服务路径(Unquoted Service Path)
例如:
C:\Program Files\Something\service.exe若注册时没有正确加引号,系统可能按规则尝试:
C:\Program.exe C:\Program Files\Something\service.exe ...若攻击者对靠前的候选路径可写,即可植入同名 EXE。
这是经典配置失误,自动化审计工具几乎必扫。
(3)服务配置可写(Writable Service Control)
通过服务控制管理器权限过宽,普通用户能ChangeConfig,直接改binPath为任意命令,再启动服务。
这比改文件还直接。
(4)DLL 劫持 / 服务旁加载
服务进程启动时加载同一目录或搜索路径中的 DLL;目录可写则中招。
尤其“从 ProgramData、用户目录、临时目录拉库”的服务,风险极高。
(5)与计划任务、驱动、服务恢复命令联动
- 计划任务以 SYSTEM 运行且脚本可写
- 服务失败时“运行程序”指向可写脚本
- 第三方更新服务自动提权执行用户目录内容
这些常和服务问题一起在报告里出现。
4.3 授权测试中的枚举方法(不提供利用载荷)
查看服务与路径
sc query state= all wmic service get Name,StartName,PathName,StartModePowerShell:
Get-CimInstanceWin32_Service|Select-ObjectName,State,StartMode,StartName,PathName|Format-List检查未加引号路径(思路)
找出PathName中:
- 包含空格
- 且整体未用引号包裹
- 且存在可写中间路径
检查 ACL(思路)
对服务对象、文件、目录使用:
icacls "C:\Path\service.exe" sc sdshow <ServiceName>关注:Authenticated Users、Everyone、Users是否具有FILE_WRITE_DATA、WRITE_DAC、SERVICE_CHANGE_CONFIG等危险权限。
发现可写后,正确的专业动作是:
- 截图/导出 ACL 与服务配置;
- 在靶机用无害验证证明可写(例如写入测试文件,而不是马);
- 评估是否需要重启、是否会造成业务中断;
- 写入报告与加固建议。
4.4 一个典型攻击链(叙述)
普通用户 → 发现第三方服务路径未加引号 → 在可写目录放置同名程序 → 触发服务重启(或等待) → SYSTEM 权限执行 → 创建管理员/关闭防护/抓取凭据或:
应用池用户(有 SeImpersonate) → 令牌模拟到 SYSTEM → 改服务配置做持久化实战中“服务劫持”经常是提权后的持久化手段,也可能是提权本身。
4.5 检测点
| 对象 | 监控什么 |
|---|---|
| 服务控制管理器 | 服务创建、二进制路径更改、启动类型更改 |
| 文件系统 | 服务目录新增 EXE/DLL;系统目录异常写入 |
| 进程 | 服务进程从异常路径启动;签名不匹配 |
| 计划任务 | SYSTEM 任务动作被改 |
| 防护 | Tamper Protection 关闭、Defender 排除被加到服务目录 |
Windows 事件(示例方向):
- 系统日志中服务安装/更改相关事件
- 安全审计中对象访问(若配置了 SACL)
- Defender/MDE:可疑服务修改告警
4.6 加固项(可直接进基线)
- 服务 EXE 目录仅 Administrators/SYSTEM 可写。
- 所有服务路径加引号,安装程序打包时检查。
- 收紧服务 SDDL,禁止 Users
CHANGE_CONFIG。 - 第三方软件装到受控目录,不要散落在可写共享。
- 用基线扫描定期查:Unquoted Path、Weak ACL、可写服务。
- 服务账户遵循最小特权,能用 gMSA 用 gMSA。
- 关键变更管控:服务配置更改进入 SIEM 高优先级告警。
五、三条线如何在实战中串联
5.1 常见杀伤链组合
组合 A:从服务到令牌
弱服务 → SYSTEM → 复制令牌 / 做持久化 / 关防护。
组合 B:从管理员到 SYSTEM
已在 Administrators(Medium)→ UAC 绕过到 High → SeDebug 打开 SYSTEM 进程令牌。
组合 C:从 Web 应用池到 SYSTEM
WebShell → 应用池有 Impersonate → 令牌假冒 → SYSTEM → 写服务持久化。
组合 D:纯配置礼包
可写服务 + 可写计划任务 + 关不严的 UAC + 过宽排除项。
蓝队演练时,不要只练“单个 CVE”,要练组合链的日志相关性。
5.2 红队(授权)报告应怎么写才专业
避免只写“使用某某工具成功 SYSTEM”。更好的结构:
- 初始权限与令牌信息(whoami /priv /groups)
- 根因(哪条 ACL、哪项策略、哪个服务)
- 利用条件(版本、是否需重启、是否需交互)
- 证据(配置导出、事件 ID、时间线)
- 业务影响(可否触达域管、备份、敏感数据)
- 修复验证(修完后复测同一路径失败)
这样开发与运维才修得动。
六、实验环境设计建议
若要在内训中安全地练这三类能力,建议搭建:
- 域控 + 1 台工作站 + 1 台成员服务器(快照充足)。
- 故意配置三条靶标:
- 一个未加引号路径的自定义服务(仅实验机);
- 一个可写目录的演示服务;
- 一个带 SeImpersonate 的低权服务账户场景。
- 安装 Sysmon + 转发日志,学员先做检测规则,再做攻击演示。
- UAC 场景单独用“本地管理员日常用户”靶机,与“标准用户”靶机分开,避免概念混乱。
严格禁止在生产、个人办公机、客户未授权系统上练习。
七、综合加固清单(可打印)
7.1 账户与 UAC
- 普通用户无本地管理员
- LAPS 管理本地管理员密码
- UAC 管理员批准模式开启
- 安全桌面提示开启
- 禁止“从不通知”
7.2 令牌与高权进程
- 审计特权使用与进程创建
- Web/CI 账户权限最小化
- LSA Protection / Credential Guard 评估启用
- 限制调试特权与驱动加载
7.3 服务与任务
- 定期扫描 Unquoted Service Path
- 定期扫描服务二进制 ACL
- 服务配置更改进 SIEM
- SYSTEM 计划任务脚本不可被用户写
7.4 执行控制与 EDR
- WDAC/AppLocker 渐进强制
- ASR 从 Audit 到 Block
- Defender Tamper Protection 开启
- 排除项审批制
7.5 运营
- 月度提权路径复测(配置型)
- 补丁合规
- 红蓝后回写检测规则
八、应急:怀疑已被提权时做什么
- 隔离主机(断网但尽量保内存与日志)。
- 采集:
whoami历史无关,直接拉事件日志、Sysmon、MFT、服务列表、计划任务、启动项。 - 检查:
- 新增服务 / binPath 变更
- 可疑 DLL 到系统进程
- 本地管理员组成员变更
- Defender 关闭或排除异常
- 重置本地管理员与相关服务账户密钥(LAPS 轮换)。
- 若有域横向迹象:按域应急流程查黄金票据、异常登录、GPO 篡改。
- 重装或黄金镜像恢复高信任主机(跳板、PAW、域控周边)。
提权成功后的环境,默认按不可信处理,不要只“杀毒清理”了事。
九、结语
Windows 权限提升里,最能长期骗人的不是某一个公开 bypass 名字,而是这三类结构性问题:
- 令牌机制被合法业务功能带着走——有模拟特权的账户一旦能骗到 SYSTEM 回连,就会发生质变;
- UAC 被当成安全边界——不收回本地管理员,绕过研究就永远有客户;
- 服务以 SYSTEM 跑又配了用户可写——这是最朴素、也最稳定的提权与持久化土壤。
对攻击者(授权测试)而言,秩序应是:
查令牌特权 → 查服务/任务 ACL 与路径 → 再谈 UAC 边界 → 最后才是漏洞利用。
对防守者而言,秩序应是:
收回本地管理员 → 收紧服务与任务的 ACL → 审计特权与进程链 → 再叠加 ASR/WDAC/凭据防护。
把本文的检测点与加固清单落到组策略和 SIEM 规则后,你会发现:
很多“炫技型提权”在规范环境里根本走不通;而真正让你失眠的,依旧是那一个对Everyone可写的第三方服务路径。
