Active Directory Saldırı Yüzeyi ve Güvenliği Part-1

Mehmet Oflaz
10 min readMay 27, 2020

Herkese merhabalar, konumuz Active Directory. Hangi durumlarda saldırılara müsait olduğunu ve bu açıkların nasıl kapatılacağından bahsedeceğiz. Aynı zamanda kendimize bir lab ortamı kuracağız ve testleri bunun üzerinden gerçekleştireceğiz. Active Directory’de saldırı ve güvenliğinden bahsetmeden önce active directory hakkında ön bilgi edinelim ve ardından kurulum aşamalarını part-1'de halletmiş olalım ki yazıyı okurken aynı zamanda uygulama kısımlarını da beraber yapalım. Öyleyse hemen KnowHow’lara geçelim.

func orginalLink(url) { return url; }

Active Directory kısaca ağ nesnelerini ve kullanıcı bilgilerini depolayan, bu bilgilere ulaşımı ve yönetilmesini kolaylaştıran bir servistir. Ağdaki kullanıcılara kurallar tanımlamak, paylaşılan dosya ve yazıcılara erişmek, ağda kimlik doğrulaması yapmak gibi işlemleri yerine getirmesi için oluşturulmuş servisler bütününe active directory diyebiliriz. Ortamda active directory’nin kurulu olduğu bir domain controller(dc) bulunur. Tüm kontroller dc üzerinden yapılır yani dc ele geçirilirse dc’den emir alan tüm ağ cihazları da ele geçirilmiş olur.

Sanal makine üzerinde active directory ortamımızı kuracağız ve 2 adet kullanıcı ekleyeceğiz. Bunlardan birisi local admin olacak ve windows 8.1 sanal makinesinde logon olacak. Bir tanede normal user ekleyeceğiz ve Windows 7 sanal makinesinde logon olacak. Active Directory için işletim sistemi olarak windows server 2012 R2 kullanacağız. Sanal makine olarak vmware kullanacağım.

Active Directory Kurulumu

1- İlk olarak windows server 2012 R2 iso indiriyoruz ve vmware üzerinde kurulumunu gerçekleştiriyoruz. Link-iso

2- Windows server 2012'i kurduktan sonra statik ip ataması yapıyoruz ve nat ağımızın gateway ip adresini veriyoruz. DNS yapılandırmasını domain controller üzerinde yapacağımız için kendi ip adresini(localhost) veriyoruz.

3- Server Manager bölümüne giriyoruz ve dashboard üzerinden “add roles and features” bölümüne tıklıyoruz.

3.1
3.2

4- Kurulum sihirbazında ilk 3 adımı nextledikten sonra “server roles” bölümünde resimdeki gibi kutuyu işaretleyip sonuna kadar next diyip install seçeneğine tıklıyoruz.

5- Kurulum tamamlandıktan sonra server manager penceresinde aşağıdaki gibi bildirim gelecektir. Bildirime tıkladıktan sonra ok ile gösterdiğim kısma tıklıyoruz.

6- Gelen kurulum ekranında yeni bir forest ekleyip domain adı belirliyoruz. Ardından parola belirleyip gelen her şeye next next install diyip işi bitiriyoruz. Kurulum bittikten sonra oto restart atacaktır.

6.1
6.2

Kullanıcı Ekleme

Server Manager → tools → Active Directory Users and Comp. bölümünden gui aracılığıyla ekleyebilirsiniz. El alışkanlığı açısından cmd üzerinden user eklemeyi yapalım.

net user Username Password /ADD /DOMAIN #Domaine kullanici ekleme
net group "Domain Admins" Username /ADD /DOMAIN #Domain Admin yap
Kullanıcı Ekleme

Buraya kadar sorunsuz geldiyseniz Windows 7 ve Windows 8.1 sanal makinelerini domain’e dahil edeceğiz.

Domain’e Dahil Etme

1- DNS adresini DC sunucunuzun ip adresi olarak girin

2- bilgisayar özelliklerine girdikten sonra aşağıdaki adımları tamamlayıp “tamam” dedikten sonra domain administrator hesabının parolasıyla onaylayın. Daha sonra bilgisayarı restartlayın.

2.1
2.2
2.3

Local Admin Yapma

Artık domain’e eklediğimiz kullanıcılardan bir tanesini local admin yapacağız. Windows 8.1'de kullanıcılardan biriyle oturum açıyoruz.

1- cmd’yi açıyoruz ve aşağıdaki komutu yazdıktan sonra domain administrator kullanıcı adı ve parolasını giriyoruz.

