5 Kasım 2013 Salı

Malware Analizlerinde Anti-Analysis ve Anti-Debugging Teknikleri

Yeniden Merhabalar, Fırsat buldukça bir şeyler karalamaya çalışıyorum. Bu makalede, Malware Analysis ve Reverse Engineering konularında kaynak sıkıntısı çeken ve bu tip işlere meraklı yeni başlayan arkadaşlara Kod Analizleri esnasında karşılaşılan Anti-Debug ve Anti-Analysis yöntemlerini yardımcı bir program eşliğinde sunmaya gayret edeceğim. Programı incelemeye başlamadan önce analiz için VM makinenizi ve Olly, IDA gibi analiz araçlarınızı hazırlamanızı tavsiye ederim.

Analize başlamadan önce;
  • Kullanacağımız uygulama Masm derleyicisi kullanılarak Assembly dili ile yazılmıştır. Tümü ile detaylı yorum satırları da dahil olmak üzere açık kaynak kodu ile birlikte gelmektedir. 
  • Uygulama 17 faz olup, istediğiniz şekilde ilaveler yapabilirsiniz. Derleme işlemi için www.masm32.com üzerinden ilgili paketi indirmeniz yeterlidir.
  • Kod içerisinde kullanılan tüm koruma methotdarı temel seviyede olup çözümleri de bir o kadar basittir. 
  • Koruma methodlari sadece öğretici olmak için hazırlandığından atlatılmaları için ZF flag'ini NOT'lamanız yeterli olacaktır. Gerçek senaryolarda bu methodlar çok daha farklı ve obfuscate edilmiş olarak karşınıza çıkar. 
  • Uygulama C dilinde de rahatlıkla yazılabileceği gibi Assembly kullanımında ki amaç analiz yeteneklerinin hızlı gelişimine katkıda bulunmaktır.
  • Test programı ve bu makale 2 iş günü arasında fırsat bulunarak yazıldığından düzensiz görünmesini normal karşılamanızı rica ediyorum. 
  • Analizler esnasında algılama tekniklerinin işleyişini daha iyi anlayabilmeniz için doğru kod bloklarında olmanız gerekebilir. Bu yüzden analiz süreciniz içerisinde kaynak kod ve debugger pencerenizi eş zamanlı şekilde kullanmanızı öneriyorum.
  • Masm32 platformuna aşina olmayan arkadaşlar 7 yıl önce yazdığım ve giriş seviyesinde olan http://kernelturk.blogspot.com/2009/10/masm32-ve-win32api-voltran-voltran.html makalesini okuyabilirler.
  • İlerleyen aşamalarda ucu açık kalan konular hakkında da (ör: polymorphic kod'lar ile packing, permutasyon çeşitleri ile Analizlerden kaçma yolları, kodunuzun bir VM veya Emulator üzerinde çalışıp çalışmadığının anlaşılması gibi) yazmayı planlıyorum. Bu yüzden ben o süreçleri hazırlayana kadar siz bu konuları kavramaya gayret edin lütfen.
Analiz Dosyasına ulaşmak için : İndir

Not: Doğrudan ve hızlı bir şekilde programın analizine başlayabilir veya sizlere fikir vereceğini düşündüğüm kısa bir yazıyı okuyabilirsiniz:

Kolay olan Tespit Etmek mi?
Zararlı Yazılımlar'ın öncelikli hedeflerinden biride tespit edildikleri anda tüm kirli çamaşırlarının bir bir ortaya çıkmasının önüne geçmektir. Zararlı Yazılım Analistleri ele geçirdikleri zararlı örnekleri üzerinde çalışmak için bir çok farklı araçtan yararlanırlar. Ancak analist zararlıyı incelemeden önce tamamı ile yalıtılmış bir ortam hazırlamak zorundadır. Çalışmalar ilk zamanlarda temiz bir işletim sistemi üzerinde tüm gerekli analiz araçları yüklenmiş ve network kablosu çekilmiş fiziksel pc'ler üzerinde yapılıyorken ilerleyen zamanlarda bu iş için uzaktan hata ayıklama (remote debugging) teknikleri yerini almıştı. Ancak yinede fiziksel pc bağımlılığı nedeni ile analiz süreleri zararlıların davranışlarına göre farklılıklar gösterdiğinden çok uzun zaman alıyordu.

İlerleyen zamanlarda Emulatorler ve Virtual Pc'lerin ortaya çıkması ile analiz süreçleri çok daha güvenli ve hızlı olarak yapılabilir hale geldi. Snapshot/Checkpoint teknikleri ile zararlının tüm davranış methodları tekrar ve detaylıca analiz edilebiliyor ve köşeye kıstırıldığı bu alanda eldeki tüm analyze silahları kullanılarak etkisiz kılınıyor ve zararlı tarihin karanlık kodlar çöplüğüne yollanıyordu. Tabi cephenin diğer tarafında bulunan zararlı geliştiricileri bu gelişmelere sessiz kalamazdı! Üstüne üstlük tüm bu savunma mekanizmalarının var oluş nedenleri yine zararlıların ta kendileri iken. Önceden olduğu gibi günümüzde de Zararlılar tespit edilmemenin dışında analiz edilmemek içinde oldukça efor harcıyorlar. Zararlı yazılım geliştiricileri, geliştirdikleri zararlının tespit edilmesi halinde analiz süreçlerini çok daha uzun ve içinden çıkılmaz bir hale getirmek için uğraş içerisindedirler. Aslında burada şunu da belirtmek gerekirse, kodlarının analiz edilmemesini isteyen kesim sadece zararlı geliştiricileri değil! Bir tarafta kötü amaçları için iyilerden kaçmaya çalışanlar olduğu gibi iyi amaçları için kötülerden kaçmaya çalışanlarda var! Ticari yazılım üreticileri programlarının lisans yükümlülükleri altında dağıtılmasını ve bu yol ile kazanç sağlamayı hedeflerler. Ancak bunun önünde Reverse Engineering yetenekleri oldukça gelişmiş Cracker camiasının elemanları bulunmaktadır. Değerli yazılımlarının lisans mekanizmalarının basitçe aşılmasına sessiz kalmak istemeyen yazılım üreticileri bir çok koruyucu tedbirlere yönelmiş ve onlarda yazılımlarını Anti-Analysis teknikleri ile koruma altına alma yoluna başvurmuşlardır. Hatta öyle ki Anti-Debug ve Anti-Analysis tamamen ticari bir kimliğe bürünüp kendine müşteriler bulmaya başladı. Armadillo, AsPack, Themida gibi Reverser'lara karşı koruma vaadeden yazılımların popülerliği hep gündemde yer bulmuştur.

Ne Kadar Bilgi O Kadar Analiz

x86 mimarisi üzerinde çalışan bir yazılım analiz edilmek istenildiğinde hangi dilde yazıldığına bağlı olmaksızın durumuna göre IA32 ve AMD64 komut ailesine ait assembly kodlarına dönüşürler. Analiz süreçlerinde assembly diline aşina olmak elbette önemlidir ancak tek başına yeterli olmayacaktır. Assembly bilginize ilave olarak çalıştığınız işletim sisteminin mimarisi üzerinde derinlemesine bilgi sahibi olmanız, kriptografi bilginiz, sanallaştırma ve emulasyon çözümlerinde ki derin teknik bilginiz analiz süreçlerinin çok daha kısa ve keskin sonuçlar vermesine katkı sağlayacaktır.

Test programımız üzerinde yapacağımız analizlerde de göreceğiz ki Anti-Analysis ve Anti-Debugging tekniklerinin bir çoğu Assembly dilinin getirdiği avantajları değil programın çalıştığı mimarinin yeteneklerini kullanır. Windows ortamında bir process'in ilk ortaya çıkması ile birlikte var olan TIB, PEB gibi yapılar gerek analiz gerekse anti-analiz süreçlerinde anahtar rol oynarlar. Bu ve bunun gibi internal yapıların iyi bir şekilde öğrenilmesi Reverser için analiz sürecini oldukça kısaltacaktır.

Bu test programı ile kazandığınız bilgiler giriş seviyesi olarak sizleri tatmin edecektir. Ancak ilerleyen fazlarda Assembly bilginizi neden ileri derecede geliştirmeniz gerektiğini fark edeceksiniz. Çok iyi bir assembly bilgisi ile ileri seviye koruma methodlarını yazılımlarınıza uygulayabilir veya Malware Analizleri esnasında karşılaştığınız engelleri rahatlıkla egale edebilir duruma gelirsiniz. Nanomites, Magic Opcodes, Stolen Bytes, Code Permutation, Garbage Code ve daha nice insan zekası ile opcode'ların birleşiminden oluşan bu zengin bilgi deryasına ancak iyi bir assembly bilgisi ile aşina olabilirsiniz.

Konu ve gelecek yazılar hakkında görüşlerinizi paylaşabilirsiniz.

Sağlıcakla.

Kasım 2013 - İbrahim Akgül


12 Eylül 2013 Perşembe

Uygulama İçi Static Key Zaafiyetlerine Öğretici Bir Yaklaşım

Şirketimiz'de staj yapan ve Security'ye ilgi duyan arkadaşlar için 1:1 eğitimlerin dışında örnek olarak hazırladığım bir dokumanı sizlerle de paylaşmak istedim.

Büyük ölçekli şirketlerin kurum içi Instant Message ihtiyaçlarını profesyonel ve free bir şekilde karşılayan Spark uygulamasın da denk geldiğim bir zaafiyet'den bahsedeceğim. Hemde bu vesile ile kriptografi öğrenimi sürecinde eğlenceli bir araç olan Cryptool uygulamasını tanıtmış olurum diye düşündüm.

Spark IM, kullanıcıları authentication işlemleri için Active Directory user hesaplarını kullandığından, sahip olduğu authentication mekanizmasınında bir o kadar güvenilir olması bekleniyor. Spark'ın sunucusu olan Openfire ile iletişimi ssl ile gerçekleşiyor ve Login prompt ekranında sunduğu parola hatırlatma seçeneğinin seçilerek sisteme giriş yapılması halinde girilen parolanın 3DES ile kriptolanarak bir dosyaya yazılması onu bulunduğu açık sistem üzerinde de güvenli kılıyor görünüyor. Ancak Spark açık kaynak kodlu bir ürün olduğundan bu parola bilgisini saklama esnasında kullandığı static key'e kolayca erişebiliyoruz:
http://svn.igniterealtime.org/svn/repos/spark/trunk/src/java/org/jivesoftware/spark/util/Encryptor.java

Aslında Opensource olmasa dahi herhangi bir uygulama encrypt/decrypt işlemleri için kullandığı key'i embed ettiğinde bir kaç Reverse adımı ile de sonuca ulaşabiliyorsunuz.

Statik key'i öğrendikten sonra, encode edilmiş parolanın bulunduğu dizini açıp (Windows 7'de C:\Users\username\AppData\Roaming\Spark\spark.properties) password keyword'ünün hashli içeriğini almamız gerekiyor. Bundan sonraki aşamalar ise süreci eğlenceli kılmamızı sağlayan kriptografik bir kaç dizi işlemi gerçekleştirmemizle devam ediyor.

