MdiseCTF 0x03 – CTF Yarışması Sonuçları

Merhaba

Geçtiğimiz günlerde düzenlenen ve CTF serisinin üçüncüsü olan Picus Security tarafından ödüllü MdiseCTF 0x03 yarışması sona erdi. Bu yarışmaya toplamda 188 kişi katılım gösterdi. Doğru sonuca ise toplamda 9 adet yarışmacı ulaştı ve sonuçlarını mail yolu ile bana gönderdi. Göstermiş oldukları destek için Picus Security’e tekrardan teşekkürler. Şimdi gelelim çözümlere ve Raspberry Pi kazanan yarışmacıya.

Çözüm

Yarışmanın duyurulduğu yazıda (https://www.mehmetince.net/mdisectf-0x03-raspberry-pi-odullu-ctf-yarismasi-yayinda/) aşağıdaki javascript kodu paylaşılmıştı.

Bu kod okunabilir hale çevirildiğinde ise aşağıdaki gibi olmaktaydı.

Belli ki  yarışma için hazırlanan bu Javascript kodu obfuscation tekniği ile okunabilirliği azaltılmıştı. Bu kodu console’a yazıp anazli ettiğimizde aşağıdaki array dikkat çekmekteydi.

JavascriptArray içerisindeki dikkat çekici nokta ise tersten yazılmış olan base64 kodu oldu. Bu kod aşağıdaki şekilde çözümlendiğinde bir sonraki adıma geçiş tamamlanacaktı.

Bu noktadan sonra CTF, http://0x03.mdisec.com adresinde ki web uygulaması üzerinden devam edecekti.

Picus Security Login

http://0x03.mdisec.com adresinde bir adet login sayfası çıkmaktaydı. Bu aşama yarışmacılar tarafından bol bol SQLMap’e maruz bırakılan nokta oldu. Yarışmacıların %99’unun takıldığı yer ise bu login sayfası oldu. Ta ki aşağıdaki ip ucu yayınlanana kadar.

Vi editoru herhangi bir dosyayı düzenlemeden önce o dosyanın backup’ını oluşturur. Eğer düzenleme işlemi başarıyla tamamlanmaz ise (:wq! komutu), backup dosyası gizli dosya olarak hedefte dizinde kalmaktadır. Buda bilgi ifşasına neden olan ve web uygulama testi gerçekleştiren arkadaşlar tarafından genel olarak bilinen/bilinmesi gereken bir durumdur.

http://0x03.mdisec.com/.index.php.swp

adresine ulaşım sağlandığında aşağıdaki kaynak koda ulaşılmış olacaktır.

Kod adım adım şunu gerçekleştirmektedir.

1 – Kullanıcının form aracılığı ile gönderdiği parolayı al.

2 – Eğer parolanın md5’i uygulama tarafında belirlenen sabit değer ile aynı ise flag’i header üzerinden paylaş.

Bu noktada dikkat edilmesi gereken şey, kod tarafında ki KEY değerinin 32 karakterden uzun olduğudur. Yani MD5 değeri değildir! Akıllara şu soru doğrudan gelecektir. “Md5’i alınan bir değer uzunluğu 40 karakter olan KEY değeri ile if’e girerse nasıl sonuç TRUE dönebilir ki ? “ Bu aslında benim ikinci ipucunu tweet atmak yerine kod içerisine koyma kararı almamdan kaynaklanmakta. ( Teşekkürler Cihat)

PHP Madness

PHP son derece ilginç bir dil. Bu ilginçliğe dikkat çekmek adına, CTF’imizde PHP’nin eşitlik sorgulamalarında ki bir detayı ele aldık. Aşağıdaki kodu dikkatlice okuyunuz lütfen.

Mantıken 0e0 değeri ile 0e1 değeri eşit olmadığı için sonucun TRUE olmaması beklenir. Ama malesef PHP sonucu TRUE döndürmektedir.

Bunun sebebi ise “php scientific notation” da gizli. Aslında “0e86982004367237686113517103584116354523” değeri PHP tarafından 0*10^869… olarak algılanıyordu. Doğru kodu == yerine PHP’de ki === karşılaştırması ile yazılmış olması gerekirdi. Bu bilginin ışığında  tek ihtiyacımız olan sıfır ve “e” harfleri ile başlayıp son karakterine kadar rakamlardan oluşan bir md5 hash değerine sahip string bulmaktır. Daha sade bir ifade ile

BIZIM DEĞER dediğimiz alanda eğer 0e ile başlayıp kalan 30 karakteride integer olan bir MD5 değeri üretebilirsek sonucu TRUE döndürmeyi başarmış olacağız. Bu değerleri üretmek görünürde zor gibi olsada, internet üzerinden yapılacak bir araştırma ile en azından aşağıdaki iki değere ulaşılabilmekteydi.

Sonuç olarak aşağıdaki GET request’i çözüme başarıyla ulaşmanızı sağlamış olacaktı.

Değerlendirme Süreci ve Başvuranlar

Değerlendirme süreci şu şekilde olmakta.

  1. Sadece ve sadece tam/doğru çözümü gönderen kişiler seçilir.
  2. Çözümü ilk gönderen kişi 100 puan, ikinci gönderen kişi 95 puan şeklinde azalan değerler çözüm gönderen yarışmacılara sırasıyla verilir. En son ise 50 sabitlenecektir. Bu değer T ile ifade edilir.
  3. Yazılan raporlara değerlendirme ekibi tarafından 100 üzerinden puan verilir. Bu değer R ile ifade edilir.
  4. T değerinin %25,  R değerlerinin %30’u alınır.
  5. Her katılımcı için 0-20 arasından random seçilen değerin %50’si alınır.
  6. Bu üç değer toplanır ve
  7. En yüksek puanı alan yarışmayı kazanır.

Kazanan Kişi : Mert Arisoy!

Katılan herkese teşekkürler. Lütfen görüş ve düşüncelerinizi twitter yerine konuya yorum olarak yapınız.

  • Deniz Parlak

    Sadece vi editör’ün backup modu ile alakalı bir sey eklemek istedim. Swap, backup ve undo dosyaları teorik olarak birbirlerine benziyor olsa da, yapısal olarak farklılıkları var. Bu soruda kullanılan .swp uzantısına göre konusacak olursak, aslında bir dosyayı degistirmeye basladıgımız anda, eger vimrc dosyasında

    set backup

    parametresi tanımlı ise, dosyanın ~ uzantılı backup dosyası, aksi belirtilmedikce aynı dizinde yer alır. Bu backup dosyası, icerigi degistirmeden önceki orjinal halidir. Fakat .swp uzantılı dosyaların mantıgı söyle, ben xx dosyasının icerigine müdahale etmeye baslarım, yeni girilen bilgiler buffer’da tutulur, .böylelikle xx.swp dosyası da son degisiklikleri dinamik olarak günceller. Crash / kesinti durumunda .swp üzerinden recover islemi yapılarak dosyanın son hali kurtarılabilir.

    Tesekkürler tekrardan.

    • Deniz, hem katıldığın için hemde bu denli detaylı bilgi paylaştığın için teşekkür ederim. :)

  • Mehmet Gürsul

    Tabi sizin gibi kişiler olmasa bu gençler bilgilerini yanlış yerde kulanır Teşekkürler

  • Güzel soru hazırlamışsın eline sağlık. Web application tabanlı bu soruda olduğu gibi ufak ama tatlı trickler ile çözülen soruları hep sevmişimdir.

    Çözen herkesi de tebrik ediyorum.