Background Image

BLOG

17 Şubat 2018 CTF

DKHOS - Web 500 - Biz de beklemiyorduk


Web500 sorusu normalde tamamen başka bir soruydu ancak tahlihsizlikten dolayı hızlıca bu soruyu devreye aldık. Burada da en başlarda çok sayıda arkadaşın otomatize araçlara yüklenmesinden dolayı hem sistemde çeşitli problemler hem de python'un cache yapısından dolayı ilk dakikalarda beklenmedik şeyler yaşanabildi. Örneğin aslında benim sunucudan sildiğim ve tüm workerlerı yeniden başlattığımdan emin olduğum halde kodun bir önceki haline erişen arkadaşlar oldu. Daha sonra da o eski koda göre işlem yaptıkları için biraz zorlandılar. İkinci sunucuyu da devreye alınca ve otomatize araçlar da işini bitirince her şey normalde döndü ve arkadaşlar rahat rahat soruyu çözdü. Özetle zor bir soru değildi ancak uğraştırıyordu.

Sayfaya girdğimizde bizi cmd parametresinden aldığı komutu çalıştırıp çıktısını ekrana basan bir web uygulaması bekliyordu. Çok ciddi bir blacklisti vardı ve hem gönderilen requestler de hem de dönen responseları filtreliyordu. Dolayısıyla bir komut bulup flagi okusanız daha içeriğinde geçen kelimelerden dolayı yasaklanıyordu.

Soru içerisinde klasik ' , " , & , && , ` gibi çok bilinen teknikler yerine bash brace expansion da denilen tekniği kullanabiliyorduk. Örneğin aşağıdaki resimde kök dizine atılmış ls -la komutu gözükmektedir. Amacımız da oldukça açık gözüküyor, /flag dosyasını okumak.

Sistemde dosya okumak için gerekli olan komudumuz da base32'dir. Her ne kadar base64 yasaklanmış olsa da base32 serbest durumdaydı ve istediğimiz dosyanın içeriğini okuyabiliyorduk. Örneğin rev veya od gibi araçlar kullansaydık onların outputundan dolayı yasaklandığını görebilirdik.

Benzer şekilde base32 kullanarak server.py dosyasının içeriğini görebilirdik. Burada bizi ilgilendiren nokta server çalışmaya başladığında /flag dosyasını açıyor ve bunu bir daha kapatmıyordu. Dolayısıyla biz bu dosyaya FDler aracılığı ile ulaşabilirdik. Linux altında /proc/<pid>/fd/ altından bu değerler rahatlıkla görülebilmektedir.

Açık olan processler ve dosyalarını görmek için lsof kullanabiliriz. Örneğin aşağıdaki resimden görüldüğü üzere, 11148 pid numarasına sahip gunicorn processi 26 numaralı FD içeriğinde /flag dosyasını tutmaktadır. Bu bilgilere dayanarak /proc/11148/fd/26 dosyası aslında /flag dosyasını göstermektedir.

Base32 komutunu kullanarak dosyayı ilgili yerden okuduğumuzda, içerisinde flag kelimesini kullanmadan, /flag dizinindeki dosyayı rahatlıkla okumuş oluruz.

İlgili değer decode edildiğinde de DKHOS_{s0ns_of_d3nn1s_r1tch3} flagine ulaşılmaktadır.