Windows 权限提升实战:令牌窃取、UAC 绕过、服务劫持

📅 2026/7/29 19:58:21 👁️ 阅读次数 📝 编程学习
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”这么浪漫。真实渗透与红队评估里,更常见的路径是:

  1. 先拿到一个普通用户或**本地管理员(未提升)**会话;
  2. 再在系统配置失误、服务权限过宽、令牌滥用、UAC 机制边界上完成提权;
  3. 最后才是内核漏洞或 0day。

本文聚焦三条在实战中出现频率极高、也最值得防守方吃透的路径:

  • 令牌窃取 / 令牌模拟(Token Impersonation)
  • UAC 绕过(UAC Bypass)
  • 服务劫持(服务权限、可执行路径、DLL、计划任务相关)

一、先建立正确的权限模型

1.1 账户、特权、完整性:三层不要混

很多人把“我是 Administrators 组成员”直接等同于“我是 SYSTEM”。在现代 Windows 上这不成立。

至少分清三层:

层次含义典型表现
身份(Account)你是谁DOMAIN\alice/ 本地用户
特权(Privileges)令牌里打开了哪些特权SeDebugPrivilegeSeImpersonatePrivilege
完整性(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 administrators

PowerShell(信息收集):

[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 为什么“模拟”会变成提权

经典滥用链:

  1. 攻击者控制一个拥有SeImpersonatePrivilege的进程(许多服务账户默认具备)。
  2. 诱使或等待一个更高权限客户端连接到攻击者可控的命名管道 / RPC / ALPC 等接口。
  3. 服务端调用模拟 API,使当前线程获得客户端令牌。
  4. 若客户端是 SYSTEM 或高权账户,攻击者便可以该令牌创建进程或访问受保护资源。

这就是社区常说的Potato 家族(各种Potato)问题域的本质:
不是“魔法提权”,而是“有模拟特权的服务账户 + 能骗到 SYSTEM 来连我”

2.3 关键条件(测试前先核对)

令牌模拟提权通常需要:

  • 当前上下文具备SeImpersonatePrivilegeSeAssignPrimaryTokenPrivilege;或
  • 能注入/控制已有该特权的进程;或
  • 能写服务/计划任务,使恶意代码以服务账户运行。

另外还要满足:

  • 有可用的“触发高权回连”原语(打印假冒、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 或域管会话时,常见思路是:

  1. 启用SeDebugPrivilege
  2. 打开目标高权进程;
  3. 复制其令牌;
  4. 以该令牌创建新进程。

这更接近“权限跃迁 / 凭证与会话滥用”,而不是从零打到管理员。
防守上要关注:调试特权谁有、敏感进程保护(PPL)、Credential Guard、管理员席位是否过多。

2.6 检测点(蓝队)

重点信号:

信号为何可疑
非服务主机进程突然创建命名管道并等待连接假冒准备
SeImpersonatePrivilege账户拉起异常子进程模拟后落地
打印后台 / RPC / 异常 SYSTEM 进程链Potato 类链路
普通用户进程打开 lsass / winlogon 等令牌或凭据操作
短时间内特权启用(Privilege Use 审计)提权准备

日志与控制:

  • 开启特权使用审计(至少敏感特权成功)。
  • 开启进程创建审计或 Sysmon(记录父进程、命令行、完整性)。
  • 对 Web 目录、服务账户可写路径做 FIM。

2.7 加固项

  1. 最小化服务账户特权:能去掉 Impersonate 就去掉;不能去掉则隔离。
  2. Web / CI / 代理账户禁止本地交互登录,可写路径与命令解释器严格限制。
  3. 及时打补丁:打印后台、RPC、Win32k 等相关修复会改变利用条件。
  4. 开启LSA Protection / Credential Guard(兼容性评估后)。
  5. 用 WDAC/AppLocker 限制谁能创建可疑二进制。
  6. 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
命令行fodhelpereventvwrcomputerdefaults等经典宿主 + 异常注册表/参数(名单需随版本更新)
注册表敏感键瞬时写入提升相关键值被非安装程序写入
UAC 设置被改策略/注册表关闭提示或关闭管理员批准模式

Sysmon 建议关注:

  • Event 1 进程创建(完整性、哈希、父进程)
  • Event 7 镜像加载(Signed=false 且路径可疑)
  • Event 13 注册表值更改

3.6 加固项(比追 bypass 名单更重要)

  1. 大多数人不要进本地管理员组——从根上取消 bypass 前提。
  2. UAC:启用管理员批准模式、安全桌面提示;禁止“从不通知”。
  3. WDAC限制可执行与可加载 DLL。
  4. 开启ASR(例如阻止 Office 创建子进程、阻止混淆脚本等)。
  5. 对自动提升相关注册表项做监控。
  6. 运维安装走 SCCM/Intune 系统上下文,而不是给每人管理员 + 关 UAC。
  7. 及时更新 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,StartMode

PowerShell:

Get-CimInstanceWin32_Service|Select-ObjectName,State,StartMode,StartName,PathName|Format-List
检查未加引号路径(思路)

找出PathName中:

  • 包含空格
  • 且整体未用引号包裹
  • 且存在可写中间路径
检查 ACL(思路)

对服务对象、文件、目录使用:

icacls "C:\Path\service.exe" sc sdshow <ServiceName>

关注:Authenticated UsersEveryoneUsers是否具有FILE_WRITE_DATAWRITE_DACSERVICE_CHANGE_CONFIG等危险权限。

发现可写后,正确的专业动作是:

  1. 截图/导出 ACL 与服务配置;
  2. 在靶机用无害验证证明可写(例如写入测试文件,而不是马);
  3. 评估是否需要重启、是否会造成业务中断;
  4. 写入报告与加固建议。

4.4 一个典型攻击链(叙述)

普通用户 → 发现第三方服务路径未加引号 → 在可写目录放置同名程序 → 触发服务重启(或等待) → SYSTEM 权限执行 → 创建管理员/关闭防护/抓取凭据

或:

应用池用户(有 SeImpersonate) → 令牌模拟到 SYSTEM → 改服务配置做持久化

实战中“服务劫持”经常是提权后的持久化手段,也可能是提权本身。

4.5 检测点

对象监控什么
服务控制管理器服务创建、二进制路径更改、启动类型更改
文件系统服务目录新增 EXE/DLL;系统目录异常写入
进程服务进程从异常路径启动;签名不匹配
计划任务SYSTEM 任务动作被改
防护Tamper Protection 关闭、Defender 排除被加到服务目录

Windows 事件(示例方向):

  • 系统日志中服务安装/更改相关事件
  • 安全审计中对象访问(若配置了 SACL)
  • Defender/MDE:可疑服务修改告警

4.6 加固项(可直接进基线)

  1. 服务 EXE 目录仅 Administrators/SYSTEM 可写
  2. 所有服务路径加引号,安装程序打包时检查。
  3. 收紧服务 SDDL,禁止 UsersCHANGE_CONFIG
  4. 第三方软件装到受控目录,不要散落在可写共享。
  5. 用基线扫描定期查:Unquoted Path、Weak ACL、可写服务。
  6. 服务账户遵循最小特权,能用 gMSA 用 gMSA。
  7. 关键变更管控:服务配置更改进入 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”。更好的结构:

  1. 初始权限与令牌信息(whoami /priv /groups)
  2. 根因(哪条 ACL、哪项策略、哪个服务)
  3. 利用条件(版本、是否需重启、是否需交互)
  4. 证据(配置导出、事件 ID、时间线)
  5. 业务影响(可否触达域管、备份、敏感数据)
  6. 修复验证(修完后复测同一路径失败)

这样开发与运维才修得动。


六、实验环境设计建议

若要在内训中安全地练这三类能力,建议搭建:

  1. 域控 + 1 台工作站 + 1 台成员服务器(快照充足)。
  2. 故意配置三条靶标:
    • 一个未加引号路径的自定义服务(仅实验机);
    • 一个可写目录的演示服务;
    • 一个带 SeImpersonate 的低权服务账户场景。
  3. 安装 Sysmon + 转发日志,学员先做检测规则,再做攻击演示。
  4. 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 运营

  • 月度提权路径复测(配置型)
  • 补丁合规
  • 红蓝后回写检测规则

八、应急:怀疑已被提权时做什么

  1. 隔离主机(断网但尽量保内存与日志)。
  2. 采集:whoami历史无关,直接拉事件日志、Sysmon、MFT、服务列表、计划任务、启动项。
  3. 检查:
    • 新增服务 / binPath 变更
    • 可疑 DLL 到系统进程
    • 本地管理员组成员变更
    • Defender 关闭或排除异常
  4. 重置本地管理员与相关服务账户密钥(LAPS 轮换)。
  5. 若有域横向迹象:按域应急流程查黄金票据、异常登录、GPO 篡改。
  6. 重装或黄金镜像恢复高信任主机(跳板、PAW、域控周边)。

提权成功后的环境,默认按不可信处理,不要只“杀毒清理”了事。


九、结语

Windows 权限提升里,最能长期骗人的不是某一个公开 bypass 名字,而是这三类结构性问题:

  1. 令牌机制被合法业务功能带着走——有模拟特权的账户一旦能骗到 SYSTEM 回连,就会发生质变;
  2. UAC 被当成安全边界——不收回本地管理员,绕过研究就永远有客户;
  3. 服务以 SYSTEM 跑又配了用户可写——这是最朴素、也最稳定的提权与持久化土壤。

对攻击者(授权测试)而言,秩序应是:

查令牌特权 → 查服务/任务 ACL 与路径 → 再谈 UAC 边界 → 最后才是漏洞利用。

对防守者而言,秩序应是:

收回本地管理员 → 收紧服务与任务的 ACL → 审计特权与进程链 → 再叠加 ASR/WDAC/凭据防护。

把本文的检测点与加固清单落到组策略和 SIEM 规则后,你会发现:
很多“炫技型提权”在规范环境里根本走不通;而真正让你失眠的,依旧是那一个对Everyone可写的第三方服务路径。