在 Windows 操作系统中,SeBackupPrivilege (备份文件和目录)和 SeRestorePrivilege (还原文件和目录)是两个极其强大的用户权限(Privilege),它们允许持有者在备份/还原语义下绕过 NTFS 文件系统的标准访问控制列表(DACL/ACL),从而读取或写入几乎任意文件,包括那些被 SYSTEM、TrustedInstaller 或高保护级别文件所守护的敏感资源(如 SAM、SYSTEM、NTDS.dit 等)。
这两个特权通常授予 Administrators 和 Backup Operators 组成员,但默认情况下处于 Present(存在)但 Disabled(未启用) 状态。Microsoft 的设计原则是"最小特权"(Least Privilege):特权必须显式启用才能生效,以防止意外或恶意滥用。
一、核心原理:Privilege 的 Present vs Enabled 状态
Windows Token(访问令牌)中的每个特权都有两种主要状态(通过 whoami /priv 查看):
- Present(存在):用户/组被授予该特权,但进程启动时默认 Disabled。
- Enabled (启用):进程通过
AdjustTokenPrivilegesAPI 主动启用后,系统才会真正允许绕过 ACL 检查。
Microsoft 官方文档强调 :SeBackupPrivilege 和 SeRestorePrivilege 在使用时必须 Enabled,否则系统仍会执行标准 ACL 检查。
关键机制:
- 当进程以 FILE_FLAG_BACKUP_SEMANTICS 标志调用
CreateFile时,系统会检查调用者 Token 是否拥有并已启用 SeBackupPrivilege(读)或 SeRestorePrivilege(写)。 - 如果特权仅 Present 但 Disabled ,即使指定备份标志,
CreateFile也会失败(Access Denied),除非工具内部自动调用启用 API。
SeBackupPrivilege 具体赋予的访问权(当启用时):
- READ_CONTROL、ACCESS_SYSTEM_SECURITY、FILE_GENERIC_READ、FILE_TRAVERSE 等。
- 完全绕过读 ACL 检查,但写/其他操作仍受 ACL 限制。
SeRestorePrivilege 具体赋予的访问权(当启用时):
- WRITE_DAC、WRITE_OWNER、ACCESS_SYSTEM_SECURITY、FILE_GENERIC_WRITE、FILE_ADD_FILE、FILE_ADD_SUBDIRECTORY、DELETE 等。
- 完全绕过写 ACL 检查,甚至允许设置任意所有者(包括修改 TrustedInstaller 保护文件的所有权)。
二、几种打法对比
以下四种最经典手法,基于内核行为、API 调用链和社区/红队多年实测。
| 打法序号 | 手法名称 | 读/写类型 | 所需特权(必须拥有) | 是否必须手动启用(Enabled)? | 内部机制与自动启用说明 | 典型场景 & 风险 |
|---|---|---|---|---|---|---|
| 1 | reg save HKLM\SAM / SYSTEM | 纯读 | SeBackupPrivilege | 不需要 | RegSaveKey API 内部自动调用 AdjustTokenPrivileges 启用特权,只要特权 Present 且进程 Elevated 即可成功 | 本地/域成员机 hash dump,最低噪音 |
| 2 | robocopy /b + diskshadow 影子拷贝 | 读+写 | SeBackup + SeRestore | 不需要 | robocopy.exe 内部在 /b 模式下自动启用两者(BackupRead + BackupWrite API) | 域控 NTDS.dit / locked 文件 |
| 3 | 粘连键(sethc.exe)/Utilman.exe 替换 | 纯写 | SeRestorePrivilege | 需要 | 普通 copy/rename 不带备份语义,必须手动启用 SeRestore 才能覆盖受保护文件(无自动机制) | 登录屏 SYSTEM cmd 提权 |
| 4 | Copy-FileSeBackupPrivilege (DLL) | 纯读 | SeBackupPrivilege | 需要 | 自定义 .NET 代码使用 CreateFile + FILE_FLAG_BACKUP_SEMANTICS,必须显式调用 Set-SeBackupPrivilege | 任意文件读取,最灵活 PoC |
打法1:reg save
- API 调用链 :
RegSaveKey→ 内核以备份模式打开 registry hive 文件(本质是文件读操作)。 - 为什么不需要手动启用 :
reg.exe作为系统内置工具,在检测到需要备份语义时,会自动对当前 Token 执行AdjustTokenPrivileges启用 SeBackupPrivilege。 - 前提 :必须在 Elevated(管理员权限)cmd/PowerShell 中运行,否则 UAC 会阻挡。即使特权 Present,在非提升上下文中也可能失败。
示例:
cmd
reg save HKLM\SAM C:\temp\sam.hive
reg save HKLM\SYSTEM C:\temp\system.hive
打法2:robocopy /b
- API 调用链 :
CreateFile(带 FILE_FLAG_BACKUP_SEMANTICS)→BackupRead(源) +BackupWrite(目标)。 - 为什么不需要手动启用:robocopy.exe 是专为备份设计的内置工具,在解析到 /b 参数时,会主动启用 SeBackupPrivilege 和 SeRestorePrivilege。
- 影子拷贝配合:diskshadow 创建 Volume Shadow Copy(VSS),robocopy 从影子卷读取锁定文件(如 NTDS.dit)。
示例:
cmd
diskshadow /s shadow.txt
robocopy /b Z:\Windows\NTDS C:\temp ntds.dit
打法3:Utilman.exe / sethc.exe 替换
- 为什么必须手动启用 :普通
copy、xcopy、move、rename不指定 FILE_FLAG_BACKUP_SEMANTICS,因此不触发备份/还原语义检查。系统严格执行目标文件的写 ACL(通常 TrustedInstaller:Full + Administrators:RX)。 - 启用后效果:SeRestorePrivilege 赋予 WRITE_DAC / WRITE_OWNER / DELETE 等,允许覆盖 System32 下受保护 exe。
- 触发:锁屏后 Win+U → SYSTEM 权限 cmd。
示例(需先启用):
powershell
# 使用 gtworek/PSBits 的脚本
. .\Enable-SeRestorePrivilege.ps1
Enable-SeRestorePrivilege
copy /Y C:\Windows\System32\cmd.exe C:\Windows\System32\utilman.exe
打法4:Copy-FileSeBackupPrivilege
- 项目来源:giuliano108/SeBackupPrivilege(开源 PoC)。
- 为什么必须手动启用 :这是自定义 .NET 代码,使用
CreateFile+ FILE_FLAG_BACKUP_SEMANTICS +BackupReadAPI。不像内置工具,它不会自动启用特权。 - 使用步骤 :
- 上传 SeBackupPrivilegeUtils.dll 和 SeBackupPrivilegeCmdLets.dll。
Set-SeBackupPrivilege(内部调用 AdjustTokenPrivileges)。Copy-FileSeBackupPrivilege <源> <目标>。
- 优势:支持 UNC 路径(\dc\c$...),无需影子卷。
三、总结
- whoami /priv → 检查 Backup 和 Restore 是否 Present(即使 Disabled 也极大概率可用)。
- 首选 reg save → 自动、无需额外代码、最低检测风险。
- 域控 → robocopy /b → 自动双特权,获取域 hash 的核武器。
- 快速 shell → Utilman 替换 → 需手动启用 SeRestore,但成功后直接 SYSTEM。
- 灵活读取 → DLL PoC → 需手动启用,但支持任意路径。