İlk olarak size tavsiyem , şayet Kriptografi'yi seviyor ve merak ediyor ancak anlamakta güçlük çekiyorsanız mutlaka CrypTools uygulamasını sisteminize kurmalısınız. Cryptools gerçekten çok kullanışlı ve en sıkıcı hale bile gelebilen karmaşık kriptografik işlemleri sizin için eğlenceye dönüştürebilen bir uygulama.

CrypTool 2 karşılama ekranı
Yazının bundan sonraki kısmında Cryptool ile çalışacağız. Uygulamayı açtığımızda karşımıza gelen ekran üzerinden yeni bir boş proje seçerek decode işlemimiz için ilk adımı atıyoruz


Yeni proje açmak için workspace seçeneğini işaretliyoruz

Yeni projemiz için karşımıza gelen görüntü aşağıda ki gibi olacaktır. Ekranın sol kısmında yer alan araç çubuğu üzerinden projemizde kullanacağımız nesnelerinin seçimini yapacak ve sağ menüde bulunan bar ile de nesnelere ait özellikleri değiştirebileceğiz.

Workspace layout

Aşağıda ki resimden de görebileceğiniz gibi 2 adet TextInput, 1 Adet TextOutput ve asıl işlemleri gerçekleştirecek olan DES şifreleme nesnesini workspace'e ekliyoruz. Ardından eklemiş olduğumuz nesnelerin birbirleri ile iletişim kurabilmeleri için doğru renk kombinasyonuna sahip işaretleyiclerini mouse yardımı ile bağlıyoruz. Böylece gireceğmiz key ve encode edilmiş dataları DES cipher'ina gönderebilecek ve sonucu TextOutput penceresinden okuyabileceğiz.

