深入解析PrintSpoofer
字数 2612 2025-08-06 20:12:43
Windows权限控制与PrintSpoofer攻击技术深入解析
0x00 前言
本文深入探讨Windows权限控制机制和PrintSpoofer攻击技术。首先详细介绍Windows访问控制模型和RPC远程过程调用,然后分析PrintSpoofer攻击原理及实现方式。
0x01 Windows权限控制
访问控制模型核心组件
Windows访问控制模型由两个主要部分组成:
- 访问令牌(Access Token):访问者拥有的安全凭证
- 安全描述符(Security Descriptor):被访问对象的安全属性
安全描述符(Security Descriptors, SD)
安全描述符数据结构:
typedef struct _SECURITY_DESCRIPTOR {
BYTE Revision;
BYTE Sbz1;
SECURITY_DESCRIPTOR_CONTROL Control;
PSID Owner; // 所有者SID
PSID Group; // 组SID
PACL Sacl; // 系统ACL
PACL Dacl; // 自主ACL
} SECURITY_DESCRIPTOR, *PISECURITY_DESCRIPTOR;
安全描述符包含:
- 安全标识符(SID):标识用户、组和计算机账户的唯一号码
- 自主访问控制列表(DACL):定义允许/禁止的访问权限
- 系统访问控制列表(SACL):定义系统审核内容
安全标识符(Security Identifier, SID)
SID格式:S-[修订级别]-[权值]-[标识符]
常见内置SID:
- S-1-5-18 (LocalSystem)
- S-1-5-19 (LocalService)
- S-1-5-20 (NetworkService)
- S-1-5-32-544 (Administrators)
- S-1-5-32-545 (Users)
- S-1-5-32-550 (PrintOperators)
相对标识符(RID)示例:
- S-1-5-21-xxxx-xxx-500 (Administrator)
- S-1-5-21-xxxx-xxx-501 (Guest)
- S-1-5-21-xxxx-xxx-1004 (Workstation)
自主访问控制列表(DACL)
DACL由一系列访问控制条目(ACE)组成,系统按顺序检查ACE:
- 如果ACE明确拒绝访问,立即返回拒绝
- 如果ACE明确允许访问,累积权限
- 如果没有匹配的ACE,默认拒绝访问
重要说明:
- DACL为NULL:任何用户都有完全访问权限
- DACL为空:任何用户都无权访问
访问令牌(Access Token)
令牌类型:
- 主令牌(Primary Token):与进程关联的主要令牌
- 模拟令牌(Impersonation Token):临时模拟其他用户的令牌
令牌包含:
- 会话ID
- 用户和组列表
- 特权列表
- 令牌类型
- 模拟级别
- 默认DACL
重要特权:
- SeImpersonatePrivilege
- SeAssignPrimaryTokenPrivilege
- SeDebugPrivilege
- SeBackupPrivilege
- SeRestorePrivilege
令牌模拟级别:
- SecurityAnonymous:无法模拟客户端
- SecurityIdentification:可获取客户端信息但无法模拟
- SecurityImpersonation:可在本地模拟客户端
- SecurityDelegation:可在本地和远程系统模拟客户端
创建进程的函数对比:
| 函数 | 所需特权 | 输入类型 |
|---|---|---|
| CreateProcessWithLogon | 无 | 域/用户名/密码 |
| CreateProcessWithToken | SeImpersonatePrivilege | 主令牌 |
| CreateProcessAsUser | SeAssignPrimaryTokenPrivilege和SeIncreaseQuotaPrivilege | 主令牌 |
0x02 Windows RPC远程过程调用
RPC(Remote Procedure Call)框架组件:
- 客户端(Client):服务调用方
- 客户端存根(Client Stub):参数打包和网络传输
- 服务端存根(Server Stub):接收并解包消息
- 服务端(Server):实际服务提供者
RPC调用流程:
- 客户端调用本地接口
- 客户端存根序列化参数
- 通过网络发送到服务端
- 服务端存根反序列化消息
- 调用本地服务
- 返回结果序列化
- 结果返回客户端
- 客户端反序列化结果
0x03 PrintSpoofer攻击技术
攻击原理
PrintSpoofer利用Windows打印后台处理程序服务(Spooler)的RPC接口和命名管道模拟机制实现权限提升。
关键步骤:
- 攻击者创建恶意命名管道
- 诱使高权限账户(如SYSTEM)连接该管道
- 通过ImpersonateNamedPipeClient获取高权限令牌
- 使用模拟令牌创建高权限进程
Printer Bug技术细节
MS-RPRN协议中的关键RPC接口:
DWORD RpcRemoteFindFirstPrinterChangeNotificationEx(
PRINTER_HANDLE hPrinter,
DWORD fdwFlags,
DWORD fdwOptions,
wchar_t *pszLocalMachine,
DWORD dwPrinterLocal,
RPC_V2_NOTIFY_OPTIONS *pOptions)
利用方法:
- 默认通知管道路径:
\\.\pipe\spoolss - 通过特殊构造的
pszLocalMachine参数绕过路径检查:- 使用
\\server_name/hack格式 - 系统将
/转换为\,最终路径变为\\server_name\hack\pipe\spoolss
- 使用
- 使高权限服务连接攻击者控制的命名管道
攻击执行流程
- 检查当前用户是否具有SeImpersonatePrivilege特权
- 创建恶意命名管道
- 调用RpcRemoteFindFirstPrinterChangeNotificationEx,构造特殊路径参数
- 等待SYSTEM账户连接命名管道
- 使用ImpersonateNamedPipeClient获取SYSTEM令牌
- 使用DuplicateTokenEx复制令牌
- 使用CreateProcessWithToken创建SYSTEM权限进程
防御措施
- 禁用不必要的Print Spooler服务
- 限制SeImpersonatePrivilege和SeAssignPrimaryTokenPrivilege权限
- 应用最新的安全补丁
- 监控异常的命名管道创建和RPC调用