域渗透之SPN服务主体名称
字数 1299 2025-08-15 21:33:44

SPN服务主体名称详解与域渗透技术

一、SPN基本概念

SPN (Service Principal Names)服务主体名称是服务实例(如HTTP、SMB、MySQL等服务)的唯一标识符。Kerberos认证过程使用SPN将服务实例与服务登录账户相关联。

关键特性

  • 每个服务实例必须有自己的SPN
  • 一个服务实例可以有多个SPN(对应不同名称或别名)
  • 一个用户账户下可以有多个SPN
  • 一个SPN只能注册到一个账户

二、SPN类型

  1. 注册在机器帐户(Computers)下

    • 服务权限为Local System或Network Service时注册
    • 每台域机器默认有两个SPN:HOST/主机名HOST/主机名.域名
  2. 注册在域用户帐户(Users)下

    • 服务权限为域用户时注册

三、SPN格式与示例

SPN格式

<service class>/<host>:<port>/<service name>

  • 必须元素

    • <service class>:服务名称(如WWW、MySQL、MSSQL等)
    • <host>:主机名(FQDN或NetBIOS名)
  • 可选元素

    • <port>:服务端口(默认端口可省略)
    • <service name>:服务名称(可省略)

常见服务SPN示例

# Exchange服务
exchangeMDB/ex01.xie.com

# RDP服务
TERMSERV/te01.xie.com

# WSMan/WinRM/PSRemoting服务
WSMAN/ws01.xie.com

四、SPN注册与管理

使用SetSPN工具

SetSPN是Windows内置工具,用于管理SPN注册。

注册SPN

# 以域用户身份注册
setspn -S SQLServer/win7.xie.com:1433 test
setspn -U -A SQLServer/win7.xie.com:1433 test

# 以主机身份注册
setspn -S SQLServer/win7.xie.com:1533/MSSQL win7

查询SPN

# 查看域内所有SPN
setspn -Q */*

# 查看指定域SPN
setspn -T xie.com -Q */*

# 查找重复SPN
setspn -X

# 查找指定用户/主机的SPN
setspn -L username/hostname

删除SPN

setspn -D MySQL/win7.xie.com:1433/MSSQL hack

五、SPN发现技术

1. PowerShell-AD-Recon工具

# 扫描MSSQL服务
Import-Module .\Discover-PSMSSQLServers.ps1
Discover-PSMSSQLServers

# 扫描Exchange服务
Import-Module .\Discover-PSMSExchangeServers.ps1
Discover-PSMSExchangeServers

# 扫描所有SPN
Import-Module .\Discover-PSInterestingServices.ps1
Discover-PSInterestingServices

2. GetUserSPNs工具

# PowerShell版本
Import-Module .\GetUserSPNs.ps1

# VBS版本
cscript .\GetUserSPNs.vbs

3. PowerView工具

Import-Module .\PowerView.ps1
Get-NetUser -SPN

4. PowerShellery工具集

# Get-SPN.psm1使用
Import-Module .\Get-SPN.psm1
Get-SPN -type service -search "*"
Get-SPN -type service -search "*" -List yes | Format-Table

# Get-DomainSpn.psm1使用
Import-Module .\Get-DomainSpn.psm1
Get-DomainSpn

5. RiskySPN工具

# 识别弱服务票据
Import-Module .\Find-PotentiallyCrackableAccounts.ps1
Find-PotentiallyCrackableAccounts -FullData -Verbose

# 查询域内所有SPN注册用户
Find-PotentiallyCrackableAccounts -Domain "xie.com"

六、Kerberos认证中的SPN流程

  1. 用户请求访问MySQL服务时,系统以当前用户身份向域控查询MySQL的SPN记录
  2. 找到SPN记录后,用户将KDC发放的TGT作为凭据发送给KDC,并提交需要访问的SPN
  3. KDC的TGS服务解密TGT,验证无误后:
    • 发放允许访问该SPN对应服务的ST服务票据
    • 返回该SPN对应服务的地址
  4. 用户使用ST票据访问MySQL服务

七、SQL Server SPN注册问题与解决

问题现象

  • 使用"Local System account"启动SQL Server:Kerberos成功(自动注册SPN)
  • 使用域用户启动SQL Server:Kerberos失败(无法自动注册SPN)

解决方案

  1. 手动注册SPN

    setspn -S MSSQLSvc/sqlserver.xie.com:1433 domainuser
    
  2. 最佳实践

    • 为SQL Server启动账户授予以下权限:
      • "Read servicePrincipalName"
      • "Write serverPrincipalName"

八、安全注意事项

  1. SPN扫描是kerberoasting攻击的第一步
  2. 红队可利用SPN扫描识别重要服务主机(如终端、交换机等)
  3. 应定期审计SPN注册情况,避免恶意注册
  4. 对服务账户使用强密码,防止kerberoasting攻击

九、参考资源

SPN服务主体名称详解与域渗透技术 一、SPN基本概念 SPN (Service Principal Names)服务主体名称是服务实例(如HTTP、SMB、MySQL等服务)的唯一标识符。Kerberos认证过程使用SPN将服务实例与服务登录账户相关联。 关键特性 每个服务实例必须有自己的SPN 一个服务实例可以有多个SPN(对应不同名称或别名) 一个用户账户下可以有多个SPN 一个SPN只能注册到一个账户 二、SPN类型 注册在机器帐户(Computers)下 : 服务权限为Local System或Network Service时注册 每台域机器默认有两个SPN: HOST/主机名 和 HOST/主机名.域名 注册在域用户帐户(Users)下 : 服务权限为域用户时注册 三、SPN格式与示例 SPN格式 <service class>/<host>:<port>/<service name> 必须元素 : <service class> :服务名称(如WWW、MySQL、MSSQL等) <host> :主机名(FQDN或NetBIOS名) 可选元素 : <port> :服务端口(默认端口可省略) <service name> :服务名称(可省略) 常见服务SPN示例 四、SPN注册与管理 使用SetSPN工具 SetSPN是Windows内置工具,用于管理SPN注册。 注册SPN 查询SPN 删除SPN 五、SPN发现技术 1. PowerShell-AD-Recon工具 2. GetUserSPNs工具 3. PowerView工具 4. PowerShellery工具集 5. RiskySPN工具 六、Kerberos认证中的SPN流程 用户请求访问MySQL服务时,系统以当前用户身份向域控查询MySQL的SPN记录 找到SPN记录后,用户将KDC发放的TGT作为凭据发送给KDC,并提交需要访问的SPN KDC的TGS服务解密TGT,验证无误后: 发放允许访问该SPN对应服务的ST服务票据 返回该SPN对应服务的地址 用户使用ST票据访问MySQL服务 七、SQL Server SPN注册问题与解决 问题现象 使用"Local System account"启动SQL Server:Kerberos成功(自动注册SPN) 使用域用户启动SQL Server:Kerberos失败(无法自动注册SPN) 解决方案 手动注册SPN : 最佳实践 : 为SQL Server启动账户授予以下权限: "Read servicePrincipalName" "Write serverPrincipalName" 八、安全注意事项 SPN扫描是kerberoasting攻击的第一步 红队可利用SPN扫描识别重要服务主机(如终端、交换机等) 应定期审计SPN注册情况,避免恶意注册 对服务账户使用强密码,防止kerberoasting攻击 九、参考资源 微软官方文档: Kerberos with SPN MS08067实验室官网:www.ms08067.com