> netplwiz

2- Açılan pencerede “ekle” dedikten sonra aşağıdaki gibi doldurup “son” diyoruz.

2.1
2.2

Servis Hesabı Oluşturma (Kerberoasting Saldırısı Yapmak için Kullanıcılacak)

Ben Windows 10 Pro Build 2004 üzerine Sql Server kurulumu yaptıktan sonra managed servis account oluşturdum. Bunun için vakti olmayanlara oluşturulan hesaba SPN (Service Principal Name) girerek yine kerberoasting yapabiliyoruz.

1- Önce servis için bir kullanıcı oluşturun ve kullanıcıya sağ tıklayarak “properties” bölümünden “Attribute Editor” sekmesine geliyoruz.

Attibute Editor

2- “ServicePrincipalName” değeri gireceğiz. Aşağıdaki gibi “<username>/<DCNetBIOS-Name>.<domain-name>” şeklinde değeri yazıp ekliyoruz ve tamamdır.

DCSync Saldırısı için Local Admine Replicating Directory İzinlerinin Verilmesi

Bu izinlere sahip bir kullanıcının veya Domain Admin, Enterprise Admin yetkilerine sahip bir kullanıcı ele geçirildiğinde DcSync saldırısı yapılabilir.

NOT: Bu izin normalde local admine verilecek bir özellik değildir. Ama saldırı yaparken hatalı configurasyonlar olabileceği için her ihtimal denenebilir.

1- “User And Computers” aracını açın ve view kısmından “Advanced Features” seçiyoruz.

2- Aşağıdaki şekilde domain ismine sağ tıklayıp “Properties” bölümünü açıyoruz.

3- “Security” sekmesinden aşağıdaki adımları uyguluyoruz.

4- Önümüze gelen pencerede “Select a principal” dedikten sonra local admin hesabını seçiyoruz.

5- Kullanıcıyı seçtikten sonra Permission Enrty seçimleri aktif olacaktır. İşaret içine aldığım izinleri aktif ediyoruz.

Buraya kadar tamamsa tüm makinelerde SMB’yi aktif ederek lab kurulumu tamamlıyoruz.

~####################################################~

Eğer network iletişim protokolleri ve parola hashlerinin saklandığı dosyalar hakkında pek bilginiz yoksa okumaya devam edebilirsiniz.

~####################################################~

SMB Nedir?

Ağ iletişim protokolü olan SMB local ağ üzerinde dosya ve yazıcı paylaşımı için geliştirilmiş bir servistir. Active directory çıkmadan önce SMB Microsoft’un Windows ağı olarak biliniyordu. Şimdi Active Directory yapısında daha güncel sürümleriyle beraber kullanılması gerekmektedir.

SMB 139 ve 445 bağlantı noktalarını kullanmaktadır. Windows 2000 den sonraki sürümlerde 445 bağlantı noktası kullanılmaktadır. Port 139 NetBIOS üzerinde çalışır ve geriye yönelik uyumluluk(ağda yeni smb sürümlerini desteklemeyen cihazlar var ise) için kullanılır.

SMB Protokolü Nasıl Başlatılır?

Ağ ve Paylaşım Merkezinden gelişmiş paylaşım ayarlarında ağ ve paylaşımı aç dediğimizde smb protokolünü başlatmış oluyoruz.
Windows Güvenlik Duvarı Gelişmiş Özelliklerden baktığımızda 445 ve 139 portunun gelen-giden kurallarının aktif olduğunu görürüz.

Ağ ve Paylaşım Merkezinde ağ üzerinde paylaşım yapan bilgisayarlar aşağıdaki gibi görünmektedir.

NOT: Parola kullanımlı paylaşımı açtığımızda ve local kullanıcınızın parolası yoksa remote bağlantılarda(ftp, rdp, smb vb.) boş parola ile erişim yapamazsınız. Bunun sebebi Windows’un güvenlik için “yerel grup ilkelerinde (‘run → gpedit.msc’)” boş parola kullanımını yalnızca konsol kullanımı için sınırla seçeneğinin etkin olmasından dolayıdır ve etkin olması gerekmektedir.

Parolasız bir kullanıcının paylaşımlarına ulaşılmaya çalışıldığında kullanıcı adını yazıp boş parola girdiğimizde çıkan uyarı bu şekildedir. Buradaki uyarı ile kullanıcı adının doğru olduğu ama parolasının olmadığını tespit edebiliriz.

