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.