Innovera – ACELAB Staj Alım CTF Yarışması 2017
Giriş
Innovera’nın staja alım için yaptığı bu CTF yarışması için canıgönülden tebrik ediyorum çünkü normal staj alım prosedürlerinin dışında farklı ve başarılı bir yaklaşım sergilemektedirler. 3 aşamalı olan yapboz tarzı bu yarışmada son soruyu da bitirip flag’e ulaşan kişiler, bir mail adresine ulaşmaktadır ve bu kişilerden soruların çözümünü anlattıkları bir rapor istenmektedir. Sorular için verilen dosyaları GitHub‘a yükledim, linkleri yazının sonunda bulabilirsiniz. Şimdi ise derin derin anlattığım çözümlere hemen geçiş yapıyorum 🙂
Soru 1
Birinci soruda bizlere bir text dosyası verildi, içerisinde şu tarz bir yazı bulunmaktadır (hepsini eklemeyeceğim):
ACEk LABkkk ACEkk LABkk ACEk LABkkk ACEk LABk ACEkkk LABkk ACEkkkk LABk ACEk LABkk ACEk LABk ACEk LABk ACEkkk LABk ACEk LABkkk ACEkk LABkk ACEk LABk ACEkk LABk…
Coz beni .
Yazıya genel olarak baktığımızda farkedeceğimiz gibi “k” harflerini saymazsak “ACE” ve “LAB” kelimeleri en çok tekrar eden ikili:
Tabii “k” harfini sayarsak “CEK” ve “ARK” kelimeleri de en çok tekrar eden ikililerden ancak “k” harfini saymamamın sebebi, o harfin küçük yazılmış olması ve ACE = “Advanced Cyber Exercise”, LAB = “Laboratory” olması. Elbette bu şekilde çözüme erişemezsem diğer en çok tekrar eden ikilileri de deneyeceğim ancak şimdilik çözüm için ilk çıkış yolum bu.
Neden bir ikili seçtiğimi düşünüyor olabilirsiniz. Bunun sebebi “k” harfinde yatıyor. “k” harfi genel olarak programlama dillerinde boyut ifadesi (sıfır olmayan tamsayı) olarak veya indis notasyonunda/gösteriminde (sıfır olmayan tamsayı) kullanılır o yüzden bu soruda bilerek “k” harfini kullanmış olabileceklerini düşünüyorum. Buradan yaptığım çıkarım, “ACE” ve “LAB” kelimelerinin “0” (sıfır) ve “1” (bir) binary gösterimi olduğu ve “k” tane tekrar ettiğidir çünkü bu kelimelerin sonunda n tane “k” harfi bulunmaktadır. Bunu da teyit etmek için “k” harfinin histogramına bakıyorum ve 248 kez yazıda geçtiğini görüyorum:
248 sayısını görünce bu fikrimin doğru olabileceği üzerine varsayımda bulundum çünkü bellekte ulaşabileceğimiz en küçük değer 1 byte yani 8 bit’tir (ASCII, ISO-8859-1 ve UTF-8 ile kodlanmış karakterler bellekte 1 byte kaplar). 248 sayısı da 8’in katı bir sayıdır. Bu fikrimi test etmek için “ACE” kelimesini “k” tane “0” (sıfır)’a ve “LAB” kelimesini de “k” tane “1” (bir)’e çeviren C dilinde bir program yazdım. Örnek: “ACEk” = 0, “ACEkkk” = 000, “LABkkkkk” = 11111. Program kodlarını GitHub‘a yükledim, yazının sonunda linki bulabilirsiniz (programın “bin” (binary) adlı değişkeni 0 ile başlamaktadır, “ACE” kelimesini 0 olarak varsaydığım için öyle, 1 ile değiştirilirse “ACE” = 1, “LAB” = 0 olacaktır). Program çıktısı:
Bu binary kodlarını da ASCII karakterlere çevirdiğimizde çıkan sonuç:
Soru 2
İkinci soruda bizi “chall.pcapng” isimli bir dosya karşılıyor. Dosyanın uzantısından da anlaşılacağı gibi bu yakalanan ağ paketlerinin çıktısı. Wireshark programı ile bu dosyayı açtıktan sonra ilk olarak HTTP protokolünü filtreleyerek buradaki paketleri incelemeye karar verdim. Burada 3 tane .zip uzantılı dosyanın indirildiğini gördüm:
Daha sonra bu protokolde yapılmış tüm veri transferlerini inceleyebilmek için bir klasöre Wireshark aracı ile çıktısını aldım:
001.zip dosyası şifreliydi ve 002.zip dosyası da bozuktu o yüzden ilk başta ikisini de açamadım ancak 003.zip dosyası şifreli değildi, ilk olarak onu açtım ve içinden bir resim çıktı:
binwalk aracı ile resmin içinde bir şey var mı diye baktığımda içinde bir zip dosyası olduğunu gördüm:
Bu zip dosyasını çıkarmak için kullanacağımız iki kolay yöntem var. İlk yöntem:
|
|
İkinci yötem ise:
Görüldüğü gibi resmin içinden çıkan zip dosyasının içinde “surprise.txt” adlı bir dosya bulunmaktadır ve onun içinde de “yanliş yerdesin :(” yazılı bir metin ve kodlanmış (encoded) bir yazı bulunmaktadır. Bu yazının BASE64 ile kodlandığını anlamak çok zor olmadı tabi. Bu kodlanmış yazıyı çözdüğümüzde şöyle bir yazı çıkmaktadır:
001.zip’in parolasını bilmediğim için ve bruteforce işe yaramadığı için bu parola bir yerlerde gizlidir diye düşündüm ardından bozuk olan 002.zip dosyasını düzeltmeye çalıştım. Dosyanın hex kodlarına baktığımda dikkatimi ilk 4 byte çekti. Bu ilk 4 byte, dosyanın imzasını içermektedir ancak bu dosyada hex imzası 0 (sıfır) ile değiştirilmiş olduğunu gördüm:
Bunu farketmek kolay oldu çünkü daha önceden tecrübeliydim. Hacktrick 2017 Tersine Mühendislik Eğitimi başlıklı yazımda “Tersine Mühendislik” eğitimi öncesi yapılan ön elemede sorularının çözümünden bahsetmiştim. O sorularda da buna benzer bir yöntem uygulanmıştı… zip dosyasının (“002.zip”) içerisindekileri çıkarabilmem için dosyanın ilk 4 byte’ını doğru hex imzası (değeri) ile güncellemem gerekiyordu. Doğru değeri wikipedia‘dan buldum ve dosyanın ilk 4 byte’ını “50 4B 03 04” değerleri ile hexedit programını kullanarak güncelledim (hexedit 002.zip
programı kullanması çok kolay, değiştirmek istediğin hex değerinin üzerine oklar ile gelip değeri tuşluyorsun, ardından F2’ye basıp kaydederek çıkıyorsun):
zip dosyasını düzeltip açtıktan sonra içinden “1.jpeg” adlı bir resim çıkıyor:
Resmi binwalk ile incelediğimde bir şey bulamadım. Daha sonra internette bu resmi arattım ve başka bir sitede de aynı resmin olduğunu görüm. Ardından resimlerin checksum değerlerini kontrol ettim ve “1.jpeg” dosyası ile internetten alınan resmin checksum değerlerinin aynı olduğunu gördüm:
Parolanın resmin içinde olmadığını anladıktan sonra ICMP paketlerine yöneldim ve ping paketlerinin içerisinde parola olabilecek karakter ve sayılar buldum:
Bu karakter ve sayıları değişik varyasyonlarda denedikten sonra parolaya ulaşamadım. Daha hızlı bir şekilde bulabilmek için bu karakter ve sayıları içeren bir wordlist ile bruteforce yapmayı düşündüm ancak parolanın uzunluğunu bilmediğim için bunu yöntemi denemek istemedim. Bir süre parolayı aradıktan sonra 3 tane “no response found!” hatalı pinglere yöneldim ve BASE64 ile kodlanmış parolaya, bu pinglerdeki verileri birleştirerek ulaştım:
Daha sonra BASE64 ile kodlanmış yazıyı çözdükten sonra parola ortaya çıktı:
Flag bu sefer BASE32 ile kodlanmış ve çözünce de içinden çıkan, 3. soruya gidilen link:
Soru 3
Üçüncü soru gerçekten başlı başına bir meydan okuma, “w3lc0me_to_H3ll” dedikleri kada var 🙂 Bu soruda bize “predat0r.png” adlı bir resim dosyası veriliyor. Resmin içerisinde gizlenmiş bir dosya var ve bunu çıkartmamız gerekiyor ancak çıkartabilmemiz için uygun python modülünü bulmamız gerekiyor. Google’da bulabildiğim bütün python steganography modüllerini denedikten sonra sonunda uygun modülü buldum. Çözüm için gereken python modülü: stepic. Stepic ile dosyayı açtıktan sonra kendi adlandırdığımız şekilde bir zip dosyası çıkıyor ve içerisinde bir pdf dosyası var:
PDF dosyasını açınca “Heisenberg’s Uncertainty Principle” başlıklı bir yazı çıkıyor ancak çok fazla yazı olduğu için içerisinde flag olabilecek anlamlı bir şey bulmak zor. Bu noktadan sonraki adımda pdftotext aracı ile PDF içerisindeki yazıları çıkarıp, anahtar kelimeler(staj, st, nn, innov, inn, nn) ile içerisinde arama yaptım ve mail adresine ulaştım:
Burada ilginçtir ki, mail adresini bulamamış birkaç kişi ile karşılatım çünkü ne aramaları gerektiğini bilmiyorlardı. Oysaki daha yarışmaya başlamadan önce:
Böylece bütün çözümleri anlatmış oldum, bir sonraki yazımda görüşmek üzere. Eleştirel (öğretici) yorumlarınızı memnuniyle ve istekle bekliyorum 🙂