Parolasız paylaşım yapıldığında anonim erişimin olduğu yani ağdaki herkesin bu paylaşımlara ulaşabileceği unutulmamalıdır.

Linux’ta smbmap ile parolasız bir paylaşımında klasorlerin görünümü *no-access olan dizinlere erişim iznimiz yok.

*NOT*: Şuan Active Directory ortamından bağımsız çalışıyoruz ve DNS yapılandırması olmayan bir ortamda SMB’nin ip çözümlemesi için NetBIOS ya da LLMNR kullanacağı anlamına geliyor. Sonuçta ağda bir kaynağa ulaşmaya çalıştığımızda o kaynağın ip adresinin sorgulanması gerekmektedir. O yüzden ağ üzerinde iletişimi anlamak için aşağıdaki maddeleri bilmeniz önemli yani kesin bilin.

Biz bir ağ kaynağına ulaşmak istediğimizde, name resolution(isim çözümlemesi) için aşağıdaki adımlar izlenir, bu adımlar bir bütün değil aslında hedefe erişmek için bir önceki adım sağlanamazsa bir sonraki adıma geç şeklinde ilerler;

  1. Yapılan isteğin ulaşmak istediğimiz yerel bilgisayar adı için olup olmadığı kontrol edilir.
  2. Local makinemizin ön belleğinde önceden isim çözümlemesi yapılmış olan kaynaklar var mı diye bakılır.
  3. Eğer ilk iki adım sağlanamazsa yerelde depolanan ip adresleri için local “hosts” dosyasına bakılır ve ulaşılmak istenilen hedefin ip adresi aranır.
  4. Oda yoksa yapılandırılmış bir DNS sunucusu sorgulanır.
  5. LLMNR aktif ise multicast LLMNR(5355/UDP) sorgusu yapılır.
  6. NetBIOS aktif ise NetBIOS ismini çözümlemek için multicast olarak NetBIOS-NS(137/UDP) sorguları yerel subnet’e yayınlanarak ad çözümlemesi yapılır.

NetBIOS Nedir?

NetBIOS: Network Basic Input/Output, yerel ağ üzerinde farklı bilgisayarların birbirleriyle iletişim kurmasını sağlayan bir sistemdir. OSI Modelinin “Session(Oturum)” katmanında çalışır. Windows’ta bilgisayarımıza verdiğimiz isim NetBIOS ismidir. Aynı ağ üzerindeki bilgisayarların iletişimi (biraz sonra wireshark’ta göreceğiz) NetBIOS isminin “NetBIOS Name Server” üzerinde isim sorgulaması yapılıp hangi ip’ye ait olduğunu öğrenecek ve ağ paylaşımı yapan ilgili bilgisayara yönlendirecektir. Ağda İki Bilgisayarda Aynı İsme Sahip İse Ne Olur?

LLMNR Nedir?

LLMNR: Link Local Multicast Name Resolution yerel ağ üzerinde istemcinin ulaşmaya çalıştığı hedefin ip adresini öğrenmek için isim çözümlemesi yapmasını sağlayan bir protokoldür. Ağda yapılandırılmış bir DNS sunucusu yoksa LLMNR protokolü ile haberleşme sağlanabilir.

Şimdi ağ üzerindeki dosya paylaşımları sırasında hangi protokoller çalışmaktadır bunları “wireshark” ile inceleyerek burada gördüğümüz paketleri ve protokollere bir göz atacağız.

DNS veya herhangi bir name resolution için yapılandırma dosyası olmadığı bir networkte “SMB”, “LLMNR” ve “NetBIOS” paketlerinin nasıl göründüğüne bakalım.

Ağdaki Kullanıcılar ve IP adresleri;

  • Daemon — 192.168.211.21 (Windows 8.1)
  • ILKBAHAR — 192.168.211.30 (Windows 7)
  • Analizci — 192.168.211.136 (Kali Linux)

Daemon kullanıcısı olarak, ILKBAHAR Kullanıcısının paylaşımlarına bakmaya çalıştığımızda ağ üzerinde hangi istekler yapılmakta?

1- Ulaşılmak istenen kaynak hedef için broadcast yayını yapıldı ve öyle bir hedefin olduğu tespit ediliyor.

