
Cepat atau lambat, selama pentest, tugas muncul untuk mengkompromikan seluruh hutan - asalkan ada hak di salah satu domain. Pada saat-saat seperti itu, banyak pertanyaan muncul tentang kepercayaan, sifat mereka dan serangan itu sendiri. Mari kita coba mencari tahu semuanya.
Kepercayaan antar domain digunakan untuk mengautentikasi pengguna dari satu domain pada pengontrol domain lain. Dengan kata lain, agar pengguna dari domain A dapat memiliki akses ke sumber daya domain B. Struktur domain dapat terdiri dari dua jenis:
- Pohon domain
- hutan domain.

Saat membuat pohon domain antar domain, secara default trust transitif dibuat. Semua komputer memiliki kesamaan:
- katalog global
- namespace
- skema
Pohon domain dapat digabungkan menjadi hutan. Saat membuat hutan domain, trust transitif didirikan, dan semua komputer di hutan berbagi yang berikut:
Tabel di bawah ini menunjukkan jenis kepercayaan antara domain dan propertinya.
Lebih jelasnya, jenis perwalian antar domain diilustrasikan dalam gambar di bawah ini.

Transitivitas
Transitivitas diperlukan untuk mendefinisikan kepercayaan di luar dua domain di mana ia dibentuk, dan digunakan untuk memperluas hubungan kepercayaan dengan domain lain. Jika kami menambahkan domain anak ke domain, hubungan kepercayaan dua arah dibuat antara domain induk dan anak. Hubungan ini bersifat transitif, mis. jika domain A mempercayai domain D dan domain D mempercayai domain E, maka domain A juga mempercayai domain E.

Kepercayaan nontransitif dapat digunakan untuk menolak kepercayaan dengan domain lain.
Arahan
Jalur hubungan trust adalah serangkaian hubungan trust antara domain tempat permintaan otentikasi harus diterima. Dengan kata lain, sebelum mengautentikasi pengguna, kepercayaan antar domain ditentukan. Bagi pengguna domain A untuk mengakses sumber daya domain D, domain D harus mempercayai domain A.
Arah kepercayaan ada dua jenis:
Kepercayaan satu arah adalah jalur otentikasi satu arah yang dibuat antara dua domain. Dalam kepercayaan searah antara domain A dan domain B, pengguna di domain B memiliki akses ke sumber daya di domain A. Namun, pengguna di domain A tidak memiliki akses ke sumber daya di domain B. Jenis kepercayaan ini tidak transitif.
Kepercayaan bilateral adalah kombinasi dari dua hubungan kepercayaan searah. Dalam kepercayaan dua arah antara domain A dan B, pengguna mereka memiliki akses ke sumber daya dari kedua domain. Jenis kepercayaan ini transitif.
Arah kepercayaan selalu berlawanan dengan arah akses. Diagram perwakilan Microsoft di bawah ini:

Tautan untuk jenis kepercayaan yang lebih mendalam:
Kerberos antara domain tepercaya
Pertimbangkan sebuah contoh. Klien sedang mencoba mengakses Server.
Dari poin 1 hingga 3, tindakan standar terjadi saat menggunakan protokol Kerberos.- Kata sandi dikonversi ke hash NTLM, cap waktu dienkripsi dengan hash dan dikirim ke KDC sebagai autentikator dalam permintaan tiket TGT (AS-REQ). Pengontrol domain (KDC) memeriksa informasi pengguna dan membuat tiket TGT.
- Tiket TGT dienkripsi, ditandatangani, dan dikirim ke pengguna (AS-REP). Hanya layanan Kerberos (KRBTGT) yang dapat membuka dan membaca data dari tiket TGT.
- Seorang pengguna mengirimkan tiket TGT ke pengontrol domain saat meminta tiket TGS (TGS-REQ). Pengontrol domain membuka tiket TGT dan memeriksa checksum PAC.
Perubahan dimulai dari poin 4: tiket TGT antar-wilayah muncul, yang disebut tiket rujukan, yang dienkripsi / ditandatangani dengan kunci antar-wilayah yang dibuat dari kata sandi tepercaya. Kata sandi tepercaya ditetapkan saat kepercayaan dibangun dan diketahui oleh kedua pengontrol domain. Menggunakan tiket TGT antar-wilayah, pengguna domain 1 dapat meminta tiket TGS untuk mengakses sumber daya domain 2.

