20 Ekim 2015

Backdoored Web Shells

Shell yüklendiği server üzerinde size site sahibinin yetkilerini veren bir scripttir.Bu yetkiler arasında dosya okuma ,yazma ve silme yetkileri bulunmaktadır.Dinamik diller kullanılarak yazılıp internet ortamında paylaşılmış birçok shell uygulamasında (c99,r57,c100,Zehir4 vb) backdoor bulunmaktadır. Bu sheller herhangi bir servera isteyerek veya server sahibinin bilgisi dışında açıklık bulunup yüklendiği zaman içerisindeki kodlar sayesinde geliştiren kişilere yüklendiği bu server hakkında bilgi gönderip , geliştirici bu kişilerinde bu server’a sizden habersiz erişebilmesini sağlamaktadır.

Kullanıcılar internet ortamından bulunan bu shellere basit bir google araması ile ulaşabilmektedir.



C99 en çok kullanılan shell’lerden biridir.İndirip kaynak kodu analiz edilirse , örneğin http keywordu dosyanın içerisinde aratıldığında bir javascript dosyasının dışarıdan dahil edildiği görülmektedir.



Link verilen URL açılıp içeriği incelenirse ;



http://r57shell.net/yaz.php  linkine bir istekte bulunulmuş ve ‘a’ parametresi ile bulunulan dizinin adresi gönderilmektedir.Yani bu shell scripti bir siteye yüklendiğinde örneğin : ‘site.com/images/c99.php ‘ dışarıdan dahil olan javascript kodu çalışarak r57shell sayfasına ‘r57shell.net/yaz.php?a=site.com/images/c99.php’ şeklinde bir istekte bulunarak r57shell sitesi tarafından shell erişimi sağlanan yerin kaydedilmesini sağlatacaktır.

Kaynak kod içerisinde $login ve $password string değişkenleri boş atanmıştır ve içeriği doldurulursa shell kullanılmak istendiğinde giriş yapılmasını istemektedir.



Eğer shell’i kullanan kişi böyle bir şifre oluşturursa bu yetkilendirmeyi aşmak için ise geliştirici olan r57shell.net kodun içerisine bypass yapabileceği bazı satırlar eklemiştir.



Normal kullanımda extract fonksiyonunun direk kullanıcıdan alınan veri ile çalıştırılması tehlikelidir. Devamındanda görülebileceği gibi $login ve $md5_pass değişkenleri herhangi biri tarafından değiştirilebilmektedir.
 



Eğer yetkilendirme için şifre verilmiş olsa bile extract() fonksiyonunun zafiyeti sebebiyle shell’i geliştiren kişiler aynı server’a ulaşıp kullanabilir.



Bazı shellerin kaynak kodu encode edilerek verilmiştir. İnceleme yapabilmek için öncelikle kodu decode işleminden geçirip daha sonra inceleme yapılmalıdır.Örneğin ‘sh3ll.org’ sayfasında yine c99 shell’ini incelersek base64 ile encode edildiğini görürüz;



Base64 decode aracıyla decode ettikten sonra gerçek kodu incelersek önceki örnekle aynı durum söz konusudur. Tek farkı dışarıdan dahil edilen javascript linki encode edilmiş haldedir. Yine dışarıdan backdoor işlevi gören bir script kodu devreye sokulmuştur. Kullanım için şifre oluşturulması halinde ise yine extract() fonksiyonu kullanılmış ve giriş bilgileri herhangi biri tarafından override edilebilmektedir.



Anon Ghost Shell :

Kaynak kodu incelediğimizde önce base64 , sonra Deflate daha sonrasında ise Caesar Chiper algoritmaları ile encode edilip konulduğunu görmekteyiz.



Aynı sırayla kodu decode edersek (base64 -> gzinflate -> cipher ) kodun açık haline ulaşabiliriz.



Kodun açık haline ulaştığımızda uzak serverlara gönderdiği istekler veya uzak serverlardan dahil ettiği dosyalar incelenerek backdoor analizi yapılabilir.

Bir diğer alternatif yol ise shell’I localhost üzerinde çalıştırıp giden http requestlerini analiz etmektir. Eğer uzak server’lar için bilgi taşıyorsa backdoor olduğunun kanıtıdır.Örneğin bu shell çalıştırıldığında giden http requestler HTTPLiveHeader aracı ile kesilip incelenirse w0rms.com ‘ a bulunduğu dizini gönderdiği görülebilir.



Dinamik kod analizi


Bir başka örnek olarak w0rm.com sayfasından inceleyeceğimiz iranshell kodları encode edilmiş haldedir. Kodların ilk başında yine shell’in yüklendiği URL’i w0rm.com’a gönderen bir javascript kodu (backdoor işlevi gören) bulunmaktadır.



Encode edilmiş kod base64 , rot13 , md5 gibi herhangi bir algoritma ile direk encode edilmemiştir, bu yüzden kodu dinamik olarak analiz etmek gerekmektedir;
  • $OOO000000 değişkenlerinin tamamının adını $key ismi ile değiştirelim
  • Urldecode fonksiyonları içindeki verilen stringleri decode edelim.
        Örneğin ilkini decode ettiğimizde ;
        $key = fg6sbehpra4co_tnd  metnine ulaşırız.
  • $key{4}.$key{9}.$key{3}.$key{5}; satırı üstteki metnin 4,9,3 ve 5. İndexi olan “base” stringine denk gelmektedir.



  • 26. Satırdaki değişkeni “echo” komutuyla ekrana bastırırsak :



Bu değişken $OUT değişkeninin içerisine eklenmiş gereksiz karakterleri tutmaktadır.str_replace() fonksiyonu ile bu gereksiz karakterler elenir.Karışıklığa sebep olmak için verilmiş fonksiyon isimleri sadeleştirilirse anlaşılması daha kolay olacaktır.$ OOO000000 gibi değişken isimlerine daha sade isimler vererek okunurluğu artıralım:





Görüldüğü gibi kod okunurluğu gittikçe artırılmaktadır. Kodları analiz edilebilen yazılımlar için şifreli kodun çalıştığı yerde , mutlaka çalışma zamanında kodları decrpyt edip açık metin haline getirmesi gerek bir decode sistemi vardır . Bu sistemin anlaşılıp çözülmesi ile şifrelenmiş kod bloklarını dinamik olarak inceleyip decode edebiliriz.

Ayrıca Bir önceki örnekte bahsedildiği gibi http Request incelemesi yapmak , decode etmekte zorlandığımız hash’ler için bir alternatif çözüm yoludur.

Bu makale 2015 yılı stajyerlerimizden İstanbul Teknik Üniversitesi öğrencisi Cemal Türkoğlu tarafından yazılmıştır.