HackMETU 2016

Merhabalar. Bu yazıda geçen haftasonu Ömer ile beraber katıldığımız Hackmetu etkinliğinden bahsedeceğim.

Bu yazıyı 3 başlık altında inceleyeceğim.

  1. Eleştiri
  2. Övgü
  3. Sonuç

HackMETU, (her nekadar diğer üniversitelerdeki dallarından pek haz etmesem de) IEEE’nin ODTU kolu tarafından 2. kez organize edilen CTF yani capture the flag yarışması.  4-5 Farklı kategoride 4-5 farklı sorunun yer aldığı yarışmada soruların içine gizlenmiş flagleri bulup sisteme girmeniz gerekiyor. 1 sorunun flag’ini diğer takımlardan önce bulup sisteme giren takım ise diğer takımlara göre bonus puanlar alıyordu.

Hadi başlayalım; önce bi yerden yere vuralım ki seneye ortaya daha kaliteli bir etkinlik çıksın. Sonra övgü kısmına geçelim ki linç edilmeyelim 🙂

Eleştiri

Etkinliğe dair tek eleştirim galiba sorular olacak. Çünkü sorular bizi aşırı derece uyuz etti ve soruların çözümleri açıklanırken gördük ki aslında biz çoğunu çözmüşüz ama farkında değiliz. Zaten sorular cevaplanırken yanımda oturan yetkili bir abi vardı (kim olduğu bilmiyorum) soruların cevaplarını görüp Ömer’e “lan oğlum bunu bile çözmüşüz lan” diyip dizimi yumruklarken bana bakıp gülümsemişti 🙂

Buradan başta sevgili dostum Kadir olmak olmak üzere tüm yetkililere sesleniyorum. Biraz daha mantıklı bir hint sistemine geçin lütfen. Zira çözdüğümüz sorular çözdüğümüzün bile farkına varamamışız. Aklımda kalan 1-2 soru ile anlatayım.

Web100

Web100 sorusunda bir page verilmişti. Page’i her açtığınızda en üstte “bc0589” charset’i ile random 8 karakterlik bir text basılıyordu. Sayfada ise kullanıcı adı ve şifre ile giriş yapmamızı isteyen bir form vardı. Tabi işimiz zorlaşsın diye birde hidden input’a csrf token konmuştu. Yapılacak iş belli, ufak bir kod yazacaktık ve 8 üssü 6 yani toplamda 262.144 ihtimalin deneneceği bir bruteforce saldırısı gerçekleştirecekti. Yaptık; inanmayana kodu bile atarım. Kodu 3 defa çalıştırdım ve tüm ihtimalleri denedi ancak hiçbirinin doğru olamadığı mesajını verdi. Hatta yetkilileri çağırıp “bakın mantığı bu, koduda yazdık ancak sonuç bulunamıyor” dedik ama sonuç nafile. 100 puan çöpe gitmiş oldu, neyse sağlık olsun.

Merak edenlere; yazdığımız kod : https://github.com/Om3rCitak/hackmetu2016/tree/master/web100

Web 300

Abi sözde en iddialı olduğumu iddia ettiğim “injection” sorusunu yapamadım. hatta hint olarak “sql injection” bile dediler ancak ona rağmen yapamadım. Zaten yapabilen tek takım vardı. Aslında çok basit soruydu; biz dahil çoğu ekibin yapabileceği tarzda bir soruydu ancak pekte injectionluk olmayan bşka bir incelik vardı soruda. Php geliştiricileri bilir, aksini belirtmemişseniz php ile bir session oluşturursanız php clientte “PHPSESSID” adında bir cookie oluşturur ve içine 27 karakterlik bir değer kaydeder. Soruyu hazırlayan arkadaşta yanıltma amaçlı PHPSESSID adında bir cookie set etmiş ve içine kendi random oluşturduğu 27 karakterlik bir değer girmiş. Dışardan bakıldığında php session id gibi gözüktüğünden session editlemek kimsenin aklına gelmemiştir. Halbuki cookie’deki değerin sonuna  “‘ or 1=1 #” gibi klasik sql injection payload’ı yazığımız vakit flagi bulabiliyormuşuz.

