Turkcell CyberCamp19 Writeup



Turkcell'in bu yıl üçüncüsünü düzenlediği CyberCamp programı kapsamında seçeceği kişileri belirlemek için yaptığı CTF(Capture the Flag) yarışmasında sorulan soruların cevaplarını bu makalede ele alacağım. Öncelikle soruların zorluğuna değinirsek, sorular arasında çok fazla zor denebilecek bir soru yoktu, maksimum orta seviyede zorlukta olan sorular vardı. Ancak şanssızlık eseri üç soruyu çözemedim ve bunlardan ikisinde son adımda maalesef toolbox'ımın yetersizliğinin azizliğine uğradım. Bu iki soru ayrıca yarışmanın en kolay sorularıydı... Diğer soru hakkında gerçekten biraz genel kültür gerektiriyormuş, maalesef onu da oradan kaçırmış oldum :)


Ancak bu üç sorunun da çözümünü ilk iki sorunun sadece son adımını, üçüncü sorunun ise tamamını kaynak göstererek burada paylaşacağım.

Öncelikle soru dağılımına bakalım:


Görüldüğü gibi soru dağılımında Pawn, Malware, Reverse Engineering ve Mobile gibi konular yoktu. Soruların çoğunluğu kolay çözülebilecek sorulardı ve daha önce grup olarak katıldığım CTF yarışmaları olduğu için Web konusunda tecrübesiz olan ben, en çok Web500 sorusunda zorlandım. Her neyse çözümlere başlayalım,

Forensics


*) Forensic100

Bu soru çözemediğim kolay sorulardan bir tanesiydi, soru metni aşağıdaki gibiydi:



Soruda yer alan resmin adresi:

https://ctf.cybercamp2019.com/files/21c27915a0f884de76daa8a66f97bc1e/detaylara-odaklan.jpg

şeklindeydi, ilk başta URL'e baktığımda directory'nin MD5 hashlenmiş olduğunu gördüm. Ancak crackstation, md5this, m5decrypt.net gibi sitelere verdiğimde bir sonuç bulamadım. Daha sonra gerçekten resim üzerinde çalışmaya başladım, verilen ipucunda "There are more adventures on the chessboard than on all seas." yazmaktaydı, resmin contrast ayarları ile vs. oynadım. Bir sonuç bulamayınca strings ile içeriğini incelediğimde bir md5 değeri buldum:
"ec166ab565c40617ef5b1aed0f575680"



İşte bu değer flag dedim ve yine yukarıdaki siteleri denedim. Ancak yine crackstation, md5this, m5decrypt.net gibi siteler bana bir sonuç vermedi ve ben de resimdeki diğer detaylara baktım ve maalesef soruyu çözemedim. Yarışma sonrası araştırdığımda bir write-up'ta bu sorunun çözümü veriliyordu[1]: https://www.md5online.org/md5-decrypt.html

Bu siteyi yarışmadan sonra denediğimde gerçekten flag'i vermişti:
Flag{B4nlar_Art1k_Eskidi_B3}

*) Forensic150



Soru metninde bir pdf ve bir rar dosyası verilmişti. Bu tip sorularda eğer malware değilse, önce file komutu ile dosya tipini inceler, ardından binwalk, foremost, strings gibi toollara vermeden önce pdf, resim, text vs. açıp direkt dosyayı gözlerimle incelerim. Zaten ipucundan da dosyanın kendisinde gözle görülebilecek bir ipucu olduğu görülüyordu:



Bunun ardından zaten verilmiş olan rar dosyasındaki flag.txt'de bu şifreyi kullandığımızda flag'i bulmuş oluyorduk:
Flag{Ar4-B3n1_Bul-B3ni}

*) Forensic200




Soruda bir pcapng dosyası verilmişti, yani bir network dinlemesi. Hemen Wireshark'a sokup network üzerinden gelip giden dosyalara baktığımda içerisinde "chappie.png" adlı bir dosya dikkat çekiyordu.



Dosyaları export ettiğimde ise bunun bir kare kod olduğunu gördüm. Kare kodu okuttuğumda ise flag karşımda duruyordu:
Flag{[email protected]_b_d_k0d}



