İçindekiler

Innovera – ACELAB Staj Alım CTF Yarışması 2017

İçindekiler

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):

İçeriğin bir kısmı

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:

cryptool trigram

Araç: CrypTool. Analysis -> Tools for Analysis -> N-Gram...

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:

cryptool histogram

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ı:

binary output

Bu binary kodlarını da ASCII karakterlere çevirdiğimizde çıkan sonuç:

Çıktı:
staj.innoverabt.com/try_t0_f1nd
Burada eğer flag olabilecek birşey çıkmasaydı “ACE” kelimesini varsayılan olarak 0 (sıfır) değil, 1 yapacaktım, yine olmazsa diğer varyasyonları denemeye başlayacaktım (“ACE”, “CEK”, “ARK”, “LAB”). Gördüğünüz gibi flag’e ulaştık, bu da ikinci sorunun bulunduğu link (yarışma bittikten sonra linkler kaldırıldı).

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:

wireshark http filter
Resmin üzerine tıklayarak büyütebilirsiniz.

Daha sonra bu protokolde yapılmış tüm veri transferlerini inceleyebilmek için bir klasöre Wireshark aracı ile çıktısını aldım:

wireshark http file dump
Resmin üzerine tıklayarak büyütebilirsiniz.

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ı:

tuzak flag dosyası

binwalk aracı ile resmin içinde bir şey var mı diye baktığımda içinde bir zip dosyası olduğunu gördüm:

binwalk gizli dosya

Bu zip dosyasını çıkarmak için kullanacağımız iki kolay yöntem var. İlk yöntem:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
root@kali:~# dd bs=1 if=gizli.png of=out.zip skip=18136
249+0 records in
249+0 records out
249 bytes copied, 0.00049263 s, 505 kB/s
root@kali:~# unzip out.zip 
Archive:  out.zip
 extracting: suprise.txt             
root@kali:~# cat suprise.txt 
yanliş yerdesin :( MS56aXAgZSBnaXRtZWxpc2luIGFyYWTEscSfxLFuIMWfZXkgb3JkYQ==
root@kali:~# 

İkinci yötem ise:

winrar gizli dosya çıkarma
Resmin üzerine tıklayarak büyütebilirsiniz.

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:

İpucu
1.zip e gitmelisin aradığın şey orda

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:

hexdump zip dosyası
Resmin üzerine tıklayarak büyütebilirsiniz.

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):

hexedit zip header düzeltme
Resmin üzerine tıklayarak büyütebilirsiniz.

zip dosyasını düzeltip açtıktan sonra içinden “1.jpeg” adlı bir resim çıkıyor:
tuzak redkid flag dosyası

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:

resim checksum değerleri
Resmin üzerine tıklayarak büyütebilirsiniz.

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:

wireshart icmp ping gizli mesaj
Resmin üzerine tıklayarak büyütebilirsiniz.

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:

wireshart icmp unresolved ping gizli mesaj

no = frame numarası

Daha sonra BASE64 ile kodlanmış yazıyı çözdükten sonra parola ortaya çıktı:

Parola:
fazlaATARyapma
Bu parola ile 001.zip’i açtıktan sonra içerisindenki text dosyasından çıkan metin:
base32 flag file
Resmin üzerine tıklayarak büyütebilirsiniz.

Flag bu sefer BASE32 ile kodlanmış ve çözünce de içinden çıkan, 3. soruya gidilen link:

Link:
staj.innoverabt.com/w3lc0me_to_H3ll

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:

stepic image steganography
Resmin üzerine tıklayarak büyütebilirsiniz.

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:

pdftotext gizli mail
Resmin üzerine tıklayarak büyütebilirsiniz.

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:

Alıntı
Son aşamada karşına bir mesaj çıkacak ve belirtilen email adresine tüm puzzle ların çözümlerini içeren bir rapor göndermen beklenecek
Şeklinde bir yazı vardı. Yarışmaya başlamadan önce dikkatlice bildirileri okuyanlar ne araması gerektiğini kaçırmazdı diye düşünüyorum.

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 🙂