安全技术 | 域渗透之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认证流程对于防御此类攻击至关重要。通过严格的权限控制、强密码策略和有效的监控措施,可以显著降低此类攻击的风险。

域渗透之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工具 2. 使用PowerShell 四、Kerberoasting攻击详解 1. 攻击原理 任何域内主机用户或普通域用户都可以查询SPN 向域内所有服务请求TGS票据 对获取的TGS票据进行离线暴力破解 只有域用户下的SPN票据破解后可用于远程连接 2. 攻击步骤 步骤1:发现SPN 使用上述SPN发现技术识别域内服务 步骤2:请求SPN票据 使用PowerShell请求特定服务的TGS票据 步骤3:导出票据 使用Mimikatz导出Kerberos票据: 步骤4:破解票据 使用kerberoast工具破解: 3. 高级攻击手法 如果获得有权注册SPN的域账号,可以手动注册SPN进行Kerberoasting攻击 五、防御措施 1. 权限控制 严格控制"Write serverPrincipalName"权限的分配 限制普通用户注册SPN的能力 2. 账户策略 对服务账户使用强密码策略 定期轮换服务账户密码 3. 监控与检测 监控异常的SPN查询请求 检测异常的TGS请求模式 实施Kerberos事件日志监控 4. 最佳实践 对关键服务使用组托管服务账户(gMSA) 实施特权账户管理(PAM)解决方案 定期审计SPN配置 六、总结 SPN扫描和Kerberoasting攻击是域渗透中的重要技术,攻击者可以通过这些技术获取服务账户凭据,进而提升权限。理解SPN的注册机制和Kerberos认证流程对于防御此类攻击至关重要。通过严格的权限控制、强密码策略和有效的监控措施,可以显著降低此类攻击的风险。