*) Forensic500




Verilen dosya yaklaşık 152 MB boyutunda bir arşiv dosyasıydı ve içerisinde bir memory dump imajı bulunmaktaydı. Hemen volatility ile imageinfo bilgisini aldım.



Suggested Profiles'a baktığımızda memory dump'ın Windows 7 bir cihazdan alınmış olabileceğini söylüyordu. Soruda ise bizden "cybercamp" adlı kullanıcının parolasını flag olarak girmemiz isteniyordu. Hemen hashdump komutu ile SAM dosyasının içeriğini döktüm.



Görüldüğü gibi gerçekten cybercamp adlı bir kullanıcı bulunmaktaydı ve Windows'un varsayılan hashleme tipi yani NTLM ile hashlenmişti. Hashcat veya basit bir şekilde online NTML decrypter kullanarak çözebilirdik.



Flag:
Flag{Aa123456}


Web


*) Web100



Soru çok basit bir web sorusuydu eğer developer araçlarından network izlenir ve gelen başlıklara bakarsak flag oradaydı.



Flag:
Flag{k1m_k0ydu_l4n_bunu_bur4y4}

*) Web200



Bu soru da bir önceki gibi kolay bir soruydu, tek farkı burada işin içine cookieler de dahil olmuştu.

Öncelikle verilen adrese gittiğimde default Apache2 sayfası geldi.



Web sorularında her zaman yapıldığı gibi önce robots dosyasını kontrol ettiğimde "admin.php" yolunun disallow'da olduğunu gördüm.



Admin sayfasında ise basit bir form vardı. Hemen cookielere baktığımda ise isadmin adında bir cookie olduğunu gördüm ve değeri md5 olarak false yapılmıştı. Ancak bu cookie, her url'e istek gönderildiğinde false'a set ediliyordu. Yani yapmam gereken setcookie başlığını editleyip tekrar istekte bulunmaktı.



İsteği editlemek için TamperData gibi bir extension kullanılabilirdi. Ancak ben BurpSuite programını tercih ettim ve sonuçta flag'i kaptım:
Flag{1s_th3_b3st_c00k1e}



*) Web500



Bu soru daha önce command injection ile uğraşmadığımdan bana biraz zor geldi. Çünkü her ne kadar basit command injection tekniklerini bilsem de bu soruda biraz daha orta düzeye yakın teknik gerekiyordu. Örneğin; ls veya cat komutlarından sonra koyduğum boşluğu kabul etmiyordu, bunun yerine tab kullanabileceğimi bu CTF'te öğrendim :)

Sayfayı ilk açtığımda aşağıdaki gibi bir sayfa bekliyordu:



Kaynak kodlarına baktığımda hiç bir şey yoktu. Dolayısıyla hemen robots dosyasına gittiğimde aradığımı bulmuştum.



"bulDuM.php" yoluna gittiğimde aşağıdaki gibi bir sayfa vardı:



Gördüğünüz gibi sistem arka tarafta gerçekten ping komutunu çalıştırıyordu. Yani command injection yapmam gerekiyordu. Basit | && || $() gibi teknikleri denediğimde çalıştığını gördüm ancak komuttan sonra parametre veremiyordum çünkü boşluktan sonrasını almıyordu. Ben de RESTED Client isimli eklenti ile sayfaya POST istekleri göndererek command injection'u yapmaya çalıştım.

Not: Bunun yerine Curl'da kullanabilirdim ama o an aklıma eklenti kullanmak geldi.



find komutunu enjekte ettiğimde update dizini altında flag.php olduğunu gördüm ve hemen sayfaya gittim. Ancak sayfa bomboştu ve kaynak kodda da bir şey yoktu. Mecburen dosyayı command injection ile okumam gerekiyordu ancak daha önce bahsettiğim gibi cat komutunu kullansam bile boşluk işlemiyordu. Biraz araştırmadan sonra boşluk yerine TAB tuşunu kullanabileceğimi öğrendim ve url-encode'da tab yerine %09 yazabildiğim için POST isteğimi aşağıdaki gibi düzenledim:



