Siber Yıldız -2019 | CTF (Capture The Flag) Write-Up
Merhaba arkadaşlar bu sene ikincisi düzenlenen Türkiye'nin Siber Yıldızları yarışmasına WWarriors takımı olarak bizde katıldık ve 7. olarak tamamladık. (Kesin sonuçlar Henüz Açıklanmadı)
Takım arkadaşlarıma gayretlerinden ve çalışmalarından dolayı teşekkür ederim.
Çözümlerimizi sizlerle de paylaşayım istedim , faydalı olması dileğiyle...
Çözümlere dair dosyaları en alttan indirebilirsiniz.
- --- Hazırlık Soruları
Bu sorular yarışma başlamadan önce flag formatları nasıl olabilir anlaşılabilsin amacıyla sorulmuş sorulardı.
- --Hazırlık Sorusu - 1 | Bilişim şirketimizde çalışmak ister misin ?
Soruyu açtığımızda bizi bir site karşılamış oluyor
Sağında solunda biraz gezindikten sonra kaynak kodunu görüntüle yapıyoruz ve bizi bir yorum satırı karşılıyor
Bizde hemen dizin tarama araçlarından birini çalıştırıp panel adresine ulaşmaya çalışıyoruz bu konuda dirb veya gobuster tercih edilebilir.
Sonuç olarak dizin adresini bulup girdiğimizde Flag doğrudan karşımıza geliyor
FLAG: RUp2cWFJNHNmekYvQVUyemZXQXRYbFV6Tll4cEQ0UFJGYTVLb25MN 3EwdW8ra3VxNncrVFNtRFRNenJ1VlVEVFJBQlRySklHWkU5eGw4Z3o0dWlKSEE9PQ==
- --Hazırlık Sorusu - 2 | Dikkatle incelersen cevabı bulabilirsin.
Soruyu açtığımızda bizi bir yazı karşılamış oluyor.
Hemen ilk olarak kaynak koduna göz atıyoruz.
İpucu olarak verilen dosyayı inceliyoruz.
Karşımıza çıkan algoritmayı incelediğimizde, bize 4. anahtardan sonraki kısım bize bayrağı vereceğini belirtiyor.
Bizde hemen split yapıp saydık ve karşımıza "87habythi15ng151.php" çıkmış oldu. Siz isterseniz split fonksiyonu yazabilirsiniz veya online split kullanabilirsiniz ben uğraşmadım o kadar bakınca anlaşılıyor zaten :)
87habythi15ng151.php cevabını md5 ile hash değerini alıyoruz ve sonucu bulmuş oluyoruz.
FLAG: 28833db32bb4def17138de776fe2156a
- --- Yarışma Soruları
Şimdi ise asıl yarışma sorularına bakalım.
- --Soru - 1 | Bu gerçekten kolay
İndirdiğimiz dikkatli.bak.dms adında dosyayı herhangi bir text editör ile açtığımızda cevap karşımızda duruyordu.
FLAG: RDcxVWV3SUFLM29RazBGV1Rnb0dsbURpWDJnckg1MUgvZ09WWFZ mbkFBWXpsNCt5K2ZBMjI2TnRKKzJvZ29xV0lEZ0NSK1lIMklWRkRyOC9XbWpOcEE9PQ==
- --Soru - 2 | Hala ısınmalardasın
Açılan sayfada doğrudan kaynak kodunu görüntüle yaptık ve script kodu oldupğunu gördük.
Zamandan tasarruf etmek için decode etmeye çalışmadan önce kopyalayıp console.log() verelim.
Bir hata karşıladı bizi hemen vazgeçmedik ve hataya göz atalım istedik ve bingoo.
FLAG: NjJJdTJZRzZkS2FTa1p4Wi91dFpsdWpMRmNyOExQTXdIYUFiMkY1ZEtsS3 gveUhGQkVyUFN5QWsxbUNIb2RZOTRyeGZiSHpUeGEyQ0puQ3NFSllENkE9PQ==
- --Soru - 3 | Herşey sanal, ağ gerçek
En gıcık sorulardan birisi bu bence , son saatlere girdiğimizde çözebildik Cisco bilsek belki daha kolay çözicez :D
İndirdiğimiz dosyanın içinden pcap dosyası çıkıyor, bizde WireShark ile incelemeye koyuluyoruz.
Paketi incelediğimizde url gezinmeleri nmap logları ve anlamsız paketler görüyorduk. İçerisindeki dosyaları export ettiğimizde de anlamsız dosyalar bulduk işimize yaramayacak bir dünya şey...
Ancak içerisinde işimize yarayabilecek tek bir dosya dikkatimizi çekti sslkeylog.log vardı. Bu nedir derseniz, secret log dosyasına sahip isek sunucu anahtarına sahip olmasak bile ssl üzerinden geçen trafiğin şifresini çözebiliriz.
Artık bu dosyaya sahip olduğumuza göre bunu Wireshark’a ekleyebiliriz. Edit>Preferences’e tıklayıp sol menüden Protocols>SSL ‘i seçiyoruz. (Pre)-Master-Secret log filename kısmından indirdiğimiz dosyayı seçip kaydediyoruz. Artık SSL üzerinden geçen trafiği de okuyabiliriz.
Tekrar Wireshark’a dönüp incelemeye devam ediyoruz. İnceleme esnasında 99037582138585721057129547823.pkt isminde bir dosyaya istekte bulunulmuş.
İsteği daha ayrıntılı görmek için üzerine sağ tıklayıp Follow>Http Stream derseniz giden Get isteğini görebilirsiniz.
Yanıt olarak OK (200) dönmüş ama herhangi bir dosya gelmemiş. Bizde uzak sunucudan bu dosyayı indirdik. Dosyayı nasıl açabileceğimiz konusunda kısa bir araştırma yaptık ve Cisco’nun kendi cihazları için geliştirdiği bir network simulator olan Cisco Packet Tracer için oluşturulan bir dosya olduğunu bulduk ve programı indirdik.
Programı açıp dosyasımızı içerisine çağırdık.
Öyle aradık böyle aradık programın girmediğimiz yeri kalmadı ama işimize yarar bir şey bulamadık.
En son Router cihazının config ayarlarını kaydetmemiz bizi bir sonraki aşamaya taşıdı.
Kaydedilen dosyayı açtığımızda username ve password bulunuyordu.
Bu şifreyi nasıl çözebiliriz araştırmasını yaparken online bir araç bulduk. (http://www.ifm.net.nz/cookbooks/passwordcracker.html)
Şifreyi yazdığımızda "flag md5(r0uterP@ss)" şeklinde cevap döndü ve md5 alıp soruyu çözdük.
FLAG: be4a5b6e929ad88d4f88ad7435ed2eb9
- --Soru - 4 | OBURIX’in şifresi
Karşımızda yine bir pcap dosyası çıkıyor, açıyor ve incelemeye başlıyoruz.
Sorunun adında bir ipucu vardı ve inceleme esnasında OBEX protokolü dikkatimizi çekti. Bu protokol dosya alışverişinde kullanıldığından dolayı, bluetooth ile png dosyası gönderilmiş oldugunu düşenerek png.chunk.data filtresi kullanarak png datasına sahip paketi bulmayı düşündük, gelen sonuçlarda info sekmesinde usom.png yazıyordu, doğru paketi bulmuştuk.
İlgili frame’e OBEX Protocol>Portable Network Graphics’e sağ tıklıyoruz ve Show Packet Bytes’ a basıyoruz. Flag karşımıza geliyor.
FLAG: KOJwaTdxRUoydk9Ea3VpTW8rRVM1UT09
- --Soru - 5 | Emeğe saygı
Bizi çok uğraştıran sorulardan birisiydi. Gerçekten soruyu hazırlayan kişinin emeğine saygı duyulacak cinsten :)
Sayfayı açtığımızda “Cok calistik,cok. Emege saygi gosterin, kaynak belirtin.” şeklinde bir yazı karşılıyordu.
Kaynak belirtin kısmı bize bir ipucu veriyordu, bende baştan öyle yaptım yazılarımdan birinin altına kaynak olarak koydum :) sonra tıkladığımızda başka sayfa hem yavaş açılıyor hem değişiyordu.
Ekrana çıkan yazı bizi heyecanlandırmıştı. Kaynak belirtenlere cevap gönderdik diyor olması benim sunucuya bir giriş olduğunu söylüyordu. Öyleyse sunucuya gelen istekleri yakalamam gerekiyordu. Herhangi bir sniffer aracı işimi görecekti bende snifferı açıp beklemeye başladım. Kaynak gösterdiğim yere girip linke tıkladığımda yönlendirme yapıp geri referer isteği göndermiş oldu.
Açıkçası sorunun böyle çözüleceğini hiç düşünmüyordum :)
FLAG: aFZPL0hkSjhvaThneGdIdkFMcUd1UFZLOGNhMGxGSG1lak1VbXlROFVG OFdxVWI3bjFYTW10bVVFMk5ZdTVQV3daRSsxWFZsbmZWZ3dLOFMveHZxQnc9PQ==
- --Soru - 6 | Reklam arası bitti film başlıyor
Soru bize "dump.scm" adlı dosyayı verdi. Biraz araştırma sonucu .scm uzantılı dosya eski TV kutularındaki kanal listesi düzenleme formatıydı açmak için uygun editörü bulup indirdik ve dosyayı açtık.
Hızlıca linke giriyoruz ve çok sevdiğim filmlerden olan Interstellar filmini karşımızda buluyoruz. Filmin sahnesini izlerken arkadan kötü bir cızırtı sesi geliyor. Hemen videoyu mp3 e çevirip analiz ediyoruz.
FLAG: c6a107c3072414436a6acf122bf4f349
- --Soru - 7 | Bir bakan var bir de aranan
Soruya girdiğimizde alttaki hash karşımıza çıktı.
0827206450376af3dce61d788ddeba21f58dba35257fdb43c1872c096a36287f
Virustotal üzerinden hashi arattığımızda yorumlar kısmında bize bir link vermişti.
https://www.virustotal.com/tr/file /0827206450376af3dce61d788ddeba21f58dba35257fdb43c1872c096a36287f/analysis/
http://85.111.95.19/a5d8bccb8e1255fc72340eddab8be601-mobile01/cyb3rStar.zip (Pass: Cyberstar_2018!. )
Dosyayı indirip içinden çıkan uygulamanın, bir kopyasının uzantısını zip yapıp klaöre çıkararak içindekileri incelemeye başladık. \res\drawable dizinindeki resimler dikkatimizi çekti birer birer incelemeye başladık.
Fotoğrafları analiz ettiğimizde içerisinde her birinde thankyoucyberstar.gif isminde yaklaşık 200 dosya vardı.
Ancak sadece birinde farklı bir dosya bulunuyordu ortakoy.jpg içerisinde lakin oda şifreliydi.
Bir başka resmin exif bilgilerinde ise karmaşık karakterlerden oluşan string dikkatimizi çekti ve şifreli dosya için bu stringi kullandık şifre doğruydu ve bizi bir sonraki adıma götürdü.
İçinden çıkan hadibul.b64 dosyası base64 ile şifrelenmiş bir dosyaydı hemen online bir decoder bulup (http://base64converter.com/) decode ettik. Dosyayı incelediğimizde apk dosyası olduğunu farkettik telefona kurup çalıştırdığımızda ise cevap karşımızdaydı.
FLAG: 05a24ab2b3f6e4d8309575dca5388eeb
- --Soru - 8 | Karekod okuyucu
Giriş ekranı ve kullanıcıları listeleyen bir sayfa vardı, basit kombinasyonlarla giriş yapmayı denedik fakat bir sonuca ulaşamadık.
Ardından kullanıcıların bulunduğu sayfaya göz attığımızda "Yöneticiye özel oluşturulan QR kodu giriniz" ifadesi bulunuyordu.
Hemen aklımıza SQL Inj. ile bir QR kodu oluşturmak geldi ve online bir siteden ' or 1=1# şeklinde bir QR kod oluşturduk.
Oluşturduğumuz kodu servera gönderdiğimizde beklediğimiz sonucu almıştık kullanıcıları listelemişti. Bir tane kullanıcı (admin) ve iki tane hash değeri vardı.
Hash değerlerini decode ettiğimizde, hashlerden birinin değeri admin0123456789 du ve giriş yaptığımızda flag karşımızdaydı.
FLAG: TWtCM1JTRVZydWpqekNVQzBNR09NUHM2SFh2VTNQbFA5WE5PenQx MWtHa3lDL21ydnJEVXFjZUQycHA1Vloxc0dockh1M28xZXBnd3FkUXJrdEd4REE9PQ==
- --Soru - 10 | Herşeyi de sana servis edecek değiliz
Servis gibi servis diye bir web uygulaması bizi karşılıyordu. Giriş yapma ve kayıt olma sayfaları vardı. Kayıt olma sayfasında kayıtların devre dışı bırakıldığı söyleniyordu. Giris yap sayfasındada demo ile giris yap şeklinde bir link bulunuyordu.
Linkin Adresi: ws/ws.php?islem=girisYap&kullaniciAdi=demo&parola=demo şeklindeydi. Kullanıcı adını admin olacak şekilde değiştirdiğimizde kullanıcı mevcut değil şeklinde mesaj alıyorduk. Bizde islem paramteresini değiştirerek ws/ws.php?islem=kayitOL&kullaniciAdi=admin&parola=admin şeklinde bir request yaptık. Ancak sonuç geçersiz method şeklindeydi. Bu sefer yöntem değiştirerek GET metodunu POST metoduyla değiştirince kayit olabildik.
POST /86d37fde1020e969eca3d6436bddb4f5-04/ws/ws.php?islem=kayitOl&kullaniciAdi=admin&parola=admin&email=test HTTP/1.1 Host: 85.111.95.28 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:65.0) Gecko/20100101 Firefox/65.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 Referer: http://85.111.95.28/86d37fde1020e969eca3d6436bddb4f5-04/giris.html Accept-Language: en-US,en;q=0.9 Cookie: PHPSESSID=ttjj1d2lcpoagr63qp2596fqb4 Connection: close Content-Type: application/x-www-form-urlencoded Content-Length: 45 islem=kayitOl&kullaniciAdi=admin&parola=admin&email=test
Yani burada admin:admin şeklinde kayıt olduk. Giriş yaptığımızda admine özel bir sayfa bizi karşılıyordu ve bizden kod istiyordu.
Buralar çok güzel, giriş yap sen de gel bence.
====================================
Admin Kullanıcısı
Doğru cevabı girmen için deneme hakkın 10 tane. Bulduğunda ödülünü de alacaksın. Ona göre:
Sayfanın kaynak kodunu görüntülediğimizde, yorum satırı olarak bir php kodu görünüyordu.
function generateRandomString($length = 6) { $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; $charactersLength = strlen($characters); $randomString = ''; for ($i = 0; $i <= $length; $i++) { $randomString .= $characters[rand(0, $charactersLength - 1)]; } return $randomString; } function decryptFile($source, $key, $dest) { $key = substr(sha1($key, true), 0, 16); $error = false; if ($fpOut = fopen($destc, 'w')) { if ($fpIn = fopen($source, 'rb')) { // Get the initialzation vector from the beginning of the file $iv = fread($fpIn, 16); while (!feof($fpIn)) { // we have to read one block more for decrypting than for encrypting $ciphertext = fread($fpIn, 16 * (FILE_ENCRYPTION_BLOCKS + 1)); $plaintext = openssl_decrypt($ciphertext, 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $iv); // Use the first 16 bytes of the ciphertext as the next initialization vector $iv = substr($ciphertext, 0, 16); fwrite($fpOut, $plaintext); } fclose($fpIn); } else { $error = true; } fclose($fpOut); } else { $error = true; } //key gen with private algorithms //same private algorithms used for check if($keys=generateRandomString(6)) { $k1 = strpos($key,$keys[0]); if($k1===false) { $errors=true; } else { if(strpos($key,$keys[1]) === false) $errors=true; else { if(strpos($key,$keys[2]) === false) $errors=true; else { if(intval($keys[5]) < 9 and intval($keys[5]) >= strlen('12345678')) { if($keys[4] == $key[3]) { if($keys[6] == rand(0,9)) { return $keys; } } } } } } } return false; } function doNotGenerateRandomString($lenght = 4 ){ ... } function keyChecker($keys) { ... } $pass = 'KENDI ADMIN PAROLANIZI BURAYA YAZIN'; $hash = md5($pass); //anahtar uretiliyor $key = decryptFile(PATH, $pass, DEST_PATH); $rand = generateRandomString(6); //gecerli bir anahtar mı diye kontrol ediliyor if(keyChecker($key)) echo 'tebrikler';
Kodu incelemeye koyulduk. Bizden istenen algoritmayı çıkarmaya çalıştık. Bulduğumuz sonuçlar şöyleydi:
- - sha1 ile kullanıcının şifresinin hashini al,
- - hashin ilk 16 karakterini üretici key olarak kullan,
- - keyin 1,2,3. karakterleri üretici key içinde olmalı,
- - keyin 6. karakteri 8 olmalı,
- - geçici keyin 4 karakteri keyin 5. karakteri olmalı,
- - keyin 7. karakteri 0-9 arası random bir sayı olmalı (bunuda deneme yanılma yöntemiyle bulabiliriz)
Bu şartları sağlayan bir key oluşturmamız gerekiyordu.
Admin parolası için geçerli anahtarı dddd38<0-9> şeklinde oluşturduk.
Doğruluğu sağlandığında bize flagı vermiş oldu.
FLAG: U1RpeWtYWWN6ZEw3b1VqRnhPcVhFVlZBbmtMdjJhRmRkTnFYUUV0Nkg 5MGRacDUwOXlBKyt6NXVwSG9OOXRhNzgzaSsvVWh5Y2c3UTNYb29kTmhpWXc9PQ==