Active Directory Lab Build

Sistem özellikleri şu şekilde olmalı :

Eğer bunlar yoksa sorun değil yine de neler yapılacağını kayıt edelim daha sonra hackthebox vs gibi çözümler ileriki derslerde olacak. Ya da ucuz sunuculara kurulum yapabiliriz.

Gerekli iso ları indirmek için microsoft evaluation centera gidiyoruz ve buradan windows 10 enterprise ve windows server 2019 indiriyoruz. İkisinde de ISO Enterprise indiriyoruz. 64 bit seçiyoruz ve indiriyoruz.

Daha sonra indirdiğimiz ISO lardan SERVER_EVAL ISO yu vmware yüklüyoruz. Windows server 2016 60gb hafızayla kuruyoruz. Daha sonra floppy diski siliyoruz. NAT seçili olacak ve RAM de 2 gb olacak.

Daha sonra yüklemeden sonra server manager açılınca sağ üstte manage kısmına tıklıyoruz. Add Roles and Features kısmına geliyoruz ve iki kere next dedikten sonra Active Directory Domain Services seçip next next next diyoruz. Daha sonra yukarıda bir alert görünüyor ona tıklayınca çıkan promote this server to a domain controller yazısına tıklıyoruz. Add new forest diyoruz ve istediğimiz isim.local şeklinde isim veriyoruz. Daha sonra şifre belirliyoruz. Daha sonra birkaç next dedikten sonra install diyoruz. Yükleme bittikten sonra makine reboot edecek. Sonra açmak istediğimizde artık isim\Administrator olarak gelecek. Bu belirlediğimiz domaine admin olarak giriş yaptığımızı gösterir.

Daha sonra kullanıcı olarak iki makineye windows enteprise kuracağız.

Daha sonra tekrar domain controller makinemize dönüyoruz. Sonra tekrar server manager kısmına geliyoruz ve buradan toolsa tıklıyoruz. Açılan yerden de Active Directory Users and Computers kısmına tıklıyoruz. Solda isim.local kısmına tıkladığımızda birkaç farklı organizational unit görüyoruz. Daha sonra isim.local sağ tıklayıp oradan add organizational unit diyoruz ve groups diye isimlendiriyoruz. Daha sonra users altındaki security group bütün kullanıcıları buraya sürüklüyoruz.

Şimdi yeni bir user ekleyebiliriz. Users kısmına gelip sağ tıklayıp add user diyoruz. Bir kullanıcı ekledikten sonra adminin üzerine tıklayıp copy diyip yeni bir admin tanımlayabiliriz.

Kullanıcıları tanımladıktan sonra File And Storage Services kısmına tıklıyoruz. Sonra da share kısmına geliyoruz.Tasks kısmından new share ekliyoruz. Buradan SMB Share-Quick seçiyoruz.Next Next diyoruz.

Bunu da tamamladıktan sonra masaüstünden cmd çalıştırıyoruz. SPN oluşturacağız. Service Principle Name.

setspn -a HYDRA-DC/SQLService.Marvel.local:60111 MARVEL\SQLService

komutunu çalıştırıyoruz. Sonra da