Bunun ardından sayfadan dönen sonuç bana flag'i veriyordu:
Flag{Toprak_devletin_temelidir_hiç_kimseye_verilmez}



Osint

*) Osint200




Soruda verilen resim dosyasını incelediğimde bir filmin posteri olduğunu gördüm, ancak daha da yakından baktığımda bir Twitter hesabı göze çarpıyordu. @Warriorctf



Twitter hesabına gittiğimde profil resminde bir goo.gl linki olduğunu gördüm ve linke gittiğimde bir Google Döküman sayfası açıldı.



Dökümanı incelediğimde biraz aşağılarda soluk harflerle Base64 ile şifrelenmiş bir metin buldum. Bu şifreleme tekniği genellikle CTF'lerde çok kullanıldığından hemen anlaşılabiliyor. Ancak metinin yukarısında da bu tekniğe göndermeler yapılmaktaydı.



Metni decode ettiğimde bana bir Github linki verdi. Linke gittiğimde ise bu ipucu vardı.



Yani Flag:
Flag{AzizSancar}

*) Osint250



Soru metnini incelediğimde Twitter hesabının @Kafein27 olduğu anlaşılıyordu. Twitter hesabına gittiğimde aşağıdaki gibi bir post bulunmaktaydı:



Bu şifrelenmiş bir metindi ve soru metnindeki ve hesap açıklamasındaki Shift 2 ipucu bunun ilkel bir şifreleme yöntemi olan ve adını ilk bulan kişi olan Julius Caesar'dan alan Caesar Cipher olacağını düşündürdü bana.



Metinde elde ettiğim hedefte sibertehdit.com olduğuydu ve flagin de bu sitenin IP adresi olduğuydu. Hemen bir ping sorgusuyla IP adresini buldum ve soruyu çözdüm.



Flag:
Flag{94.73.151.111}

*) Osint400



Bu soru bana göre en zor soruydu. Çünkü çözüm yönteminde kullanılan Swarm ve Foursquare uygulamalarını daha önce kullanmamıştım. Çözüm için şu linke giderek bakabilirsiniz:

https://furkandanis.com/cybercamp-2019-ctf-osint400-writeup/

*) Osint300



Soruda verilen pdf dosyasının içinde bir zararlı olduğu söyleniyordu. PDF dosyalarının içerisinde genellikle Javascript kodları çalıştırılabiliyor. Bunun için strings komutu ile dosyanın içeriğini okudum.



Gerçektende dosyanın içerisinde zararlı olmayan bir "zararlı" Javascript kodu bulunmaktaydı. Bir cURL isteği ile bir IP adresine "deneme" diye bir mesaj yolluyordu. Yani temelde bilgisayarınıza bir şey yapmayan bir Javascript kodu. Burada bizim işimize yarayan URL'di. 9000 portuna baktığımda kapalı olduğunu gördüm ve bende default http portu olan 80 üzerinden bağlandım.



Site resimdeki gibi Rusça(Soru ipucunda Rus bir hacker denmişti) bir giriş sayfası bulunmaktaydı. Çeşitli SQL Injection yöntemleri denediysem de başarılı olamadım ve Google Translate ile siteyi çevirdim. Soruda bahsedilen botnet'in BOTNET MIRAI isminde bir botnet olduğu buradan anlaşılıyordu. İnternette biraz araştırma yaptığımda botnetin kullanıcı adı ve şifrelerinin bulunduğu bir Github sayfasına ulaştım.



İlk kullanıcı adı ve şifre olan root ve xc3511 i denediğimde başarıyla botnet paneline giriş yaptım.



Panelde hackerın giriş sağladığı cihazların bazı bilgileri yer alıyordu. IP adresi, işletim sistemi, bulunduğu ülke gibi. Soru metninde verilen "Ukrayna'daki bir cihaz" ipucunu da kullanarak doğru makineyi buldum ve üzerine tıkladığımda flag karşımdaydı:



Flag:
Flag{db2user||admin1!}


Crypto


*) Crypto50



