15 Haziran 2017 Perşembe

Fuzzing (1)


Fuzzing nedir?

Fuzzing yazılımları test etmek için kullanılan çok basit ve etkili bir yöntemdir. İnput (girdi) alan herhangi bir hizmet fuzz edilebilir. Fuzzing çoğunlukla Buffer overflow, Format string vulnerability SQL injection, XSS gibi zafiyetlerin tespitinde kullanılır. Ama bu dediklerime rağmen girdi alan hemen hemen her kod parçasını fuzz'layabilirsiniz.

Web uygulaması fuzzingine başka bir zaman değineceğim, sonuçta prensip aynı. Biz fuzzing kullanarak klasik bir Buffer Overflow zafiyeti bulmaya odaklanalım. Öncelikle kendimize fuzz edecek bir şeyler bulmalıyız. Bunun için üzerinde hali hazırda bir Buffer Overflow zafiyeti olan Ability Server 2.34'ü kullanacağım.

Zafiyet barındıran sunucuyu ve bu zafiyeti istismar eden bir exploit kodunu exploit-db'de bulabiliriz.


FTP sunucusunu çalıştırdıktan sonra yapmam gereken ilk şey sunucunun çalışıp çalışmadığına bakmak. Sunucuya ulaşabiliyormuyuz diye netcat ile port 21'e bağlanalım.


Başarılı bir şekilde FTP sunucusuna bağlanabildik. Öncelikle rastgele veri gönderebileceğimiz parametreleri belirlemeliyiz.

Uygulamaya giriş yapmadan fuzzlayabileceğimiz 2 tane parametre var. Fakat bunun bir FTP sunucusu olduğu göz önünde bulundurulduğunda, giriş yaptıktan sonra başka parametrelerle de karşılaşacağımız aşikar. FTP sunucusuna bir kullanıcı adı ve parola tanımlayıp sunucuyu tekrar başlattıktan sonra, sunucuya başarılı bir şekilde bağlanabiliyor muyuz kontrol edelim.


Bu basit kontrolleri atlamak, ileride, özellikle yabancı olduğumuz hizmetlerle uğraşırken kafa karışıklığına ve büyük zaman kayıplarına sebep olabilir.


Şimdi sıra karşıda bir overflow (taşma) oluşturabilecek uzun bir string göndermekte. Zaman kazanmak için bu süreci otomatize eden basit bir script yazabiliriz. Örnek için aşağıdaki gibi bir script kullandım:


9. Satırda tanımlanan buff, karşıya göndereceğimiz veri. \x41 'ise  A harfinin hex değeri.

Script, ilk döngüde ftp sunucusuna gerekli giriş bilgilerini gönderecek, sonra ise STOR parametresine A değerini girecektir. Bu, ikinci döngüde 101 A harfi, üçüncüde 201 A harfi olacak şekilde artarak devam edecektir. Ta ki string' in uzunluğu  belirtilen değeri (30.000') bulana kadar.

Bu sırada karşı tarafta bir overflow meydana gelirse, program crash edecek, ve biz de hemen hemen kaç tane byte'dan sonra sunucunun çalışmayı durdurduğunu tespit etmiş olacağız.

Gördüğümüz üzere STOR parametresine gönderilen yaklaşık 1000 byte uzunluğunda bir string programın crash etmesine sebep oldu.




Gönderdiğimiz stringlerin uzunluğu 100'er 100'er arttığından, tam olarak kaçıncı byte'ın programın crash etmesini sağladığını bilmek zor. Bunu FTP sunucusunu bir debugger ile çalıştırdıktan sonra tek tek deneyerek görebiliriz. Buna ek olarak daha basit ve başarılı bir çözüm olan 'cyclic pattern' ları kullanabiliriz.

Devamı 2. Bölümde...
on 15 Haziran by Berk Cem Göksel |   Edit