Yukarıdaki isteği yaptığımız anda NBNS (NetBIOS Name Server-137/UDP) paketinin yollandığını yani ‘ILKBAHAR isimli kullanıcının ip adresi ne?’ Sorgusu yapılmaktadır ve LLMNR sorgusunda da aynı şekilde ‘ILKBAHAR isimli kullanıcı kim?’ şeklinde sorgu yapılmaktadır. Burada hem LLMNR için hemde NetBIOS için iki çözümleme protokolününde çalıştığını görüyoruz.

SMB üzerinde doğru konfigurasyonlar yapılmadığı durumlarda bu protokollerin aktif olması NBT-NS/LLMNR poisoning’e yol açacak.

SMB Paketlerine baktığımızda “Daemon”, “ILKBAHAR” kullanıcısının dizinine erişmek için istekte bulunmuş ama kullanıcı adı ve parolayı yanlış girdiği için bağlantı sağlanamamıştır.

Paylaşılan klasörlere eriştiğimizde “Wireshark” çıktısı nasıl oluyor?

Kullanıcı Adı ve Parola girerek paylaşılan klasörlere eriştik ve
ilk baştaki paketler “Negatiate Protocol Response” ile SMB versiyon 2 olduğunu tanıtmaktadır ve kırmızı işaretli alanda 192.168.211.21(Daemon) kullanıcısının “\\ILKBAHAR\IPC$” dizinine ulaştığı bilgisi görünmektedir. Aslında “ILKBAHAR” yerine ip adresini “\\192.168.211.21\IPC$” yazmaktan farkı yoktur. NetBIOS adının çözümlenmesi bu işe yaramaktadır.

Not: Bakın windows 8.1(Daemon) smb 3.02 desteği varken smb2 ile konuşmakta yani windows7'de(ILKBAHAR) smb 2.1 desteği olduğu için düşük olan sürüme göre gerçekleşti.

Şimdi windows’un authentication işlemlerini sağlarken kullanılan ntlm hash’lerinin nerelerde tutulduğuna bakalım. Part-2'de saldırı aşamasında o dosyaları neden “dump etmek” istediğimizi anlamanızı sağlayacak.

%systemroot%: Windows dizinini belirtmektedir. Root dizini olarakta geçer.

SAM dosyası “%systemroot%\system32\config\SAM” dosya yolunda bulunur. Windows işletim sistemlerinde local kullanıcıların lm ve ntlm parola karmalarını tutmaktadır.

LSASS “%systemroot%\system32\” dizini altında çalışan Windows işletim sistemlerinde güvenlik politikalarının uygulanmasından sorumlu bir işlemdir. Kimlik doğrulama, parola değişikliklerini yönetme ve token oluşturma işlemlerinden sorumludur. NT Authority/System yetkisiyle çalışmaktadır. Bu servis üzerinden oturum bilgilerini(lm:ntlm hashleri vs.) ele geçirmek mümkündür. Görev yöneticisinde “lsass.exe” olarak çalıştığını görebilirsiniz.

LSA Secrets: Local Security Authority tarafından kullanılan kullanıcıların sistemde oturum açması, local güvenlik politikalarını yönetilmesi, denetlemesi ve kimlik doğrulaması gibi işlemlerin yapılması için kimlik bilgilerinin depolandığı ve sadece NT Authority/System tarafından erişilebilen alandır. Domain Controller kayıtları, Internet Explorer şifreleri, SQL ve Cisco şifreleri, RAS bağlantı şifreleri gibi kimlik bilgileri registery’de HKEY_LOCAL_MACHINE\SECURITY\Policy\Secrets” altında tutulur.

NTDS/ntds.dit: ntds.dit dosyası active directory’nin veritabanıdır. Kullanıcı bilgileri, parola hashleri bu dosyada tutulur. Active Directory kurulumunda dikkat ettiyseniz veritabanı dosyaları, log dosyaları ve sysvol yani group policy dosyalarının hangi konuma kurulsun diye seçenek gelmişti. Aşağıdaki resimdende görebileceğimiz gibi ntds.dit %SystemRoot%\NTDS dizini altında tutulmaktadır. Dolayısıyla bu dosya Domain Controller üzerinde yer almaktadır.

Active Directory kurulum sırasında database folder, log files folder ve SYSVOL folder’ların nereye kurulacağını sorduğu bir ekran görüntüsü

Yukarıdaki dosya ve process’ler mimikatz ile dump edilerek oturum bilgileri ele geçirilebilir yada impacket modülünün içerisinde secretsdump.py ile dump edilebilmektedir. Burada uygulamalı olarak gösterilmiş kaynak bırakıyorum.

Kerberos Nedir?

Azerot@Kerberos:/$

