深入解析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;

安全描述符包含:

  1. 安全标识符(SID):标识用户、组和计算机账户的唯一号码
  2. 自主访问控制列表(DACL):定义允许/禁止的访问权限
  3. 系统访问控制列表(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:

  1. 如果ACE明确拒绝访问,立即返回拒绝
  2. 如果ACE明确允许访问,累积权限
  3. 如果没有匹配的ACE,默认拒绝访问

重要说明

  • DACL为NULL:任何用户都有完全访问权限
  • DACL为空:任何用户都无权访问

访问令牌(Access Token)

令牌类型:

  1. 主令牌(Primary Token):与进程关联的主要令牌
  2. 模拟令牌(Impersonation Token):临时模拟其他用户的令牌

令牌包含:

  • 会话ID
  • 用户和组列表
  • 特权列表
  • 令牌类型
  • 模拟级别
  • 默认DACL

重要特权

  • SeImpersonatePrivilege
  • SeAssignPrimaryTokenPrivilege
  • SeDebugPrivilege
  • SeBackupPrivilege
  • SeRestorePrivilege

令牌模拟级别

  1. SecurityAnonymous:无法模拟客户端
  2. SecurityIdentification:可获取客户端信息但无法模拟
  3. SecurityImpersonation:可在本地模拟客户端
  4. SecurityDelegation:可在本地和远程系统模拟客户端

创建进程的函数对比

函数 所需特权 输入类型
CreateProcessWithLogon 域/用户名/密码
CreateProcessWithToken SeImpersonatePrivilege 主令牌
CreateProcessAsUser SeAssignPrimaryTokenPrivilege和SeIncreaseQuotaPrivilege 主令牌

0x02 Windows RPC远程过程调用

RPC(Remote Procedure Call)框架组件:

  1. 客户端(Client):服务调用方
  2. 客户端存根(Client Stub):参数打包和网络传输
  3. 服务端存根(Server Stub):接收并解包消息
  4. 服务端(Server):实际服务提供者

RPC调用流程

  1. 客户端调用本地接口
  2. 客户端存根序列化参数
  3. 通过网络发送到服务端
  4. 服务端存根反序列化消息
  5. 调用本地服务
  6. 返回结果序列化
  7. 结果返回客户端
  8. 客户端反序列化结果

0x03 PrintSpoofer攻击技术

攻击原理

PrintSpoofer利用Windows打印后台处理程序服务(Spooler)的RPC接口和命名管道模拟机制实现权限提升。

关键步骤

  1. 攻击者创建恶意命名管道
  2. 诱使高权限账户(如SYSTEM)连接该管道
  3. 通过ImpersonateNamedPipeClient获取高权限令牌
  4. 使用模拟令牌创建高权限进程

Printer Bug技术细节

MS-RPRN协议中的关键RPC接口:

DWORD RpcRemoteFindFirstPrinterChangeNotificationEx(
    PRINTER_HANDLE hPrinter,
    DWORD fdwFlags,
    DWORD fdwOptions,
    wchar_t *pszLocalMachine,
    DWORD dwPrinterLocal,
    RPC_V2_NOTIFY_OPTIONS *pOptions)

利用方法

  1. 默认通知管道路径:\\.\pipe\spoolss
  2. 通过特殊构造的pszLocalMachine参数绕过路径检查:
    • 使用\\server_name/hack格式
    • 系统将/转换为\,最终路径变为\\server_name\hack\pipe\spoolss
  3. 使高权限服务连接攻击者控制的命名管道

攻击执行流程

  1. 检查当前用户是否具有SeImpersonatePrivilege特权
  2. 创建恶意命名管道
  3. 调用RpcRemoteFindFirstPrinterChangeNotificationEx,构造特殊路径参数
  4. 等待SYSTEM账户连接命名管道
  5. 使用ImpersonateNamedPipeClient获取SYSTEM令牌
  6. 使用DuplicateTokenEx复制令牌
  7. 使用CreateProcessWithToken创建SYSTEM权限进程

防御措施

  1. 禁用不必要的Print Spooler服务
  2. 限制SeImpersonatePrivilege和SeAssignPrimaryTokenPrivilege权限
  3. 应用最新的安全补丁
  4. 监控异常的命名管道创建和RPC调用

0x04 参考链接

  1. Microsoft Access Tokens Documentation
  2. Microsoft DACLs Documentation
  3. Microsoft Security Descriptor Documentation
  4. PrintSpoofer技术详解
Windows权限控制与PrintSpoofer攻击技术深入解析 0x00 前言 本文深入探讨Windows权限控制机制和PrintSpoofer攻击技术。首先详细介绍Windows访问控制模型和RPC远程过程调用,然后分析PrintSpoofer攻击原理及实现方式。 0x01 Windows权限控制 访问控制模型核心组件 Windows访问控制模型由两个主要部分组成: 访问令牌(Access Token) :访问者拥有的安全凭证 安全描述符(Security Descriptor) :被访问对象的安全属性 安全描述符(Security Descriptors, SD) 安全描述符数据结构: 安全描述符包含: 安全标识符(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接口: 利用方法 : 默认通知管道路径: \\.\pipe\spoolss 通过特殊构造的 pszLocalMachine 参数绕过路径检查: 使用 \\server_name/hack 格式 系统将 / 转换为 \ ,最终路径变为 \\server_name\hack\pipe\spoolss 使高权限服务连接攻击者控制的命名管道 攻击执行流程 检查当前用户是否具有SeImpersonatePrivilege特权 创建恶意命名管道 调用RpcRemoteFindFirstPrinterChangeNotificationEx,构造特殊路径参数 等待SYSTEM账户连接命名管道 使用ImpersonateNamedPipeClient获取SYSTEM令牌 使用DuplicateTokenEx复制令牌 使用CreateProcessWithToken创建SYSTEM权限进程 防御措施 禁用不必要的Print Spooler服务 限制SeImpersonatePrivilege和SeAssignPrimaryTokenPrivilege权限 应用最新的安全补丁 监控异常的命名管道创建和RPC调用 0x04 参考链接 Microsoft Access Tokens Documentation Microsoft DACLs Documentation Microsoft Security Descriptor Documentation PrintSpoofer技术详解