NTLM antara domain tepercaya

- Klien mengirim permintaan untuk otentikasi langsung ke sumber daya itu sendiri, yang terletak di domain lain, yang ingin diakses.
- Server menerima permintaan dari klien dan mengirimkannya respons CHALLENGE_MESSAGE, yang berisi urutan acak 8 byte. Ini disebut Tantangan Server.
- Klien, setelah menerima urutan Server Challenge dari server, mengenkripsi urutan ini dengan kata sandinya, dan kemudian mengirim respons ke server yang berisi 24 byte.
- Server mengirimkan permintaan dan respons ke pengontrol domain B.
- Dalam kasus otentikasi antar trust, logika berikut dilakukan:
- Memeriksa Hubungan Trust Arah.
- Kredensial klien dikirim ke domain A untuk mengautentikasi.
- Jika tidak ada hubungan kepercayaan, maka Transitivitas diperiksa dengan domain A.
- Verifikasi Transitivitas antar Domain
- Jika ada transitivitas antar domain, permintaan otentikasi dikirim ke domain berikutnya di jalur kepercayaan. Pengontrol domain ini mengulangi prosesnya, memeriksa kredensial pengguna terhadap database akun keamanannya.
- Jika tidak ada transitivitas, pesan akses ditolak dikembalikan ke klien.
6-8. Jawaban dengan keputusan untuk mengotentikasi klien.
Serangan antara trust di antara domain
Jadi, untuk melakukan serangan, kami membutuhkan informasi tentang mempercayai hubungan di domain kami.
Daftar Trust
Ada 3 metode utama untuk daftar kepercayaan di domain:
- melalui API Win32;
- melalui metode .NET;
- melalui LDAP.
Win32 API
Enumerasi dilakukan dengan memanggil fungsi DsEnumerateDomainTrusts , yang mengembalikan struktur DS_DOMAIN_TRUSTSA . Dengan menggunakan metode ini, SID dan GUID dari domain target, tanda dan atribut yang menandai kepercayaan saat ini di domain dikembalikan.
BloodHound mengumpulkan informasi menggunakan metode Win32 API.