Bu soruya eleştirim şu; abi bu injection sorusu olmamış ki. Benim ve diğer ekiplerin bu sorudaki beklentisi; injection yapabileceğimiz yerin basit ancak injeciton işleminin bir hayli yorucu olmasıydı. Ancak php session id gibi fake bir cookie set edip, buna “‘or 1=1 #” gibi en basit injection payloadı ile flag veren bir soru hazırlanıyor ise bu sorunun hint’i “sql injection” olmamalıydı. Zira sql tarafı session tarafının altında kalmış.

Ek olarak; username ve password db’ye kaydedilmeden önce htmlspecialchars fonksiyonundan geçirilmiş. Bundan dolayı string yerinde form’dan bir dizi gönderirseniz htmlspecialchars patlıyor ve hata veriyor. İş böyle olunca tüm dikkatimiz htmlspecialchars üzerine yoğunlaşıyor. Acaba htmlspecialschars fonksiyonunun bir bug’ımı var diye epey araştırdık; bulduğumuz yöntemleri denedik. Ama sonuç nafile…

Web 500

Bu sorudaki eleştirim ise sorunun yanlış puanlandırılması yönünde. Web kategorisinin en son ve en yüksek puanlı sorusuydu. Bu sorudan önceki diğer 4 sorunun zorluk seviyesine bakınca son soruda biraz daha beklentimiz yükseldi. Epey uçuk kaçık şeyler denedik. Verilen tek hint ise arkada nodejs’in çalıştığıydı.

Yine çözümlerde öğrendik ki sisteme formdan gönderdiğimiz text node js tarafında eval fonksiyonuna sokuluyormuş. dolayısı ile “1+1” gibi bir metin önderdiğinizde ekrana “1+1” değil de “2” basıyor. Arkada flag diye bir değişken set edildiğinden “return flag” gibi bir komut ile doğrudan flag i görebiliyormuşuz. Bukadar basit bir soru sona koyulup en yüksek puan verilince abuk subuk şeyler denemekten basit şeylerin olabileceği aklımıza bile gelmedi.

Vestel Sponsor Sorusu

Beni ve tüm ekipleri sinir eden en büyük soru buydu herhalde. Soruda hiçbirşey belli değil. Tek bilinen elimizde bir metin var ve bu metin şifrelenmiş. Her türlü şifreleme algoritmasından geçirmemize rağmen herhangi bir plain-text’e ulaşamadık. En son baktılar kimse çözemiyor; 2 hint verdiler. İlk hint klasik sezar şifrelemesi olduğuydu. Tabi herkes abandı sezara. Zaten altı üstü 26 ihtimal var; deniyoruz deniyoruz olmuyor. Ardından 2. hint geldi; 2. hintte ise kullanılan charset verildi.

Charset’i gördüğümde verdiğim tepki şuydu : “abi siz bizimle dalga mı geçiyorsunuz?”. Kahinmiyiz biz. O hint gelmezse o charset’i neye göre oluşturalım? Biraz mantık lütfen.

Herneyse; charset’te belli olunca biz dahil her ekip çat diye çözdü. Ama yine bir sorun vardı; bulduğumuz flagi girmemize rağmen hatalı flag uyarısı alıyorduk. Bunun üzerine 3. hint geldi; 3. hint ise bize şifreleme ile verilen java kodlarını dikkatlice incemememizdi.

Java kodunda ise ilk önce plaintext ekrana basılıyor, ardından bi alt satıra hash basılıyordu. (veya tam tersi şuan emin değilim) Bu ihtimalleri de denedik yine olmadı. Soruyu çözebilen tek ekip vardı. Ne tesadüf ki o ekip bizim yan masamızda idi. Nasıl çözdüklerini sorduğumuzda “abi valla bilerek çözmedik elim bir tuşa değdi oldu” deyince biz şok biz iptal.