Tasarım aşaması

Projemizin omurgası hazır olduğuna göre artık verileri doğru alanlara girmenin vakti gelmiş demektir. Yazının girişinde de belirttiğim Spark'a ait parola bilgilerinin encode edilmiş olarak durduğu dosya olan spark.properties'i bir editor yardımı ile açıp password keyword'ünün içermiş olduğu 32 karakterlik sabit uzunluğa sahip verimizi alıp bir sonraki adımımız için elde tutuyoruz.

spark.propterties dosyasından parola bilgisinin alınması
Yukarıdaki işlemin aynısını bu sefer secretKey için yine girişte url'ini verdiğim Sparkın kaynak koduna ait ilgili dosyadan temin ediyoruz. Artık elimizde biri kurbanımıza ait şifreli parola diğeri bu parolayı decode edecek keyimiz olmak üzere 2 verimiz var. Bu veriler base64 ile encode olduğundan Cryptools'da ki TextInput alanlarımıza girmeden önce decode etmeliyiz. Bunu net üzerinde online olarak gerçekleştiren bir çok siteden yapabilirsiniz.

Decode ettiğimiz keyin hexdecimal verisini 2 numaralı TextInput (bknz: alt resim sol alt köşe) nesnemize , parolaya ait olan decode verisinide 1 numaralı TextInput (bknz: alt resim sol üst köşe) yapıştırıyoruz. Bu aşamada text nesnelerinin sağ menü üzerinde bulunan özelliklerini hexdecimal olarak değiştirmeyi ihmal etmeyin. 

