28 Ağustos 2017 Pazartesi

Fuzzing (2)



Fuzzing(1)'de, oluşturduğumuz python scripti ile hedef programa uzunluğu gittikçe artan bir string göndererek programda bir bellek taşmasına yol açmıştık. Kaldığımız yerden devam.

Debugger Seçimi

Başlığın aksine bu pek de bir seçim değil. Zaman zaman farklı debugger'lar kullanmanız gerekebilir ama bir favoriniz olmasında sakınca yok. Çocuk değil bu sonuçta. 

https://www.immunityinc.com/products/debugger/ adresinden Immunity Debugger'ı indirebilirsiniz. Immunity Debugger üstünde bir takım python modülleri barındırmakla beraber, bu modülleri debugger görsel arayüzünden çalıştırabilmenizi sağlayan bir komut satırına sahip. Eğer isterseniz kendi python scriptlerinizi yazıp Immunity Debugger'a tanıtabilirsiniz. 


Not: Immunity Debugger'ın çalışması için bilgisayarınızda python2.7 kurulu olması gerekmektedir. Immunity Debugger, kurulum sırasında python2.7 kurmak için soracaktır. Eğer Windows komut satırına python yazdığınızda komut bulunamadı hatası alıyorsanız, environment variable tanımlamanız gerekebilir.


Taşma Noktasının Tespiti

Debugger'ımızı çalıştırdığımızda aşağıdaki gibi bir ekranla karşılaşacağız. Sol üst köşeden
File  >  Attach diyoruz.


 Açılan pencerede debuggerımızı bağlayabileceğimiz hizmetler görüntüleniyor. Buradan fuzzladığımız programın process'ini seçiyoruz ve attach diyoruz.



Python scriptimizi aşağıdaki  gibi 1000 byte uzunluğunda bir string gönderecek şekilde ayarlıyor ve çalıştırıyoruz.



Debugger'a baktığımızda EIP (instruction pointer) değerinin 41414141 olduğunu görüyoruz.

41, A harfinin hex değeri olduğunu göz önünde bulundurursak, karşıya gönderdiğimiz 1000 tane A karakterinin bir taşmaya yol açtığını ve EIP değerine yazıldığını görüyoruz.


Instruction pointer, çalıştırılacak bir sonraki komutun (instruction) adresini tutar. Bu adresi manipüle edebildiğimize göre, programın akışını da kontrol edebiliriz.  

ESP'nin (Stack Pointer) tuttuğu adrese sağ tıklayıp "Follow in Dump" diyelim. 


Dump'ı incelediğimizde bir stack based buffer overflow ile karşı karşıya olduğumuz anlaşılacaktır.


Fakat her şeyden önce taşmanın hangi noktada meydana geldiğini, daha doğrusu, taşmanın, karşıya gönderilen kaçıncı byte'dan sonra gerçekleştiğini bulmalıyız.

Bunun için programa tek tek A harfi yollamaktansa, cyclic pattern'ları (döngüsel patern) kullanacağız. Bunun için mona eklentisini kullanabiliriz.

mona


Eklentiyi kurmak için öncelikle Github'dan mona.py dosyasını indirelim. Dosyayı, diğer python eklentilerinin de bulunduğu  PyCommands klasörünün altına kaydetmeliyiz. (Default olarak: ImmunityInc/ImmunityDebugger/PyCommands)

Mona'yı çalıştırmak için komut satırına !mona yazabilir, yardım sayfasını görüntüleyebiliriz. Şimdi pattern_create özelliğini kullanarak özgün bir patern oluşturalım ki bellek taşma noktasını bulabilelim:
Mona oluşturduğu paterni pattern.txt adlı bir text dosyasına kaydetti. Bu paterni kopyalayıp python kodumuzdaki buffer değişkenine eşitleyelim.


Windows komut satırından kodumuzu çalıştıralım ve Immunity Debugger'a dönüp EIP'ye yazılan yazılan 4 byte'ı not alalım.  Böylece bu kısmın oluşturduğumuz patern içinde nereye denk geldiğini sorgulatabiliriz. 


Eğer bu işlemi mona kullanarak otomatize etmek istersek bunu aşağıdaki gibi yapabiliriz:


Görüldüğü gibi bellek taşması tam 969. byte'da gerçekleşiyor. Bundan sonra göndereceğimiz 4 byte EIP değerine yazılacak. Artık tek yapmamız gereken çalışan bir exploit yazmak.
on 28 Ağustos by Berk Cem Göksel |   Edit