Pcman ftp server 2.0.7 stack buffer overflow

Merhabalar, PCMan FTP Server uygulamasının 2.0.7 sürümünde bulunan stack buffer overflow zafiyeti için exploit geliştirmeyi olabildiğince basitleştirerek anlatmaya çalışacağım.

Kullanacağım uygulamalar: Immunity Debugger, PCMan FTP Server 2.0.7, VMware

Çalışmayı VMware uygulamasında çalıştırdığım Microsoft Windows XP Professional (Version 2002)’de yapacağım. İşletim sistemi, uygulama sürümleri vs. değiştiğinde ilgili kodların değişebileceğini unutmayın.

Başlamadan önce anlatımda değineceğimiz iki register’ın ne iş yaptığını bilmekte fayda var.

ESP: Stack pointer. Stack veri yapısının son giren elemanını gösterir.

EIP: Instruction pointer. CPU’nun an itibariyle code segment’i içerisindeki hangi instruction’i çalıştıracağını gösterir.

Öncelikle PCMan FTP Server uygulamasını sürükleyip Immunity Debugger üzerine bırakarak açıyoruz.

Daha sonra imleçle gösterdiğim tuşa veya F9 tuşuna basarak uygulamayı çalıştırıyoruz.

FTP Server fare imleci ile gösterdiğim bölgede yazan IP üzerinde çalışmakta. NMAP aracı ile port taraması yapıp kullandığı portu görebilirsiniz.

FTP Server’a bağlanmaya çalıştığımızda kullanıcı adı ve şifre soruyor. Biz de yanıt olarak aşırı veri girip stack’in dolup taşmasını sağlayacağız. Eğer stack taşıyorsa zafiyeti bulduk demektir. Python ile resimdeki kodu yazarak USER parametresi ile 3000 tane ’A’ harfini gönderdik.

Ve stack taştığından dolayı program crash oluyor. Resimde gösterdiğim gibi gönderdiğimiz ’A’ harfleri stack’tan taşarak EIP değeri üzerine yazılmış. (A harfinin hexadecimal değeri 41’dir).

Peki bu EIP değeri bizim gönderdiğimiz kaçıncı ’A’ harfinden etkilendi? Bunu tespit edebilirsek göndereceğimiz veri ile EIP üzerine istediğimiz değerleri yazdırabiliriz. Burada yardımımıza Metasploit-Framework yetişiyor. Resimdeki gibi pattern_create.rb aracını kullanarak yeteri miktarda (3000’de crash olduğu için bu değeri verdik) desen oluşturuyoruz.

İmleçle gösterdiğim yere veya Ctrl+F2 tuşlarına basarak crash olan programı baştan başlatıyoruz. (Her defasında exploitimizi çalıştırmadan önce baştan başlatmayı unutmayın)

EIP değerinin değiştiğini görüyoruz. Desenimizde yer alan değerlerin hexadecimal karşılığı buraya yazıldı.

Bu değeri alıp yine Metasploit-Framework’un pattern_offset.rb aracına vererek stack’in 2003 byte sonrasında taştığını ve EIP’ye yazmaya başadığını öğreniyoruz.

Daha iyi anlaşılması için resimdeki kodu çalıştıralım. Bakalım 2003 byte sonrasında EIP’yi manuple edebilecek miyiz:

Stack ’A’ harfi ile dolu olmasına rağmen EIP’ye ’B’ harfinin hexadecimal karşılığı olan 42 değerinin başarıyla yazıldığını görüyoruz.

Şimdi EIP’ye JMP ESP adresini yazdırarak stack’e atlayacağız. Shellcode’u oraya yazdıracağız. JMP ESP adresi bulmak için e yazan yere tıklıyoruz. (veya ALT+E’ye basabilirsiniz.)

Açılan penceredeki modüllerden shell32.dll’yi seçtim. Çift tıklayarak açıyoruz. Assembly kodunun olduğu alana sağ tıklayarak search for –> command seçerek “JMP ESP”yi aratıyoruz.

Aşağıdaki resimde gösterdiğim gibi (mavi ile işaretli olan kısmın solunda) JMP ESP adresini bulmuş olduk.

Bu adresi işlemcimizin kullandığı sıralama sistemi Little-Endian olduğu için sağdan itibaren başlayarak kodumuza yazıyoruz.

Sırada badchar tespiti yapmak var. Uygulamalar tarafından engellenen bazı karakterler var. Bunları tespit ederek yazacağımız shellcode’u bu karakterlerden arındıracağız. chars değişkeni içerisine bütün hexadecimal karakterleri (internetten kolayca bulabilirsiniz) yazdırdıktan sonra exploit’imizi tekrar çalıştırıyoruz. (Resimde göstermeyi unutmuşum s.send(’USER’ + buffer + eip + chars + ’\r\n’) olarak chars değişkenini eklemeyi unutmayın.)

Exploit’i çalıştırıp program crash olduktan sonra sağ üstteki ESP değerine sağ tıklayıp ’Follow in Dump’a tıklıyoruz..İlk badchar’ımız en baştan gösteriyor kendini. “\x00”

“\x00” badchar’ını chars değişkenimizden çıkarıp programı ve exploiti tekrar çalıştırıyoruz. ’Follow in Dump’ işlemini tekrardan yaptığımızda bu sefer chars değişkenimizdeki sıralamaya göre ’09’ dan sonra gelen ’0a’ karakterimizin de badchar olduğunu anlıyoruz.

“\x0a” karakterini de chars değişkenimizden çıkardıktan sonra işlemleri tekrar uyguluyoruz. “\x0d” karakterinin de badchar olduğunu farkettik.

İşlemleri tekrar uyguladığımızda chars değişkenimizin tamamının (“FF” e kadar) stack’e yazıldığını gördük. Demek ki chars değişkenimizin içerisinde başka badchar kalmamış.

Sırada Metasploit-Framework’ten reverse shell payload’ımızı üretmek var. LHOST’a kendi IP adresimizi, LPORT’a kullanacağımız portu, -b parametresiyle de badchar’ları girip shellcode’umuzu üretiyoruz.

Üretilen shellcode’u exploit’imizin içerisine yerleştiriyoruz. Shellcode’u stack’e göndermeden önce 30 tane NOP (x86 işlemci mimarisi için “\x90”) yazdık. Bunun sebebi kodun güvenilirliğini artırmak. No Operation’un kısaltması olan bu NOP değeri işlemcinin bu değeri gördüğünde işlem yapmadan devam etmesini sağlar.

Netcat ile kullandığımız portu dinlemeye başlıyoruz.

FTP server uygulamasını ve exploitimizi tekrardan çalıştırdığımızda gönderdiğimiz shellcode stack içerisinde çalıştı ve artık içerdeyiz 🙂


O hâlde boş kaldığın zaman, hemen (başka bir işe giriş) yorul!İnşirâh Suresi 7. Ayet

Powered by Hydejack v8.4.0