Herneyse etkinlik sonrası sorunun çözümü açıklanırken bulduğumuz plain-text’in sonuna bir alt satıra geçip o hali ile flag olarak girmemiz gerekiyormuş. Çözen arkadaş yanlışlıkla enter’a basıp alt satıra geçtiğinden dolayı çözebilmiş. Tabi çözümü duyunca içinden biraz tepki gösterdim. Kodu inceleyin dendi; inceledik. çıktı olarak plaintext ve hash beraber basılıyor ekrana ama flagi isterken sadece plaintext i ve sonundaki alt satıra geçme karakterini koyup girmemiz gerekiyormuş. Zaten sponsor sorusuydu; soruyu hazırlayan Vestel’di. Vestel’den her kim hazırladıysa kendisini tebrik ediyorum(!) Çok mantıklı(!), çelişkisiz(!) bir soru hazırlamış

(Bu sorunun etkinliği düzenleyenler ile alakası yok. Tüm eleştirim doğrudan Vestel’e)

Övgü

Şimdi okadar eleştirdik ama yiğidin hakkını da verelim. O eleştirilerin hepsi daha ülkemize yeni yeni yerleşen CTF kültürünü daha iyi noktalara taşımak içindi. Öncelikle çok kaliteli bir etkinlik olmuş. Fiziksel olarak yarışmacıların bir arada olmasının verdiği epey zorluklar vardır. Ekip bunların hepsini düşünmüş. Her masa için özel ısıtıcılar vardı; neredeyse hiç üşümedik. Yemekler hiçte fena değildi. Beklediğimden daha fazla öğün yemek verildi. Besleyici ve lezzetliydi.

Uyumak isteyenler unutulmamış; boş bir sınıfa komple minder serilmişti. İsteyen orada uyuyabiliyordu. (Birde pike tarzı birşey de verileymiş iyimiş.) Teknik olarak network ve altyapıda hiçbir sıkıntı ile karşılaşmadık. Tüm sistem tıkır tıkır işledi.

Sorular seviye olarak gayet tatlıydı; ama yukarıdaki eleştirilerim biraz uyuz etti beni. Onun dışında gayet hoştu.

Etkinlikte verilen ödüller gayet tatmin edici seviyedeydi. 1. ödülü 3000tl + kişi başı Vestel Venus akıllı telefon idi.

 

Sonuç

Sonuç olarak; gayet keyifli bir etkinlikti. Güldük, eğlendik, rekabet ettik, yeni şeyler öğrendik (ki bence en önemli noktası bu), yeni arkadaşlıklar edindik.

Başta Kadir olmak üzere etkinlikte emeği geçen herkese teşekkür ediyor, 1. olan ekibi (ki kendileri zaten sevdiğim arkadaşlarımdır)(Halit, Deniz ve Cihad) tebrik ediyorum. Hackmetu 2017’de görüşmek üzere!

 

Edit 1 :

Yarışmaya katılım sağlayan ve blog tutan diğer yarışmacılar yazılarını buldukça aşağıya ekleyeceğim.

http://hasanemreozer.com/hackmetu16/

http://www.aliagdeniz.com/2016/02/hackmetu-16.html

 

Comments on this post

  1. p3asant

    Selam,

    Web100 sorusunda yazdığınız kodda sessionı korumuyorsunuz.Her seferinde yeni session başlıyor dolayısıyla tokenınız invalid olmuş oluyor.Aynı sessiondan devam ettirmeliydiniz.

  2. p3asant

    Tarayıcıdan bir valid session id yaratıp şu scriptte gereken yere yazarsanız mesela session hep aynı olacağı için hep sizin için üretilmiş tokenları girmiş olacaksınız.

    http://www.codesend.com/view/503a2f7e09679c05590046bed579d931/

Leave a Reply

Your email address will not be published. Required fields are marked *

Trackbacks and Pinbacks

  1. […] http://omercitak.com/hackmetu-2016/ […]

TrackBack URL