一次域内 Kerberoasting 攻击的检测与加固实录

记一次通过 SPN 枚举 + Kerberoasting 窃取域管哈希的真实入侵路径,以及事后检测规则落地与约束委派加固的全流程复盘。

问题背景

某制造企业内网 AD 域(Windows Server 2019 域控 + Windows 11 工作站)长期运行。安全团队在例行红蓝对抗演练中发现:攻击者仅用一个普通域用户账号,即可在 4 分钟内枚举出 17 个高权限服务账号的 Kerberos 票据,并成功破解其中 3 个域管理员等效权限的哈希。整个过程未触发任何杀毒或 EDR 告警,暴露了「仅依赖边界防火墙 + 终端杀毒」的传统防御体系对域内横向移动的严重盲区。

故障现象

  1. SPN 枚举无感:攻击者使用 setspn.exe -T domain -Q */* 或 BloodHound 在普通域用户权限下即可列出所有注册 SPN 的服务账号(包括 SQL、Exchange、IIS 应用池账号)。
  2. Kerberoasting 低权限即可执行:使用普通域账号请求目标服务账号的 TGS 票据,票据中包含服务账号的 NTLM 哈希加密部分,可离线破解。
  3. 破解成功率高:3 个服务账号密码为弱口令或「公司名+年份」模式,John the Ripper 在 30 秒内即破解成功,获得域管理员权限。
  4. 无告警:全程未触发 Windows Defender、深信服 EDR 或 SIEM 规则,安全运营团队完全不知情。

排查过程

第一步:确认攻击路径

使用 BloodHound 导入域控导出数据,绘制攻击图:

  • 起点:普通域用户 corp\li
  • 中间:corp\sqlsvc(SQL Server 服务账号,SPN 注册 MSSQLSvc/sql01.corp.local
  • 终点:corp\domainadmin(域管理员组成员)

第二步:复现 Kerberoasting

在测试机上以普通域用户身份执行:

1
2
3
4
5
6
# 请求 TGS 票据
Add-Type -AssemblyName System.IdentityModel
New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList "MSSQLSvc/sql01.corp.local"

# 导出票据
kerberos::list /export

导出 .kirbi 文件后,使用 kirbi2john.py 转换为 John 格式,成功在 22 秒内破解出明文密码 Corp2023!

第三步:定位防御缺失

  • Windows Defender:默认仅监控已知恶意工具(mimikatz、Rubeus),对 setspn + kerberos::list 的组合无特征。
  • EDR:深信服 EDR 未配置「异常 SPN 请求频次」与「低权限账号请求高权限服务票据」的关联规则。
  • 域控审计Audit Kerberos Authentication ServiceAudit Kerberos Service Ticket Operations 均未开启,事件 ID 4768/4769 缺失。

解决方案

1. 立即止血(当天完成)

  • 重置所有高权限服务账号密码(长度 ≥ 25 字符,包含大小写+数字+符号)。
  • 禁用不必要的 SPN(仅保留必要服务账号的 SPN)。
  • sqlsvciissvc 等服务账号启用 约束委派(Constrained Delegation),禁止非约束委派。

2. 检测规则落地(3 天内)

在域控上启用高级审计策略:

1
2
3
# 启用 Kerberos 相关审计
auditpol /set /subcategory:"Kerberos Authentication Service" /success:enable /failure:enable
auditpol /set /subcategory:"Kerberos Service Ticket Operations" /success:enable /failure:enable

部署 SIEM(或 Windows Event Forwarding + WEF)规则:

  • 规则 1:5 分钟内同一源 IP 请求 ≥ 10 个不同 SPN 的 TGS 票据 → 高危告警。
  • 规则 2:普通域用户请求注册在高权限组(Domain Admins / Enterprise Admins)成员账号的 TGS 票据 → 立即告警。
  • 规则 3Event ID 4769Ticket Options 包含 0x40810000(可转发票据)且目标服务账号不在白名单 → 告警。

3. 长期加固(2 周内)

  • 密码策略差异化:服务账号强制使用 组管理服务账号(gMSA) 或至少 30 字符随机密码 + 定期轮换。
  • 约束委派白名单:仅允许必要服务(如 SQL Server 访问文件服务器)配置约束委派,禁止任意服务账号拥有非约束委派权限。
  • LAPS + JIT 管理:所有服务器本地管理员密码改用 LAPS,域管理员日常使用普通账号 + JIT 提权(Privileged Access Workstation + Just-In-Time)。
  • BloodHound 定期扫描:每月运行 BloodHound,标记「Kerberoastable」高风险账号,纳入季度加固计划。

根因分析

根本原因在于域内默认信任模型 + 服务账号密码弱 + 缺乏 Kerberos 流量审计三者叠加:

  1. AD 域默认允许任何已认证用户请求任意服务账号的 TGS 票据(Kerberos 协议设计如此)。
  2. 早期为方便运维,服务账号密码设置简单且长期未轮换。
  3. 安全团队对「域内横向移动」场景缺乏针对性检测规则,仅依赖终端杀毒与边界防护。

预防措施

措施 优先级 预期效果
服务账号改用 gMSA 或 ≥30 字符随机密码 P0 彻底杜绝 Kerberoasting 破解可能
启用域控 Kerberos 高级审计 + SIEM 规则 P0 攻击行为 5 分钟内可发现
约束委派白名单化 + 禁用非约束委派 P1 降低票据转发风险
每月 BloodHound 扫描 + 红蓝对抗演练 P1 持续发现配置漂移
域管理员日常操作使用 PAW + JIT P2 降低域管凭据长期驻留风险

总结

本次 Kerberoasting 攻击复盘再次印证:域内安全不是「杀毒 + 防火墙」就能解决的。只要服务账号密码可被破解、SPN 可被枚举、Kerberos 流量无审计,攻击者就能在极短时间内完成从普通用户到域管理员的权限提升。

真正的防御在于把「默认可被攻击」的状态变成「需要配置才能攻击」——通过 gMSA、约束委派、Kerberos 审计、BloodHound 持续扫描,把 Kerberoasting 从「低成本高成功率」变成「高成本低成功率」,才能真正守住域内最后一道防线。


参考资料

使用 Hugo 构建
主题 StackJimmy 设计