Soruda verilen rar dosyasını indirdiğimde içerisinde "Flag.txt" adlı bir dosya bulunmaktaydı ve içerisinde Mustafa Kemal Atatürk'ün bir sözü vardı:

Bedenimin babası Ali Rıza Efendi, hislerimin babası Namık Kemal, fikirlerimin babası ise Ziya Gökalp’tir

Önce bu sözü araştırdığımda hiç bir bilgi bulamadım. Daha sonra dosyanın hex kodlarına vs. baktığımda da hiç bir şey yoktu. Daha sonra soruya dönüp ipucuna baktım ve "Daha yolun başındayız. İleride neler var neler  :)" yazısından bir anlam çıkarmaya çalıştım. Derken rar dosyasının adının md5 olarak şifrelenmiş olduğunu gördüm. İpucuna odaklandığımda "daha yol'un başındayız." kısmı işletim sistemlerindeki yol'u yani path'i tarif edebileceğini düşündüm. Yine yukarıda belirttiğim sitelerde arattığımda bir sonuç bulamadım. Bunu da yanlış yorumladığımı düşündüm ve fazla uğraşmadan diğer sorulara bakmak için devam ettim ve bu soruyu çözemedim. Yarışmadan sonra yazılan write-up[1]'ı kontrol ettiğimde https://www.md5online.org/md5-decrypt.html adresini bilmiş olsaydım bu çok kolay soruyu da böylelikle çözmüş olacaktım.

Flag:
Flag{[email protected]@r}

*) Crypto100



Soru metnini incelediğimde Latince;

Redde Caesari quae sunt Caesaris, et quae sunt Dei Deo

yazdığını görüyoruz. Bu cümlenin anlamı tam olarak;

Sezar'ın hakkı sezara, Tanrı'nın hakkı Tanrı'ya

'dır. Soru metninden de anlaşıldığı gibi yine Caesar Cipher ile uğraşacağımız hakkında ipucu veriyordu. Soruda verilen metin dosyasını indirdiğimizde aşağıdaki gibi bir metin geliyordu:



Resimde işaretli kısım flag formatına uyuyordu. Cipher'i de artık bildiğimize göre, tek kalan şey decypher etmek oluyordu. Flag:
Flag{s3zarla_el_ele_hep_beraber_turkcelle}

*) Matruşka



Soruda iki adet dosya verilmekteydi "Flag_nerde.zip" içerisinde şifrelenmiş halde bir text dosyası bulunurken, "parola.txt" bir wordlist gibiydi. Hemen fcrackzip yardımıyla verilen wordlistteki şifrelerden zip dosyasının şifresinin "tokyo" olduğunu öğrendim.



Arşiv dosyasının içerisindeki metin belgesinden ise aşağıdaki gibi bir IP(35.189.222.238) ve şifre çıktı:



Verilen IP adresi üzerinde nmapt araması gerçekleştirdiğimde ssh ve http portlarının açık olduğunu gördüm. Web Server'a bağlantı isteği yolladığımda default apache2 sayfası açılıyordu. Ayrıca robots dosyası yoktu. Ben de uzun bir süre şansımı ssh bağlantısı sağlamaya çalışarak geçirdim ama başarısız oldum. Sonunda aklıma web server üzerinde dirbuster kullanmak geldi ve doğru yoldaydım.



Dirbuster sayesinde iki yeni dizin ve 2 yeni dosya elde etmiştim ve bunlardan birinin ismi "flag.txt.zip" idi. Hemen iki dosyayı indirdiğimde elimde daha önce bulmuş olduğum şifrenin([email protected]) "hero.zip" adlı dosyanın şifresi olduğunu gördüm. Dosyayı açtığımda "x_dosya" ve "y_dosya" adlı iki dosya çıktığını gördüm. Bunların içini incelediğimde linux passwd ve shadow dosyaları olduğunu gördüm. Bu dosyalar linux işletim sistemlerinde kullanıcı adları ve şifrelerini tutmak için kullanılmaktadır. Bu dosyaları unshadow ederek ve ardından John The Ripper(john)'a vererek bir wordlistte bulunan şifrelerle karşılaştırabilirsiniz. Ancak bu yöntem uzun sürmektedir. Bu yüzden ben de yine fcrackzip ile Rockyou wordlistini kullanarak "flag.txt.zip" dosyası üzerinde deneme yaptım ve 1-2 saniye gibi kısa bir sürede dosyanın şifresini buldum.