Artık PlainText parolamıza ulaşmamız için gereken tek şey DES nesnesinin özelliklerini ayarlamak. Ayrıca yazmak gerekirse DES nesnesine girdiğimiz attributes'lar aslında yine girişte linkini verdiğim Spark'ın source code'unda ki ilgili dosyadan elde ettiğim verilere dayanıyor. Özetle parolamız 3DES algoritmasının ECB mode'unu kullanarak şifreleniyor ve son aşamada PKCS7 yöntemi ile de son halini alıyor. Bizde bu veriler ışığında aynı seçenekleri seçip sadece bu defa encrypt yerine decrypt işlemi yapacağımızı belirtiyoruz. Bu işlem için DES nesnemizi seçtiğimizde sağ menüde görülecek olan özelliklerinden Actions alanını Decrypt, Chaining Mode'unu ECB, Padding Mode'u PKCS7 ve son olarak 3DES checkbox'ını işaretlememiz yeterli olacaktır. Tüm bu süreç sonunda Menü çubuğunda yer alan Play simgesine basarak decode edilmiş parolayı görebiliyor olacağız.

Sonuç

Ben programcıyım eğlenmek'te istemiyorum, bana decrypt edecek kodlar lazım diyenler için:

    private const string STATIC_KEY = "ugfpV1dMC5jyJtqwVAfTpHkxqJ0+E0ae";
    
    public static string Decrypt(string data)
    {
      var 3des = new TripleDESCryptoServiceProvider();
      3des.Mode = CipherMode.ECB; 
      3des.Padding = PaddingMode.PKCS7;
      3des.Key = Convert.FromBase64String(STATIC_KEY);
      var decrypt = 3des.CreateDecryptor();

      var b64 = Convert.FromBase64String(data);
      var result = decrypt.TransformFinalBlock(b64, 0, b64.Length);

      return Encoding.UTF8.GetString(result);
    }

Teşekkürler


8 Eylül 2013 Pazar

Sahipsiz Blog

İş hayatı böyle gaddar işte! Verdiklerinden çok götürdükleri oluyor. Son girdimi 2 sene önce yazmışım. Demek ki blog yazarlığı bana göre değilmiş :( Hala varsa takipçilerden özür diliyorum. Aslında Google Analytics doğru söylüyorsa :p günlük 60'ın üzerine düşmemiş ve search edilen keyword'lere göre baya lowlevel  meraklısı varmış. Eğer başarabilirsem bu aralar bir şeyler karalamak istiyorum çünkü baya bi bilgi yüklü katır formundayım ve birileri ile paylaşmazsam bu bilgilerin değersizleştiğini düşünüyor insan. Mesala 6 ay önce Hyper-V 3.0'da keşfettiğim ve mission critical derecede değerlendirilip patch'i yayınlanan zevkli bir debugging serüvenini karalamaya başlıyorum. Hazır izindeyim bari bu sözümü tutayım. Daha böyle çok serüven var, umarım hepsini yazmayı başarırım ve birlikte eğleniriz.