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

Required Installs For Exploit Development

Eğer windows makinede değilsek https://www.microsoft.com/en-us/evalcenter/evaluate-windows-10-enterprise bu adresten widnows iso indiriyoruz.

Vuln machine için http://www.thegreycorner.com/2010/12/introducing-vulnserver.html bu adresin en altındaki vulnserver.zip indiriyoruz.

Daha sonra da https://www.immunityinc.com/products/debugger/ adresinden program debugger’ı olan immunity debugger indiriyoruz. Programın memory,stack vs değerlerinin nasıl değiştiğini görmemizi sağlar. Bu debugger çalışmak için python 2.7.1 e ihtiyaç duyar.