Dosyanın şifresi "rolex" idi. Şifreyi girdiğimde flag'e eriştim. Flag:
Flag{Cakma_r0lex_Ama_b1re_b1r}


Linux


*) Linux-image



Bu soru puanından da anlaşılacağı üzere soru değildi, sadece diğer linux sorularının çözüleceği sanal makinenin linklerinin paylaşıldığı bir platformdu. Sanal makineye girerken linuxun default yönetici adı ve şifresiyle giriş yapabildim.

Kullanıcı: root

Şifre: toor

Not: CTF'de sorular soru ismine göre alfabetik olarak gelse de sorular ne kadar çözülürse puanları o kadar azalıyordu ve daha sonra puana göre sorular tekrar sıralanıyordu. Bu kategoride puan sırasına göre değil alfabetik soru adına göre gideceğim.

*) Linux-1



Bu soruda yukarıda bahsedilen passwd ve shadow dosyalarını alarak ve üzerlerinde John The Ripper kullanarak kolaylıkla istenilen kullanıcının şifresini bulabilirdik. Bu dosyaların bulunduğu konumlar /etc/passwd ve /etc/shadow dur.



Yukarıdaki resim passwd dosyasının içeriğini gösterirken aşağıdaki resim ise shadow dosyasının içeriğini göstermektedir. Bizden sadece cybercamp kullanıcısı için şifre istendiğinden sadece o kullanıcının bilgilerini almamız yeterli.



Buradan gelen bilgileri alıp unshadow ve ardından john adlı yazılımlara verdiğimizde flagimizi bulmuş oluyoruz.



Flag:
Flag{123123}

*) Linux-2



Linux işletim sistemleri tüm loglarını /var/log yolu altındaki dosyalarda tutmaktadır. Bu sorunun çözümü için bu directorydeki auth.log dosyasına bakabilirdik.

cd /var/log
cat auth.log | grep "Failed"

Yukarıdaki komutları kullandığımızda rafael adlı kullanıcı üzerinden bir ssh brute-force saldırısı olduğunu görebiliyoruz.



Flag:
Flag{rafael}

*) Linux-3



Bu soru çok kolaydı. apache2 -V komutu ile Apache sunucusunun gerekli tüm bilgilerini görebilmekteyiz.



Flag:
Flag{2.4.29}

*) Linux-4



Sorunun çözümü daha önce bahsettiğim passwd dosyasında yer almaktaydı. Bu dosyayı okuyup tüm kullanıcıları ve ID'lerini görebilirsiniz.



Dikkatli baktığımızda junkieadmin adlı kullanıcının UID(User ID) değerinin root ile eşit olduğunu görmekteyiz. Yani bir yönetici hesabı, üstelik linux'te varsayılan olarak gelmeyen bir hesap.

Flag:
Flag{junkieadmin}

*) Linux-6



Yine yukarıda eklediğim resimden passwd dosyasında Moti kullanıcısının UID değerinin 1002 olduğu görülüyor.

Flag:
Flag{1002} 

*) Linux-7



Bu sorunun cevabını bulmak için last komutunu kullanabiliriz. Linux en son giriş yapan kullanıcıların ne zaman ve hangi yol aracılığıyla giriş yaptığı gibi bilgilerin kaydını tutmaktadır. Soruda istenen formattaki zamanı almak için time-format parametresini full olarak vermemiz gerekmektedir.

last --time-format=full



Flag:
Flag{Tue Dec 18 15:30:49}

*) Linux-8



Bu sorunun çözümü için yine /var/log dizini altındaki apache2 dizinine gitmeli ve access.log dosyası üzerinde arama yapmalıyız. SQL Injection saldırılarında bazı genel geçer anahtar kelimeler bulunmaktadır. Bunlardan UNION anahtar kelimesini arattığımızda sonuç karşımıza çıkıyordu.

