安全技术 | 域渗透之SPN
字数 1336 2025-08-20 18:18:40
域渗透之SPN与Kerberoasting攻击详解
一、SPN基础概念
1. SPN定义
SPN(Service Principal Names)即服务主体名称,是服务实例(如HTTP、SMB、MySQL等服务)的唯一标识符。在Kerberos身份验证中,SPN用于将服务实例与服务登录帐户相关联。
2. SPN类型
SPN分为两种注册类型:
- 机器账户(Computers)下注册:当服务权限为Local System或Network Service时,SPN注册在机器账户下
- 域用户账户(Users)下注册:当服务权限为域用户时,SPN注册在域用户账户下
3. SPN格式
标准SPN格式为:serviceclass/host:port/servicename
例如:MSSQLSvc/sqlsrv.test.com:1433
二、SPN注册机制
1. 默认权限
- 域内机器账户默认有权注册SPN
- 普通域用户账户默认无权注册SPN
2. SQL Server的特殊情况
SQL Server在每次启动时都会尝试用自己的启动账号注册SPN:
- 使用"Local System account"启动:Kerberos能够成功,因为可以在DC上注册SPN
- 使用普通域用户启动:Kerberos失败,因为SPN注册不上去
3. 为域账号赋予SPN权限
在DC上需要为域账号赋予以下权限才能注册SPN:
- "Read servicePrincipalName"
- "Write serverPrincipalName"
三、SPN发现技术
1. 使用Setspn工具
Setspn -Q */*
2. 使用PowerShell
# 加载必要程序集
Add-Type -AssemblyName System.IdentityModel
# 请求特定SPN的TGS
New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList "MSSQLSvc/sqlsrv.test.com:1433"
四、Kerberoasting攻击详解
1. 攻击原理
- 任何域内主机用户或普通域用户都可以查询SPN
- 向域内所有服务请求TGS票据
- 对获取的TGS票据进行离线暴力破解
- 只有域用户下的SPN票据破解后可用于远程连接
2. 攻击步骤
步骤1:发现SPN
使用上述SPN发现技术识别域内服务
步骤2:请求SPN票据
使用PowerShell请求特定服务的TGS票据
步骤3:导出票据
使用Mimikatz导出Kerberos票据:
mimikatz # kerberos::list /export
步骤4:破解票据
使用kerberoast工具破解:
python3 tgsrepcrack.py pass.txt "2-40a10000-w10a$@MSSQLSvc~sqlsrv.test.com~1433-TEST.COM.kirbi"
3. 高级攻击手法
如果获得有权注册SPN的域账号,可以手动注册SPN进行Kerberoasting攻击
五、防御措施
1. 权限控制
- 严格控制"Write serverPrincipalName"权限的分配
- 限制普通用户注册SPN的能力
2. 账户策略
- 对服务账户使用强密码策略
- 定期轮换服务账户密码
3. 监控与检测
- 监控异常的SPN查询请求
- 检测异常的TGS请求模式
- 实施Kerberos事件日志监控
4. 最佳实践
- 对关键服务使用组托管服务账户(gMSA)
- 实施特权账户管理(PAM)解决方案
- 定期审计SPN配置
六、总结
SPN扫描和Kerberoasting攻击是域渗透中的重要技术,攻击者可以通过这些技术获取服务账户凭据,进而提升权限。理解SPN的注册机制和Kerberos认证流程对于防御此类攻击至关重要。通过严格的权限控制、强密码策略和有效的监控措施,可以显著降低此类攻击的风险。