内网安全:Kerberoasting攻击和SPN服务
0x01 SPN
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)下
0x02 SPN发现
由于每台服务器都需要注册用于Kerberos身份验证服务的SPN
所以这是一个更加隐蔽的方法来收集有关内网域环境的信息
查询SPN服务,内网探测
对域控制器发起LDAP查询,这是正常kerberos票据行为的一部分,因此查询SPN的操作很难被检测
使用SetSPN
Win7和Windows Server2008自带的工具
查看当前域内的所有SPN:
1 | setspn.exe -q */* |
查看test域内的所有SPN:
1 | 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
其他命令:
1 | 查看当前域内所有的SPN:setspn -Q */* |
使用PowerShell脚本
- PowerShell-AD-Recon
该工具包提供了一些探测指定SPN的脚本,例如Exchange,Microsoft SQLServer等
1 | #扫描域中所有的SPN信息 |
- GetUserSPNs.ps1
Kerberoast 工具集中的一个 powershell 脚本,用来查询域内用户注册的 SPN
1 | Import-Module .\GetUserSPNs.ps1 |
- PowerView.ps1
PowerView是 PowerSpolit 中 Recon目录下的一个powershell脚本,返回的信息比较详细。
1 | Import-Module .\PowerView.ps1Get-NetUser -SPN |
0x03 Kerberoasting攻击
0x031基于Kerberos认证的原理:
基于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处请求服务票据,然后离线暴力破解。
0x032利用思路
域内的任何用户都可以向域内的任何服务请求TGS
域内的任何一台主机,都能够通过查询SPN,向域内的所有服务请求TGS,拿到TGS后对其进行暴力破解
对于破解出的明文口令,只有域用户帐户(Users)的口令存在价值,不必考虑机器帐户的口令(无法用于远程连接)
因此,高效率的利用思路如下:
- 查询SPN,找到有价值的SPN,需要满足以下条件:
- 该SPN注册在域用户帐户(Users)下
- 域用户账户的权限很高
- 请求TGS
- 导出TGS
- 暴力破解
0x033利用方法
一、自动实现,并且不需要mimikatz,普通用户权限即可
使用System.IdentityModel.Tokens.KerberosRequestorSecurityToken
请求TGS,在返回结果中提取出TGS,输出的TGS可选择John the Ripper或Hashcat进行破解
实例演示:
在域内一台主机上以普通用户权限执行:
1 | import-module .\Invoke-Kerberoast.ps1 |
只提取出hash的参数如下:
1 | Invoke-Kerberoast -AdminCount -OutputFormat Hashcat | Select hash | ConvertTo-CSV -NoTypeInformation |
使用hashcat破解的参数如下:
将导出的hashcat格式的哈希保存为hash.txt文件,放到hashcat的目录下
1 | hashcat64.exe -m 13100 hash.txt pass.txt |
二、使用 Rubeus
https://github.com/GhostPack/Rubeus
使用:
1 | Rubeus.exe kerberoast |
1 | C:\Rubeus>Rubeus.exe kerberoast |
0x034离线破解服务票据
将哈希保存为hash.txt文件,放到hashcat的目录下
1 | hashcat64.exe -m 13100 hash.txt pass.txt |
0x04 Kerberoast攻击防范
- 将默认的AES256_HMAC加密方式改为RC4_HMAC_MD5,增加破解难度
- 保证服务密码本身为强密码,关键是提高密码的强度。