cd /var/log/apache2
cat access.log | grep "UNION"



Saldırganın IP adresi flagimiz olacaktı. Flag:
Flag{172.16.172.133}

*) Linux-9




Bu soruda bir yanlış anlaşılma yüzünden 6 hakkımı kaybettim. Soruda kaç defa saldırı denemiştir demiyormuş. Kaç defa istekte bulunmuştur diyormuş. Yani kısaca saldırganın IP adresinden kaç defa istek atıldığını bulmamız gerekiyordu. Aşağıdaki kodu çalıştırdığımızda flag karşımıza çıkıyordu:

cd /var/log/apache2
cat access.log | grep -c "172.16.172.133"



Flag:
Flag{702}

*) Linux-10



Linux işletim sistemlerinde cron-job isimli bir zamanlama servisi bulunmaktadır. Siz makinenizin belirli zaman aralıklarında yapmasını istediğiniz görevlerinizi bu servis ile ayarlayabilirsiniz. Örneğin bir websitesinden hava durumunu bilgisayarınıza çeken bir yazılım yazıp bunun cron-job ile günde 2 defa, 4 defa, belirli saatlerde otomatik olarak çalıştırması için sisteme verebilirsiniz. Yazılan cron-job kuralları /etc dizini altında gerekli dosyalarda tutulmaktadır. Aşağıdaki komut ile flagimizi bulabiliriz:

cd /etc
cat crontab



Flag:
Flag{http://sibertehdit.com/}


Misc


*) Gamer150



Soruda verilen internet sitesine gittiğimizde bizi aşağıdaki gibi bir sayfa karşılamakta ve içerisinde bir resimden başka hiç bir bilgi bulunmamaktaydı.



İlk önce flag'i Flag{Minecraft} gibi bir şey denesem de, bu kadar kolay olmayacağını biliyordum. Dolayısıyla yine dirbuster adlı yazılımdan yardım alarak game adlı bir dizini ortaya çıkardım.



Bu dizindeki "game.html" adlı sayfaya gittiğimde ve kaynak kodlarını incelediğimde, başka bir internet sitesinin adresine ulaştım.

https://www.proprofs.com/games/word-games/word-scramble/cybercamp2019/

Bu adresteki oyun bir anagram çözme oyunuydu. Yaklaşık bir 10-15 dk uğraştıktan sonra aklıma daha ileri seviyeler olabileceği geldi. Bu yüzden sitenin kaynak kodlarını incelediğimde, şuanki ve gelecekte gelecek kelimelerin virgül ile ayrılmış bir biçimde Base64 ile şifrelendiğini gördüm.



Bu şifrelenmiş metni decode ettiğimde sırayla oyundaki tüm levellerdeki kelimeleri bulmuş oldum:

BASEALTMISDORT,SANDIN,AMA,BIR,FARKLA,XORLU

Ne demek istediğini çözmeye çalışırken, dirbuster'ın arkada bir dizin daha bulduğunu fark ettim. Yeni dizine gittiğimde ne demek istediğini anlamış oldum. Yeni dizinin adı future idi ve içerisinde ya_ka_lan_dim.txt adlı bir dosya bulunmaktaydı. Dosyanın içeriği aşağıdaki gibi base64 ile şifrelenmişti. Ancak çözmeye çalıştığımda anlamsız harfler çıkıyordu. Yani oyunda söylediği gibi aslında XOR Encryption kullanılmıştı.


Basit bir Python scripti yazarak önce base64'ten çıkan anlamsız kelimelerin hangi key ile XOR'landığını bulmam ve tersine XOR yapmam gerekiyordu.



Flag:
Flag{0_d3g1ld3_1y1_3gl3nd1k}


Bonus

*) BONUS


Bonus soru aslında CTF'in kurallarını sonuna kadar okuyan herkes için çok kolay bir soruydu. Kuralların en sonunda flag verilmişti:
Flag{RTFM_h3r_z4m4n_1s3_y4r4r}


Kaynaklar


  1. https://medium.com/@omerfaruk.ozer/ctf-cybercamp2019-writeup-324fb60a093

Yorumlar