İnternet, bilgi, bilişim güvenliğine dair her türlü karalamalara sahiplik yapan kişisel bir blog.

Underdist: 3 Level 3 çözümü

Merhaba arkadaşlar. Underdist: 3 Level 1 çözümü ve Underdist: 3 Level 2 çözümlerini daha önce ki yazılarımda paylaşmıştım. Şimdi ise 3.levelden devam edelim. Bir önceki kısmı hatırlayacak olursak makina üzerinde ips.txt dosyasını işleyen bir py dosyası vardı. ips.txt dosyasının ilk satırını manipule ederek sistemde komut çalıştırıp, ters bağlantı elde ettik. Şimdi bu kısımdan yine devam ediyoruz. Bu levelden çok keyif aldığımı söyleyebilirim.

1

Sistemde biraz gezinti yapalım tabir-i caizse tırtıklayalım. “ls -la” komutuyla gizli dosyaları listeleyebilirsiniz. /home/underdist dizini altına geçtim ve orada bu komutla gizli dosyaları listeledim. “.bin” dizini dikkatimi çekti.

2

 

İlgili dizinde echo isimli bir betik görüyoruz bu betik “root” haklarıyla çalışıyor.

Burada devreye sizin buffer overflow hakkında bilginiz ve yeteneğiniz devreye giriyor. Kısaca buffer overflow’u şöyle açıklayabiliriz. Her bir yazılımın üzerinde bir bellek alanı vardır. Bu bellek alanı dışarıdan bir etkiyle taşırılırsa buffer overflow oluşur.

Daha açık haliyle programların bellekler üzerinde kullanıcılar için ayırdıkları hafıza alanları vardır. Eğer kullanıcı bu hafıza alanına olabileceğinden daha büyük boyutlu veri yazmak isterse buffer overflow oluşur ve kullanıcı verisinin bir kısmı EIP alanına bir kısmı da ESP alanına düşüyor. EIP değeri çok önemli çünkü EIP değeri, bir sonra ki adımda işlenecek komutun bellekteki adresini saklıyor. Eğer ben kullanıcı hafıza alanını gereksiz karakterlerle doldurursam, taşma sırasında EIP alanına bir bellek adresi düşürürsem, program benim istediğim yerden devam edecektir. Ben EIP alanına öyle bir bellek adresi düşüreceğim ki program bir sonraki aşamasında ESP alanına atlayacak. ESP alanında da sistem komutlarını çalıştırabilir hale geleceğim ki buraya kadar geldiğimiz noktadan reverse bağlantı elde edebilirim.

Bu kısa bilgi ardından devam edelim.

Şimdi söz konusu echo dosyası görevi itibariyle ona verdiğiniz değeri ekrana basıyor. Bunu bir örnekle işleyelim.

./echo “Mustafa ALTINKAYNAK” komutunu verdiğimizde parametreyi işliyor ve ekrana Mustafa ALTINKAYNAK yazıyor. Sanırım mantığını kavradık.

Şimdi pyhton dilinde verelim isteğimizi. Ekrana 50 tane A yazmasını istedim. Gayet güzel bir şekilde yazdı. Peki bunu biraz artırmaya ne dersiniz ?

50 tane A harfini başarılı yazan yazılım, 1024 tane A harfini denediğimizde patladı ve Segmentation fault hatası verdi.

Şimdi biraz analiz yapalım. Echo ismindeki yazılımın 50 ila 1024 arasında bir yerde patladığını biliyoruz. Bu anlamda yazılımı çalışması esnasında analiz etmemiz gerekecek. Ama öncesinde şunu söyleyemem gerekirse bundan sonra ki anlatımım reverse engineering alanında olacağından bu konuda ön bilgi sahibi değilseniz çoğu şeye fransız kalırsınız.

Şimdi linux üzerindeki gdb aracıyla yazılımı analiz işlemine devam edelim. Gdb aracının windows üzerinde çalışan Immunity Debugger yazılımından hiçbir farkı yok.

gdb ./echo şeklinde programı debug modunda çalıştırıyoruz.

disass main komutuyla birlikte main fonksiyonunda yer alan segmentleri ekrana yazdırdım. Burada yeşil alan içerisine aldığım kısım diğer alanlardan farklı olarak strcpy fonksiyonunu barındırıyor. Yani değer aktarımı burada gerçekleşiyor. Hedefimizi buranın üzerinde yoğunlaştırıyoruz.

Bu kısımda ilk önce 1024 tane A harfi gönderdim. Segmentation fault aldım. A nın hex karşılığı 41dir. Bu yüzden 0x414141 gibi bir ifadeyle karşılaştık. Hemen ardından register tablosunu kontrol ediyoruz.

