Kerberos协议之Kerberoasting和SPN
填坑
在之前Kerberos的TGS_REQ & TGS_REP过程中提到,只要用户提供的票据正确,服务就会返回自身hash加密的tgs票据,那么如果我们有一个域用户,就可以申请服务的tgs票据,本地爆破服务hash得到服务密码,这个过程叫做Kerberoasting。而在域中,服务通过spn来作为唯一标识,所以本文介绍的是Kerberoasting和spn。
# SPN简介
SPN是服务器上所运行服务的唯一标识,每个使用Kerberos的服务都需要一个SPN
SPN分为两种,一种注册在AD上机器帐户(Computers)下,另一种注册在域用户帐户(Users)下
当一个服务的权限为Local System或Network Service,则SPN注册在机器帐户(Computers)下
当一个服务的权限为一个域用户,则SPN注册在域用户帐户(Users)下
# SPN的格式
|
|
- serviceclass可以理解为服务的名称,常见的有www, ldap, SMTP, DNS, HOST等
- host有两种形式,FQDN和NetBIOS名,例如server01.test.com和server01
- 如果服务运行在默认端口上,则端口号(port)可以省略
我这里通过 setspn -A MSSQLSvc/DM.test.local:1433 sqladmin
注册一个名为MSSQLSvc的SPN,将他分配给sqladmin这个域管账户
# SPN查询
spn查询实际上是通过ldap协议查询的,那么当前用户必须是域用户或者是机器账户。
|
|
CN=Users的是域账户注册的SPN,CN=Computers是机器账户。
域内的任意主机都可以查询SPN,任何一个域用户都可以申请TGS票据。而我们爆破的话应该选择域用户进行爆破,因为机器用户的口令无法远程链接。
那么Kerberoasting思路如下:
- 查询SPN寻找在Users下并且是高权限域用户的服务
- 请求并导出TGS
- 爆破
# Kerberoasting利用
首先需要寻找有价值的SPN
1 使用powerview
https://github.com/PowerShellMafia/PowerSploit/blob/dev/Recon/PowerView.ps1
|
|
2 使用powershell模块Active Directory
Active Directory只在域控的powershell上有
|
|
可以用三好学生师傅导出来的 https://github.com/3gstudent/test/blob/master/Microsoft.ActiveDirectory.Management.dll
|
|
3 使用kerberoast
powershell: https://github.com/nidem/kerberoast/blob/master/GetUserSPNs.ps1
vbs: https://github.com/nidem/kerberoast/blob/master/GetUserSPNs.vbs
参数如下:
|
|
4 请求TGS
请求指定服务的tgs
|
|
请求所有服务的tgs
|
|
5 导出TGS
|
|
6 破解TGS
https://github.com/nidem/kerberoast/blob/master/tgsrepcrack.py
|
|
7 Invoke-Kerberoast
不需要mimikatz,直接导出hash为hashcat能破解的。
|
|
hashcat
|
|
8 Rubeus
|
|
9 impacket
|
|
hashcat直接跑
# 参考
- https://3gstudent.github.io/%E5%9F%9F%E6%B8%97%E9%80%8F-Kerberoasting/
- https://uknowsec.cn/posts/notes/%E5%9F%9F%E6%B8%97%E9%80%8F-SPN.html
文笔垃圾,措辞轻浮,内容浅显,操作生疏。不足之处欢迎大师傅们指点和纠正,感激不尽。
如果你觉得这篇文章对你有所帮助,欢迎赞赏或关注微信公众号~