setspn -T MARVEL.local -Q */*

komutunu çalıştırıyoruz. Set edildiğine dair bilgi karşımıza çıkıyor. Son olarak da başlattan Group Policy Management yazıp buluyoruz ve tıklıyoruz. Admin olarak çalıştırıyoruz.

Devamı labbuild videolarının sonuncusunda…

Active Directory

Bir kullanıcı adı ve şifreyle birkaç farklı servise giriş yapabiliriz. İşte bu verilerin tutulduğu deftere active directory denir.

Erişim içeriden olduğu için genellikle ciddi zayıflıklar barındırır. Evin dışına karşı korumalar vardır ama içerideki kapıların kilitlerini düşünmeyiz bunun gibidir.

Domain Controller herşeyi bilir ve authentication ve authorizateion sağlar.

Domain controllerda policy ve kullanıcı ekleyip çıkartılabilir. Domain controller genel olarak önemli birçok veriyi kontrol eder.

Data Store default olarak %SystemRoot%\NTDS altında bulunur. Hedef buna ulaşmaktır. Bütün kullanıcılar bilgiler vs buradan tutulur. Kullanıcı şifrelerinin hashleri vs hepsi burada olur.

Buradaki şema bir rule şeması gibidir. Her objenin nasıl oluşturulacağının vs kurallarının olduğu bir şemadır.

Küçük organizasyonlarda bir tane domain olur. Burada tutulur.

Tree ise birden fazla domainin olduğu durumdur. Aralarında bir hiyerarşi bulunur. Birisi parent olur diğerleri child olur.

Birden fazla treenin bir arada iletişim kurduğu alandır.

Bu basitçe containerlardır. Kullanıcıların olduğu, grupların olduğu vs ous lar oluşturulabilir.

Trusts ise her kullanıcının kaynaklara erişim biçimi miktarı ve yetkisini tanımlar.

Transitive birbirine güvenen iki domain varsa o domainlar birbirlerinin güvendikleri domainlere de güvenir.

Generating Shellcode And Gaining Root

Bu komutu kullanacağız. Bu toolda -p payload gösteriyor. Windows kullandığımız için windows payload kullanıyoruz. Reverse shell istiyoruz. Hedef bize geri bağlanacak bu yüzden LHOST veriyoruz ve port veriyoruz. -f c formatında çıktı istiyoruz demek. File = f. -a x86 => architecture , -b => bad characters. Bu komutu çalıştırdığımızda bize şöyle bir payload oluşturdu :

Bunu python scriptimize eklediğimizde shell hazır olacak. Burada payload size önemli olabilir çünkü bazen çok kısıtlı alanlara sahip olabiliriz.

Jump pointerdan sonra \x90 ile biraz tab bırakıyoruz böylece kendi çalıştığımız makinenin hafızasına zarar vermiyoruz. Hafızanın kısıtlı olduğu yerlerde bu alanı daraltabiliriz.

Daha sonra 4444 portunu dinlerken vulnserver’a payloadı atıyoruz ve root erişimi alıyoruz :

Finding Right Module

Bu derste de https://github.com/corelan/mona toolunu kullanacağız. Bunun için bu toolu(mona.py) indirip Bilgisayarım>Local Disk(C:) > Program Files(x86) > Immunity Inc > Immunity Debugger > PyCommands klasörünün içine atıyoruz. Daha sonra şu şekilde alttan komutu çalıştırıyoruz :

Burada bütün satırların false olduğu kısım bizim hedefimiz olabilecek alan. Şu an gözlemlediğimiz essfunc.dll dosyası tamamında false yazıyor. Memory protection yok ve vulnserver altında yer alıyor.

Daha sonra kali linuxtan ESP nin bulunduğu yeri alıyoruz. JMP komutu assembly’de o adrese zıplama anlamına geliyor.

Daha sonra debugger gelip tekrar şu kodu yazıyoruz :

Daha sonra burada return adresi alıyoruz. Python kodumuzu düzenliyoruz böylece doğrudan bizim malicious jump pointerımızı işaret edecek. Bunun için adresi tersten yazıyoruz :

Daha sonra debuggerdan o adrese bir breakpoint koyuyoruz. Böylece buffer doldurma oraya kadar gelecek ve orada duracak. Böylece tam oraya kadar gidip gitmediğimizi göreceğiz.

 

 

Finding Bad Characters

Shellcode oluştururken hangi kodların shellcode için iyi hangisinin kötü olduğunu anlamak için bad characters kullanıyoruz. Bütün bad characterleri çalıştırıp herhangi birisinden bir tepki alacak mıyız ona bakacağız. Google badchars yazınca karşımıza çıkan değişkeni alıyoruz :
badchars = (“\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f”
“\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40”
“\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f”
“\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f”
“\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f”
“\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf”
“\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf”
“\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff”)

Python kodumuzu şu şekilde düzenliyoruz :

Bu karakterleri çalıştırdığımızda eğer orada çalışan başka bir uygulama varsa hata oluşacaktır. Böylece orayı kullanmamış oluruz. Böylece EIP’den sonra bad chars gönderilecek.

Kodumuzu tekrar çalıştırdığımıza debuggerda şöyle görebiliyoruz durumu :

Hex dump kısmına baktığımızda bütün karakterlerin sırasıyla yerleştiğini görüyoruz. Yani burada herhangi bir bad char yok. Ama olsaydı sırayı bir noktada bozan olması gereken yerde olmayan bir karakter olacaktı. Örnek olarak burada 01 02 03 diye giderken B0 B0 B6 olmuş. Bu o bytelarda bad char olduğunu gösterir :

Buradaki bütün hatalı karakterleri bulmak önemli çünkü shellcode da hepsini kullanmamız gerekecek. Bu yüzden hepsini yazıyoruz :

Bizim için en önemli olansa nullbyte yani 01. Bunu kullanacağız.

Overwriting The EIP

Tekrar server ve debugger çalıştırıyoruz ve bu sefer tekrar python dosyamızı değiştireceğiz. Artık nerede EIP olduğunu biliyoruz.

Yeni kodumuz bu şekilde oldu. Şimdi EIP ‘ye kadar A dolacak ve EIP de B lerle dolacak. Yani EIP de 42424242 görmemiz gerekiyor.

Debuggerda çalıştırdığımızda sonucu bu şekilde görüyoruz :

EIP şimdilik BBBB olarak doldurduk ama sonraki derste bunu malicious değerle doldurup exploit edeceğiz.

Finding The Offset

Bu aşamada offset bulmak için metasploit frameworküne ait bir toolu kullanacağız. Bu toolun adı pattern_create. Toola ulaşmak için şu komutu yazıyoruz :

/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 3000 => -l : length byte, 3000 yazmamızın sebebi geçen sefer yaklaşık 2700 lerde çöktüğünü görmüştük.

Bu komutu çalıştırdıktan sonra bize şöyle bir çıktı basacak :

Burada yazan stringi alıp scriptimize ekleyeceğiz. Python kodumuzu sadece bir kere bu değeri gönderecek şekilde şöyle düzenliyoruz :

Bunu çalıştırdıktan sonra immunity debuggerda EIP nin değerini kullanarak tam offseti bulacağız.

Burada bize bir değer veriyor. Oluşturduğumuz patterne özel bir değer olduğu için offsetin tam değerini bulabileceğiz. Bu seferde pattern create değil pattern_offset toolunu kullanacağız. Bunun için şu komutu yazıyoruz

/usr/share/metasploit-framework/tools/exploit/pattern_offset.rb -l 3000 -q 386F4337

Bunu çalıştırdığımızda Exact match offset 2003 yazısını görüyoruz. Bu bize offsetin tam değerini veriyor.

Fuzzing

Denerken TRUN komutunun vulnerable olduğunu gördük. Şimdi bu aşamada bu komuta saldıracağız. Daha önce vulnserver çöktüğü için debugger da vulnserver da yönetici olarak tekrar çalıştırıyoruz. Bu aşamada bir python kodu çalıştıracağız. Bu kod da şu şekilde :

Soket üzerinden TRUN komutuna, sistem çökene kadar 100 tane A karakterini gönderiyoruz. Çöktüğü noktada ise kaç tane A gönderdikten çöktüğünü anlamak için except içinde buffer’ın boyutunu öğreneceğiz. Python dosyasının modunu chmod +x 1.py diyerek executable hale getirip ./1.py diyerek çalıştırdık ve immunity debugger da çökmeyi görünce de durdurduk. Yaklaşık olarak 2700 byte gönderdikten sonra çöktü.

Spiking

Öncelikle makinemizde vulnserver çalıştırmak için windows realtime protectionu kapatıyoruz.

Daha sonra vulnserver.exe yi administrator olarak çalıştırıyoruz. Daha sonra da immunity debugger çalıştırıyoruz. Açıldıktan sonra da File > Attach diyip açılan pencerede vulnserver buluyoruz.

Daha sonra öncelikle vulnserver bağlanmak için windows makinemizin ip adresine ihtiyacımız var. Bunu öğrendikten sonra kali linux terminalden :

nc -nv <ip> <port>=> nc: netcat -nv: connection  yazıyoruz.

Karşımıza komutlar çıktı. Bu komutlar vulnserver’da çalıştırılabilen komutlardır. Vulnserver bu komutları yapmak üzere programlanmış. Şimdi yapacağımız şey ise spiking. Tek tek bu komutlara bakıp bir zaafiyet var mı ona bakacağız.

Bu işlemi yapmak için generic_send_tcp komutunu kullanacağız. Bu tool parametre olarak bir host adresi,bir port bir spike_script bir tane skipvar(skipvariable) ve bir tane skipstr(skipstring) alıyor. Örnek olarak :

generic_send_tcp <ip> <port> something.spk 0 0

Örnek bir spike script bu şekilde olur. İlk satırda satırı okur, ikinci satırda STATS stringini gönderir ve üçüncü de de “0” karakterini gönderir. Bu gönderimi yüzlerce binlerce kez yapabilir. Sadece programı kırmaya çalışır.Farklı random karakterleri gönderip programı bozmaya veya kırmaya çalışıyoruz. daha sonra generic_send_tcp yi bu spike script ile çalıştırdığımızda sürekli yazdığını ama birşey değişmediğini görüyoruz.

Aynı işlemi trun ile dediğimizde ise vulnserver’ın çöktüğünü ve immunity debuggerda hatanın görünür olduğunu görüyoruz.

Burada gönderdiğimiz A ‘ların EAX doldurduğunu sonra EBP registerini 414141 olarak doldurduğunu ve oradan da EIP ‘yi de 414141 olarak doldurduğunu görüyoruz. EIP kadar gittiğimiz için artık bunu malicious bir kod için pointer olarak kullanabiliriz.

How Buffer Overflow Works?

Normalde inputlarımız buffer space de olmayı. Orası yazmayı doldurduğunda durmalı ancak bazen durmaz ve EIP ye kadar gider. Bu da EIP’den bizim shell kodumuza pointer erişimi vermemizi sağlar. Böylece exploit edebiliriz. Exploit geliştirmenin adımları ise şöyledir :

  1. Spiking : Programın vulnerable alanlarını bulmak
  2.  Fuzzing : Vulnerable gördüğümüz alanlara karakterler göndermek ve kırılıp kırılmadığını görmek.
  3. Finding The Offset : Eğer kırılma başarılıysa kırılma noktasını bulmak
  4. Overwriting the EIP : Bulduğumuz ofsetteki kırılma noktasını istediğimiz pointera yönlendirmek
  5. Finding Bad Characters
  6. Finding Right Module
  7. Generating Shellcode
  8. Root