Yukarıdaki resimi dikkatlice incelediğimizde A yani 41 değerimiz EIP alanına düşmüş. Peki bizim için önemli olan soru şu. Acaba kaçıncı değerden sonra ESP alanına başarılı şekilde verilerim düşüyor ? Yani program kaçıncı değere kadar sağlıklı çalışıyor bunu tespit etmemiz gerekiyor. Yukarıda 50 tane A gönderdiğimizde program çalışırken, 1024 tane A gönderdiğimizde patlıyordu. Peki kaçıncı A’da program duruyor bunu tespit etmemiz gerekiyor. Bunu bilmem gerekiyor çünkü belirli karakter sayısından sonra EIP alanına veri düşürmem gerekiyor.

Bu aşamada iki adet araçtan faydalanacağım.
Birincisi pattern_create. Bu araç bize birbirinden farklı olan A-z, 0-9 düzeninde text oluşturuyor. Yani 1024 tane A yerine bunu kullanacağım. Ardından EIP alanına düşen kısmı ikinci aracımız olan pattern_offset’e vererek EIP alanına kaçıncı karakterden sonra yazılmaya başladığını anlamış oluyoruz.

pattern_create ile 1024 adet karakter oluşturdum. Şimdi bunu 1024 tane A yerine kullanacağım.

 

Yeşil ile belirtilen alan konsolda yazdığımız alandır. EIP 0x6b41316b değeri almış. Peki kaçıncı karakter de durmuş bunu diğer araca verelim.

Programın EIP alanına düşen değeri pattern_offset’e verdiğimde “304” sonucunu döndürdü. Yani program 304.karakterden sonrasını EIP alanına atıyor.

Yani ben 304 tane A harfi gönderirsem hemen arkasında zararlı kodlarımı gönderirsem, zararlı kodlar EIP alanına düşecektir.

304 tane A karakteri gösteriyoruz ve ardından main fonksiyon tablosuna bakıp nereye breakpoint koymam gerektiğine bakıyorum. Strcpy fonksiyonu barındıran kısım benim hedef almam gereken kısımdı. Dolayısıyla buraya break koymam gerekiyor.

İlk önce break *0x0804846a ile brak noktamızı belirledim. Hemen ardından da x/400s $esp komutu ile esp alanına düşen kısmı görmeye çalıştım.

Sarı ile işaretlediğim kısımlar benim gönderdiğim A değerleri

Şimdi shellcode’a ihtiyacımız var. Shell-Storm (www.shell-storm.org) adresinden shellcode temin edebilirsiniz.  İsterseniz msf aracılığıyla kendi shellcode oluşturabilirsiniz. Şimdilik amacım sistemde root olmak olduğu için hazır shellerden yararlanacağım.

Bu adresde yer alan shellcode u tercih ettim. (http://shell-storm.org/shellcode/files/shellcode-811.php). Shellcodun uzunluğu 28 byte.

Şöyle bir payload hazırlamalıyız.

276 adet (NOP yani işe yaramaz karakter) + shell code + ESP adres tanımlama yani;

x90 * 276 + shell code + ESP adres tanımlama

Buradaki x90 bizim hava yastığımız olacak ve yazılım üzerine yumuşak bir iniş yapmamızı sağlayacak.

ESP adresi için önce bir kez shell code yollayıp tekrar analiz ediyorum.

0xbffffdef ve 0xbffffeb7 alanlarıyla yine karşılaştım. Şimdi bu aralıkta çalışıyor kodlarım. Ben ESP adresini tekrar tanımlamalıyım ki sistemde komut çalıştırabileyim.

Şimdi benim için önemli olan kısım 0xbffffeb7 olan kısım. Bunu adresi shell kodunun sonunda yazacağım çünkü ilgili shell code çalışabilsin. Makina dili olması dolayısıyla bunu ikişerli halde bölüp tersten tekrar yapmam gerekecek.

Yani 0xbffffeb7 –> bf ff fe b7 –> \xbf\xfe\xff\xbf şeklinde hazırladım.

21
Ardından c yani continue ile devam ediyorum.

22

ve bingo! Executing new program ile bize yeni bir kabuğun açıldığını anlıyoruz.

Şimdi herşey hazır artık. Echo programına payload vermek kaldı.

Evet payloadımız hazırdı. Artık echo programına değer olarak vermek kalmıştı. Tekrar konsol üzerinden değeri gönderdim ve ardından id ile yetkimizi kontrol ediyoruz. Ve mutlu son “root” uz 🙂

Bir sonra ki yazımda görüşmek dileğiyle 🙂

 

Mustafa

2004 yılından bu yana Web ve Bilgi Güvenliği üzerine araştırmalarda bulundum. Çok sayıda yerli yada yabancı websitelerinde bulunan zaafiyetleri ilgililere göndererek kapatılmasını sağladım. Octosec ailesindenim. Siber Güvenlik Eylem Planı kapsamında TSE Kayıtlı Sızma Uzmanı sertifikam bulunmaktadır.

Leave a Reply