.Net
Metode GetCurrentDomain dari namespace [System.DirectoryServices.ActiveDirectory.Domain] digunakan, yang mengembalikan sebuah instance dari kelas System.DirectoryServices.ActiveDirectory.Domain . Kelas ini mengimplementasikan metode GetAllTrustRelationships , yang mengembalikan semua trust untuk domain saat ini.
([System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain()).GetAllTrustRelationships()
Menggunakan metode ini diimplementasikan dalam modul Get-DomainTrust di PowerView .

Salah satu kelebihan dari metode ini adalah kesederhanaannya. Informasi mudah dibaca dan dipahami, tetapi volumenya jauh lebih kecil daripada saat melakukan penghitungan dengan metode lain.
LDAP
Informasi kepercayaan domain disimpan di Active Directory sebagai objectClass dari kelas Domain tepercaya .
Contoh penggunaan:
dsquery * -filter "(objectClass=trustedDomain)" -attr *

PowerView menggunakan metode ini secara default.

Dengan informasi tentang domain dan jenis kepercayaan, Anda dapat langsung menuju ke serangan itu sendiri. Pertimbangkan 2 opsi:
- Kami berhasil mengompromikan domain, dan kami memiliki hak administrator domain.
- Kami tidak memiliki hak administrator domain.
Dengan hak administrator ke salah satu domain
Bergantung pada domain yang disusupi, beberapa vektor serangan dapat dibedakan:
Perlu dicatat bahwa untuk keberhasilan implementasi semua vektor, diperlukan kepercayaan bilateral antar domain.
1. Riwayat Operasi SID
SID History diperkenalkan untuk memfasilitasi migrasi pengguna dari satu domain ke domain lain. Atribut berisi objek SID sebelumnya. Setiap kali suatu objek bergerak dari satu domain ke domain lain, SID baru dibuat, yang menjadi objectSID. SID sebelumnya ditambahkan ke properti sIDHistory.
Setiap hutan memiliki grup pengguna Admin Perusahaan yang hanya ada di domain root dan memiliki hak administrator lokal pada pengontrol domain semua domain anak di hutan. Serangan ini pertama kali ditunjukkan oleh Sean Metcalf di BlackHat USA 2015 . Inti dari serangan itu adalah kami mengeluarkan tiket Emas dengan tambahan SID tambahan dari grup Admin Perusahaan. Ini dilakukan dengan menambahkan ExtraSids dalam struktur KERB_SID_AND_ATTRIBUTES , yang dikirim dalam struktur KERB_VALIDATION_INFO .

Demo Serangan:

Impacket memiliki skrip yang mengotomatiskan semua ini.
2. Tiket Emas + Grup Admin Perusahaan
Memiliki hak administrator dalam domain Root, kami dapat membuat Tiket Emas dengan tambahan pengguna ke grup Admin Perusahaan (519).
Kerberos::golden /domain:<domain> /sid:<domain_SID> /krbtgt:<ntlm_hash_krbtgt_user> /user:<user> /groups:500,501,513,512,520,518,519 /ptt
Seperti dijelaskan di atas, Admin Perusahaan memiliki hak administrator lokal untuk domain DC Child. Dengan demikian, kami akan dapat mengkompromikan semua domain Anak di hutan.
3. Pengoperasian tiket trust
Untuk mengakses sumber daya menggunakan protokol Kerberos, Anda memerlukan tiket TGS, yang dienkripsi dengan hash NTLM dari kata sandi akun layanan. Pengontrol domain hanya menyimpan hash kata sandi pengguna untuk domainnya, jadi ketika pengguna dari domain A membutuhkan akses ke sumber daya di domain B, kunci antar-dunia digunakan. Kunci ini dibuat berdasarkan kata sandi tepercaya, yang ditetapkan saat membuat hubungan saling percaya antara domain di hutan yang sama. Di basis data kata sandi (NTDS.dit) pada pengontrol domain, Anda dapat menemukan pengguna dengan tanda $ di bagian akhir. Kata sandi mereka juga digunakan untuk membuat kunci antar-dunia. Untuk membuat tiket TGT antar-wilayah, kita memerlukan kata sandi akun ini.
Kerberos::golden /user:<user> /domain:<domain> /sid:<sid_domain> /sids:<extra_sid_entrprice_admin_group_from _another_domain> /aes256:<aes256_trust_user_password> /service:krbtgt /target:<target_domain> /ptt
Demo Serangan:

Serangan itu sangat relevan ketika layanan IS memperhatikan ancaman dan mengubah kata sandi krbtgt 2 kali. Dalam hal ini, kami akan dapat membuat tiket emas menggunakan kata sandi tepercaya antar domain.
4. Bug Printer
Protokol Remote Sistem Cetak Windows (MS-RPRN) memiliki metode RpcRemoteFindFirstPrinterChangeNotification (Ex) diaktifkan secara default, yang memungkinkan Anda untuk memaksa otentikasi pada komputer mana pun yang menjalankan layanan Pengumpul Informasi di host yang ditentukan menggunakan host Kerberos atau protokol NTLM. Dalam kasus c NTLM, kita dapat menjalankan NTLM-relay, atau mulai memecahkan kata sandi komputer (tidak pernah dihapus). Dalam kasus Kerberos, diperlukan mesin kompromi dengan delegasi tanpa batas. Lalu kita bisa mengambil tiket TGT dan mengembangkan serangan.
Demo Serangan:

Gambar di bawah ini menunjukkan langkah-langkah yang ditunjukkan dalam video.

Kami tidak memiliki hak administrator domain
Sedikit teori. Carlos Garsia dalam laporannya memberikan tabel yang sangat bagus yang menggambarkan sifat-sifat berbagai jenis kelompok.

Dari fitur-fiturnya, perlu dipertimbangkan bahwa AD Domain Lokal dan Grup AD Global direplikasi tanpa anggota grup ke katalog global, dan grup AD Universal direplikasi dengan pengguna.
Karena cara kelompok-kelompok tersebut disebutkan oleh Katalog Global, hasil dari tautan balik [yaitu pencarian dapat bervariasi, tergantung pada apakah Anda mencari Katalog Global (port 3268) atau domain (port 389), jenis dari grup milik pengguna (grup global vs. grup lokal domain).
Jika kami tidak memiliki hak administrator domain, kami menghitung objek. Kami tertarik pada:
- Pengguna domain lain yang memiliki hak administrator lokal pada mesin di domain kami.
- Pengguna dari domain lain yang merupakan anggota grup domain pengguna. Grup yang berisi pengguna dari domain lain.
- Kepala Sekolah ACL Asing.
1. Pengguna domain lain yang memiliki hak administrator lokal pada mesin di domain kami
Cari pengguna dari domain lain yang merupakan administrator lokal di host di domain kami di BloodHound:
MATCH (c:Computer) OPTIONAL MATCH p1 = (u1)-[:AdminTo]->(c) WHERE NOT u1.domain = c.domain WITH p1,c OPTIONAL MATCH p2 = (u2)-[:MemberOf*1..]->(:Group)-[:AdminTo]->(c) WHERE NOT u2.domain = c.domain RETURN p1,p2

Perintah di PowerView :
Get-NetLocalGroupMember <server>
2. Pengguna dari domain lain, terdiri dari grup domain pengguna. Grup yang berisi pengguna dari domain lain
Seperti disebutkan di atas, pengguna yang hanya anggota grup Universal direplikasi ke katalog global. Untuk mendemonstrasikan fitur ini, kami akan meminta grup dalam katalog global yang berisi setidaknya satu pengguna dan permintaan ldap langsung ke pengontrol domain.
Get-DomainGroup -Properties name, grouptype, member, DistinguishedName -LDAPFilter '(member=*)' -SearchBase "GC://jet.lab"

Saat menjalankan kueri ke katalog global, kami hanya melihat satu grup Grup Universal dengan tipe AD Universal dari domain one.jet.lab.
Jika kami menjalankan kueri LDAP langsung ke one.jet.lab, kami akan melihat grup lain dengan tipe AD Domain lokal dan AD Global.

Ini penting untuk dipertimbangkan saat menghitung pengguna dan grup.
Perintah di PowerView :
Get-DomainForeignUser -Domain <Domain> Get-DomainForeignGroupMember -Domain <Domain>


3. Prinsipal ACL Asing
Deskriptor keamanan ntSecurityDescriptor (https://docs.microsoft.com/en-us/windows/win32/adschema/a-ntsecuritydescriptor) dapat diakses oleh semua pengguna dari domain tepercaya dan direplikasi ke katalog global. Dengan demikian, kami dapat meminta semua DACL untuk semua objek dalam mempercayai domain dan memfilter pengguna dari domain lain.
Get-DomainObjectAcl -Domain jet.lab -ResolveGuids | ?{$_.SecurityIdentifier -like 'SID_Domain*'}

Jadi, kami berhasil mengidentifikasi pengguna Mike dari domain forestc.lab, yang memiliki hak untuk Grup Global di domain jet.lab.
Penyaringan PS SID dan Otentikasi Selektif digunakan untuk perlindungan antar hutan. Serangan antara hutan dengan SID Filtering mengaktifkan dirkjan di blog - nya . Juga pada 9 Juli, Microsoft merilis pembaruan yang menonaktifkan delegasi TGT antar hutan secara default. Sekarang semuanya, cerita dengan delegasi tanpa batas dan kompromi satu hutan dari yang lain menggunakan protokol Kerberos tidak lagi berfungsi.