Ders 25 - Buffer Overflows > Off-by-One Overflows | #Include <Karabük>
Buffer Overflows ünitesinin dersi olan Off-by-One dersinde buffer overflow(tampon taşma) saldırısı gerçekleştirilecektir.
"OWASP Hotel'ine hoşgeldiniz. Odanızdan internete erişebilmek için ekranda sunulan metin kutularını doldurmanız gerekmektedir." Hedefiniz otelin dışındaki bir kişi olarak otelin internetine bağlanabilmektir.
Bu dersin mihenk noktası olan buffer overflow, yani tampon taşması bir değişkene kapasitesinden daha fazla değer atandığında meydana gelir. Örn;
A değişkeni 8 byte'lık null içerir. Yani sayısal anlamda hücrelerde sıfır yer alır. B değişkeni ise 2 byte'lık 1979 sayısını içerir:
Diyelim ki program A string'ine null ile sonlanan "excessive" string'ini kopyalamak istiyor. Bunun için aşağıdaki strcpy() fonksiyonu çalıştırılıyor. Görüldüğü üzere "excessive" stringi 9 byte artı bir de null ile sonlanma karakteri '\0' eklenince 10 byte olmaktadır, A string'i ise 8 byte yer kaplamaktadır.
Yukarıdaki komut ile A değişkenine kopyalanacak "excessive" stringi taşacak ve aşağıdaki resimden de görebileceğiniz gibi bellekte A değişkeninden sonra gelen B bölgesine A'dan taşanlar yerleşecektir. Yukarıdaki örnek için "excessive" stringinin son harfi ile null ('\0') karakteri B'nin üzerine yazılacaktır ve B değişkeni 25856 değerine sahip olacaktır.
Tampon taşırma mantıksal açıdan böyle bir şeydir. Bu derste tampon taşırmayı otelin web uygulamasından ekstra bilgi elde edebilmek için kullanacağız. Yani bu dersin yukarıda bahsedilen buffer overflow örneğinden farkı tamponu taşıran karakterlerin overwrite edilmeyecek olmasıdır. Böylece veritabanında mevcut bulunan ilgili otel müşterisinin bilgisi döndürülecekken taşma ile komşu hücrelerde sıralı olan fazladan bilgilerin gelmesi sağlanacaktır.
Öncelikle otelin dışında ikamet etmekte olan sizin normal şartlarda internet erişimine dahil olamamanız gerekir. Fakat şimdi düzenleyeceğimiz buffer overlow saldırısı ile otel içinde kayıtlı olan bir müşterinin senaryo gereği bilgilerine erişeceğiz ve böylece otelin dışından internet erişimini elde etmiş olacağız. Öncelikle ders ekranındaki metin kutularından ilk ikisine rasgele bir şeyler girin. Rasgele bir şeyler giriyoruz, çünkü otelde kalan herhangi bir kişinin adını ve soyadını bilmiyoruz. Ardından WebScarab'ınız eğer http taleplerini yakalayabiliyor değilse yakalayabiliyor yapmak için Intercept sekmesine gelin ve Intercept Request checkbox'ına tick işareti koyun. Şimdi ders ekranındaki Submit butonuna tıklayın. Ekrana gelen WebScarab'ın popup'ındaki post ettiğimiz bilgilere bakalım:
Görüldüğü üzere rasgele olarak girdiğim ilk metin kutusundaki 'a' ve ikinci metin kutusundaki 'b' harfleri POST edilmektedir. Üçüncü metin kutusunun değerini tutan room_no değişkeni ise oda sakinin kaldığı oda numarasını tutacaktır. İşte saldırı bu değişken üzerinden gerçekleştirilecektir. Normalde kullanıcıdan beklenen oda numarası değeri taş çatlasın 4 basamaklı bir sayıdır. Biz 4 basamaklı bir sayı yerine bunun belki 1000 katı değerinde bir sayı gireceğiz. Böylece sunucuda oda numarası için ayrılmış değişken boyutunu aşmış olacağız ve sunucu belleğinde room_no değişkeninin yer aldığı hücrenin komşu hücrelerindeki değerleri taşma miktarınca okuyabileceğiz. Çünkü otelin sunduğu hizmete göre metin kutularına girilen değerler baz alınarak sunucu bir sonuç göndermektedir. İşte gönderilen bu sonuç taşma miktarınca room_no değişkeninin komşusunda yer alan bellek hücrelerindeki değerleri içerecektir.
Şimdi buffer overflow saldırısında bulunmak için bu linkteki devasa sayıyı kopyalayın. Ardından önceden ekrana gelen WebScarab popup'ına tekrar gelin. Oradaki room_no değişkeninin yanındaki hücreye çift tıklayın ve kopyaladığınız devasa sayıyı oraya yapıştırın. Accept Changes butonuna bastıktan sonra ders ekranı sizden internet erişimi için kullanacağınız paketi seçmenizi isteyecektir. Accept Terms butonuna basarak devam edin. Nihai olarak sunucu girilen oda sakininin bilgilerini döndürecektir. Fakat girdiğimiz veri devasa olduğu için oda sakininin bilgileri döndüğü gibi diğer oda sakinlerinin bilgileri de döndürülmüş olacaktır. Bunu görebilmek için kaynak koda inmemiz gerekmektedir. Zira bu bilgiler html kodlaması ile arayüzden saklanmaktadır. Kaynak kodu komple inceleyerek zaman kaybetmek yerine sadece belirttiğim alana sağ tıklayın ve Öğeyi Denetle(Inspect Element) seçeneğine tıklayın. Böylece arayüzden saklanan oda sakinlerinin bilgilerini görebiliyor olacaksınız.
Yukarıdaki resimde yer alan yeşil çemberin olduğu noktaya sağ tıklayıp Öğeyi denetle dedikten sonra tarayıcının alt bölümündeki kısımda beliren html kodların biraz aşağısına indiğinizde göreceksiniz ki oda sakinlerinin tüm bilgileri listelenmiş:
İçlerinden birini seçin ve ad, soyad, oda numarası bilgilerini bir yere not edin. Gereksiz yere çalışmaması için WebScarab'a eklediğiniz tick işaretini kaldırın. Ardından ders ekranının sol tarafında sıralanan derslerden bulunduğumuz dersin ismine tıklayın ve tekrar otelin internet erişimi talep sayfasına gelmiş olun. Gelen ekrandaki ilk metin kutusuna not ettiğiniz adı, ikincisine soyadı ve üçüncüsüne de oda numarasını girin. Sonra bir internet paketi seçin ve Accept Terms butonuna tıklayın. Böylece otelin dışından otelin bir sakiniymiş gibi internet sahibi oldunuz.
Buffer Overflow ile gelmesi planlanan bilgi ile beraber sunucudaki ilgili bilginin yer aldığı hücrenin komşu hücrelerindeki diğer bilgiler de elde edilmiş oldu. Bu tip saldırılardan sakınabilmek için kullanıcının girdiği verilere karakter limiti konulmalıdır. Normal kullanıcı için istemci taraflı karakter limiti tayin edilmeliyken kötü niyetli kullanıcılar için de sunucu taraflı karakter limiti koyulmalıdır. Yani bir istemci ve bir de sunucu olmak üzere iki tarafta da karakter limiti koyulmalıdır. İstemci tarafı için html attribute'u olan maxlength kullanılabilir. Sunucu tarafında ise kullanılan web programlama dilinin karakter sayısı ölçen bir fonksiyonu if condition'ları ile kontrolü sağlayacak şekilde kullanılabilir(Mesela if(strlen(degisken) > 50 echo "hata: tampon taştı";)
Bu yazı 07.09.2015 tarihinde, saat 06:03:53'de yazılmıştır. 03.01.2016 tarihi ve 22:12:49 saatinde ise güncellenmiştir.
Yazar : Hasan Fatih ŞİMŞEK	 Görüntülenme Sayısı : 958
* 9 + 13 = ?