域渗透之SPN服务主体名称
字数 1299 2025-08-15 21:33:44
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示例
# 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流程
- 用户请求访问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:
setspn -S MSSQLSvc/sqlserver.xie.com:1433 domainuser -
最佳实践:
- 为SQL Server启动账户授予以下权限:
- "Read servicePrincipalName"
- "Write serverPrincipalName"
- 为SQL Server启动账户授予以下权限:
八、安全注意事项
- SPN扫描是kerberoasting攻击的第一步
- 红队可利用SPN扫描识别重要服务主机(如终端、交换机等)
- 应定期审计SPN注册情况,避免恶意注册
- 对服务账户使用强密码,防止kerberoasting攻击
九、参考资源
- 微软官方文档:Kerberos with SPN
- MS08067实验室官网:www.ms08067.com