Kerberoasting
Overview

Kerberoasting là một kĩ thuật lateral movement/privilege escalation trong môi trường AD, nhắm vào Service Principal Names (SPN) accounts. SPNs là unique identifiers mà Kerberos sử dụng để map một service instance với một service account có context service đang chạy.
Domain accounts thường được sử dụng để chạy các dịch vụ xác thực qua network với built-in account như NT AUTHORITY\LOCAL SERVICE.
Tất cả domain user nào cũng có thể request Kerberos ticket cho bất kì service account nào trong cùng domain. Tất cả những gì attacker cần để thực hiện Kerberoasting attack là cleartext password hoặc NTLM hash, một shell trong context của domain user account hoặc SYSTEM level trên một máy joined domain.
Domain account chạy services thường là local administrator, do tính phân tán của hệ thống, các interactive services và data transfers, service accountscos thể được granted administrator privilege trên nhiều hosts. Nhiều services yêu cầu đặt quyền cao, vì vậy service accounts được thêm vào các privileged groups giống như domain admins hoặc từ các nested membership. Việc tìm kiếm SPNs được liên kết với các highly privileged accounts trong môi trường AD rất phổ biến.
Việc truy xuất Kerberos ticket cho account với một SPN không cho phép attacker execute command trong context của account này. Tuy nhiên, ticket (TGS-REP) được encrypted bằng NTLM hash của service account, vì vậy cleartext password có thể lấy bằng cách kĩ thuật offline brute-force attack bằng công cụ như Hashcat.
Service account thường được cấu hình với weak password hoặc reused với mục đích đơn giản hóa quản trị và đôi khi còn giống với username. Nếu password của một domain SQL server service account bị cracked, attacker có thấy mình đang là local admin của nhiều máy trên servers. Ngay cả khi crack một ticket từ Kerberoating attack được một low-privileage user account, attacker có thể sử dụng nó để tạo service ticket cho service được chỉ định trong SPN. Ví dụ, nếu SPN được set thành MSSQL/SRV01, attacker có thể truy cập vào MSSQL service với tư cách là sysadmin, enable xp_cmdshell và execute command trên SQL server.
Tham khảo bài talk của Tim Medin tại Derbycon 2024: https://youtu.be/PUyhlN-E5MU
Performing the Attack
Tùy thuộc vào vị trí trong network mà attacker có thể thực hiện thao các cách sau:
Từ một máy linux không nằm trong domain-joined sử dụng credential của domain user.
Từ một máy linux nằm trong domain-joined làm root sau khi truy xuất được keytab file.
Từ một máy Windows đã domain-joined được authenticated từ một domain user.
Từ một máy Windows đã domain-joined với shell của context domain account.
Là SYSTEM của một máy Windows đã domain-joined.
Từ một máy Windows không nằm trong domain-joined sử dụng runas /netonly.
Các công cụ hỗ trợ việc attack:
Impacket-GetUserSPNs từ một máy linux không domain-joined.
Buit-in setspn.exe, PowerShell, Mimikatz.
Từ Windows sử dụng các tools như PowerView, Rubeus và các PowerShell scripts khác.
Một TGS ticket lấy được từ Kerberoasting sẽ không hẳn có được credential hợp lệ và ticket vẫn phải được crack offline thu được cleartext password. TGS ticket sẽ mất nhiều thời gian crack hơn so với các định dạng khác như NTLM hash, vì vậy thông thường khó có thể crack được trừ khi sử dụng mật khẩu yếu.
Kerberoasting with GetUserSPNs.py
Bắt đầu thu thập danh sách SPNs trong domain, để làm điều này, ta sẽ cần một set các domain credentials hợp lệ và IP address của domain controller. Ta có thể xác thực với DC bằng cleartext password, NT password hash hoặc bằng Kerberos ticket.
Lấy tất cả TGS ticket sử dụng flag -request.
Lấy TGS ticket cho một user cụ thể, sử dụng flag -request-user.
Save vào file sử dụng flag -outputfile.
Cracking the Ticket Offline with Hashcat
Confirm password:
Enumerating SPNs with setspn.exe
Trước khi Rubeus tồn tại, thì việc stealing Kerberos ticket khá là phức tạp và phải thực hiện thủ công.
Ta sẽ nhận thấy nhiều SPNs khác nhau được trả về cho các hosts khác nhau trong domain. Target sẽ tập trung vào các user account và bỏ qua các computer account. Tiếp theo là sử dụng PowerShell, có thể lấy được request TGS ticket cho một account trong shell và load nó và memory.
Add-Type cmdlet được sử dụng để thêm class .NET framework vào PowerShell session, sau đó có thể được init giống như bất kì .NET framework object nào.
-AssemblyName parameter chỉ định một assembly có chứa type được sử dụng.
System.IdentityModel là một namespace chứa các class khác nhau trong việc build security token services.
New-Object cmdlet để tạo một instance của .NET Framework object.
System.IdentityModel.Tokens kết hợp với KerberosRequestorSecurityToken class để tạo security token và pass SPN name cho class để request một Kerberos TGS ticket cho session đang logon.
Bây giờ có thể sử dụng Mimikatz để extract tickets từ memory.
Sử dụng kirbi2john.py để extract Kerberos ticket từ TGS file.
Chuyển sang format để Hashcat thực hiện crack.
Sử dụng Hashcat.
Nếu ta quyết định bỏ qua base64 output với mimikatz # kerberos::list /export, file .kirbi sẽ được ghi vào disk. Trong trường hợp này, ta có thể sử dụng kirbi2join.py để bỏ qua bước base64 decoding.
Using PowerView to Enumerate SPN Accounts
Từ đây ta có thể chọn được target một user account cụ thể và truy xuất TGS ticket với format của Hashcat.
Using PowerView to Target a Specific User
Exporting All Tickets to a CSV File
Rubeus
Có thể sử dụng Rubeus để thực hiện Kerberoasting attack nhanh hơn và dễ dàng hơn.
Một số options bao gồm:
Thực hiện Kerberoasting attack và output hash vào file.
Sử dụng alternate credentials.
Thực hiện Kerberoasting attack kết hợp với pass-the-ticket attack.
Kerberoasting để lọc ra các AES-enabled accounts.
Đặt giới hạn về ticket được requested.
Thực hiện AES Kerberoasting attack.
Sử dụng Rubeus để request ticket cho các accounts có attribute admincount được set là 1.
Thêm flag /nowrap để hash copy dễ hơn.
Các tools hỗ trợ Kerberoasting attack thường yêu cầu RC4 encryption khi thực hiện attack và request TGS-REQ. Bởi vì RC4 yếu hơn và dễ crack hơn bằng Hashcatso với các thuật toán mã hóa khác như AES-128 và AES-256. RC4 sẽ có dạng $krb5tgs$23$* (type 23). AES-256 sẽ có dạng $krb5tgs$18$* (type 18).
Ví dụ account này đang sử dụng ETypes là RC4_HMAC_DEFAULT.
Kiểm tra bằng PowerView, msDS-SupportedEncryptionTypes được set là 0.
Tham khảo: https://techcommunity.microsoft.com/t5/core-infrastructure-and-security/decrypting-the-selection-of-supported-kerberos-encryption-types/ba-p/1628797
Với giá trị 0 mặc định tức là define mặc định là RC4_HMAC_MD5.

Nếu SPN account được set trong AD có support Kerberos AES 128/256 encryption, thì giá trị msDS-SupportedEncryptionTypes là 24.
Hashcat lúc này sẽ sử dụng mode 19700, đó là Kerberos 5, etype 18, TGS-REP (AES256-CTS-HMAC-SHA1-96)
Tham khảo: https://hashcat.net/wiki/doku.php?id=example_hashes
Với flag /tgtdeleg ta chỉ muốn RC4 encryption khi request một service ticket mới.

Mặc dù account support AES 128/256 nhưng tool vẫn request RC4 ticket.
Có thể chỉnh sửa các encryption types sử dụng cho Kerberos. Mở Group Policy, chỉnh sửa Default Domain Policy.
Computer Configuration > Policies > Windows Settings > Security Settings > Local Policies > Security Options
Sau đó double-click và Network security: Configure encryption types allowed for Kerberos.

Continuing Onwards
Access vào host qua RDP hoặc WinRM với tư cách là local user hoặc local admin.
Authenticate một remote host với admin sử dụng công cụ như PsExec.
Có quyền access vào những file share nhạy cảm
Có quyền truy cập vào MSSQL với DBA user, từ đó có thể escalate privileges.
Last updated