Kerberos ağdaki kullanıcıların kimliklerini doğrulamak ve güvenliği arttırmak için geliştirilmiş bir protokoldür. Active Directory’i kurduğumuzda Kerberos servisinin (88/TCP) portunda çalıştığını gözlemledik. Kerberos, KDC (Key Distribution Center) yani anahtar dağıtım merkezidir. Kullanıcıdan alınan kimlik bilgilerini AS(Authentication Service) ile doğrular. TGT(Ticket-Granting Ticket) adı verilen bir bilet gönderir. TGT gönderilmeden önce zaman damgası vurulur ve kullanıcının parolasıyla encrypt edilir daha sonrada kullanıcıya gönderilir. Kullanıcı bir kaynağa ulaşmak istediğinde aldığı bu bileti tekrar KDC’nin içinde bunulan TGS(Ticket-Granting Service)’ye gönderir ve zaman damgası kontrol edilir, geçerlilik süresini yitirmemiş ise TGS kullanıcıya servise ulaşması için bilet yollar.

Daha ayrıntılı haliyle:

  1. Kullanıcı kimlik bilgileri clear text olarak AS’ye yollanır. AS böyle bir kullanıcının veritabanında olup olmadığını kontrol eder.
  2. AS istemciye sadece parolasıyla açabileceği bir secret-key oluşturur. İstemciye iki mesaj gönderir. Kullanıcı parolasıyla şifrelenmiş TGS’de oturum alabilmesi için istemci/TGS Oturum Anahtarı ve sadece TGS’nin çözebileceği bir gizli anahtar ile TGT mesajını şifreleyerek gönderir. TGT’nin içerisinde yer alan bilgiler; istemci adı, istemci ağ adresi, geçerlilik süresi ve istemci/TGS oturum anahtarı.
  3. İstemci almış olduğu TGS oturum anahtarını kendi parolasıyla açar. Bu sayede TGS’ye erişim için gerekli olan anahtara sahip olur. TGT’yi istemci kendi tarafında açamaz çünkü TGS’nin gizli anahtarı ile şifrelenmiştir ve sadece TGS açabilir.
  4. İstemci servis talebinde bulunacağında TGS’ye talep ettiği servis adını, TGS oturum anahtarıyla şifrelenmiş ( istemci adı, istemci ağ adresi, geçerlilik süresi ve İstemci/Sunucu Oturum Anahtarı) bilgilerini ve TGT’yi yollar.
  5. TGS aldığı TGT mesajını kendi anahtarıyla açar ve içerisinde istemcide bulunan TGS/oturum anahtarını elde eder. Bu sayede istemci tarafında şifrelenerek gönderilen bilgileri oturum anahtarı ile çözebilir ve doğrulama işlemini yapabilir. Doğrulamayı yaptıktan sonra,
  6. TGS istemciye istemci/sunucu bileti yani servise ulaşması için gerekli bileti yollar. Bu bilet içerisinde (istemci adı, istemci ağ adresi, geçerlilik periyodu ve istemci/Sunucu Oturum Anahtarı) bilgileri yer alır.
  7. İstemci aldığı istemci/sunucu oturum biletini servise yollar ve servis tarafında önceden dağıtılan secret-key ile bilet decrypt edilir. Sunucu bileti doğrular ve böylelikle istemciye kaynaklarını sunar.

Planıma göre part-2'de saldırı aşamalarını part-3'te saldırı aşamalarının flashback’lerine dönerek güvenlik önlemlerini konuşuyor oluruz. O zamana kadar görüşmek üzere ~~

func orginalLink(url) { return url; }

References

Active Directory Nedir?
https://cloudbunny.net/Active-Directory-nedir-Ne-amacla-kullanlr-492.html
https://docs.microsoft.com/en-us/windows-server/identity/ad-ds/get-started/virtual-dc/active-directory-domain-services-overview

NetBIOS Nedir?
https://bidb.itu.edu.tr/seyir-defteri/blog/2013/09/07/netbios
https://www.nedir.com/netb%C4%B1os

LLMNR Nedir?
http://agciyiz.net/link-local-multicast-name-resolution-llmnr/
https://en.wikipedia.org/wiki/Link-Local_Multicast_Name_Resolution

Windows Credential Dumping
https://ired.team/offensive-security/credential-access-and-credential-dumping

Kerberos Nedir?
https://tr.wikipedia.org/wiki/Kerberos_(ileti%C5%9Fim_kural%C4%B1)

--

--