Hacktrick 2014 Web App CTF [ Çözümler ]

Merhaba

IntelRAD olarak sponsor olduğumuz Hacktrick konferansında Web Applicatipn CTF’i düzenledik. Standart saldırılardan dışarıya çıkıp, gerçek hayatta ki penetrasyon testlerinde karşılaştığım durumları simüle ettiğimiz bu yarışmada toplamda 5 adet level bulunmaktaydı.

1 – FUEL

Yarışmanın ilk 1 saati boyunca hiçbir grubun puan kazanamaması üzerine ilk ip ucu FUEL level’i için yayınlandı.

Bu level’de aşağıdaki iptables komutu ile erişimin engellendiği administrator.html sayfasında ki flag’in elde edilmesi hedeflenmişti.

iptables -A INPUT -p tcp --dport 80 -m string --string administrator.html  -j REJECT --reject-with tcp-reset --algo bm

İpucunda fragroute uygulaması ile paket bölümlemesi yapılacağı belirtilmişti. Aynı zamanda urlencoding işlemi ile iptables’in atlatılmasının önüne geçilmesi içinde % işaretide yukarıdakine benzer bir komutla yasaklı durumdaydı. Yarışma esnasında bu ikinci kural kaldırılarak level’in zorluğu düşürüldü ve aşağıdaki http talebi ile bayrak elde edilebilir duruma geldi.

www.fuel.com/%61dministrator.html

2 – KHALEESI

Bu level’de yarışması güzel bir fotoğraf bekliyordu. Hedef obfuscate edilmiş javascript kodlarının okunarak HTML5 local storage’a yazılan encrypted string’in çözülmesiydi.

console['log']('Yea I know I\'m so hot and that can be cause lack of attention<3');
console['log']('Oh my dragons! My beautiful dragons...');
var arr_list = CryptoJS.MD5('abcdef1234567890').toString();
localStorage['setItem']('flag', 'U2FsdGVkX1/d+AKV6nrvKw0mwepr2/LIeS0sW4EveGKEv4cinrxne8MiSUEozt3DAYt25i1u7m4=');
var EncryptedLocalStorage = (function (_0x85cbx3) {
    'use strict';
    var EncryptedLocalStorage = function (_0x85cbx6) {
            if (!_0x85cbx6) {
                throw 'Missing secret!';
            };
            this['secret'] = _0x85cbx6;
        },
        _0x85cbx4 = function (_0x85cbx7, _0x85cbx6) {
            var _0x85cbx8 = JSON['stringify'](_0x85cbx7);
            return CryptoJS['TripleDES']['encrypt'](_0x85cbx8, _0x85cbx6);
        },
        _0x85cbx5 = function (_0x85cbx9, _0x85cbx6) {
            var _0x85cbxa = CryptoJS['TripleDES']['decrypt'](_0x85cbx9, _0x85cbx6);
            return JSON['parse'](_0x85cbxa.toString(CryptoJS['enc'].Utf8));
        };
    EncryptedLocalStorage['prototype'] = {
        get: function (_0x85cbxb) {
            var _0x85cbx9 = _0x85cbx3['localStorage']['getItem'](_0x85cbxb);
            return _0x85cbx9 && _0x85cbx5(_0x85cbx9, this['secret']);
        },
        set: function (_0x85cbxb, _0x85cbx7) {
            if (!_0x85cbx7) {
                this['remove'](_0x85cbxb);
                return;
            };
            var _0x85cbx9 = _0x85cbx4(_0x85cbx7, this['secret']);
            _0x85cbx3['localStorage']['setItem'](_0x85cbxb, _0x85cbx9);
        },
        remove: function (_0x85cbxb) {
            _0x85cbx3['localStorage']['removeItem'](_0x85cbxb);
        }
    };
    return EncryptedLocalStorage;
}(window));
if (location['hash']['substring'](1)['split'](decodeURIComponent('-'))) {
    var els = new EncryptedLocalStorage(arr_list['substring'](location['hash']['substring'](1)['split'](decodeURIComponent('-'))[0], location['hash']['substring'](1)['split'](decodeURIComponent('-'))[1]));
    if (location['hash']['substring'](1)['split'](decodeURIComponent('-'))[0] == ((7 ^ 15) - 1) && location['hash']['substring'](1)['split'](decodeURIComponent('-'))[1] == (7 ^ 22)) {
        alert('Flag:' + els['get']('flag'));
    };
};

Son kısımda ki kodlar analiz edildiğinde location hash üzerinden alınan veriye göre if kontrolünün yapıldığı görülmekteydi.

www.khaleesi.com/#7-17 adresi Firefox ile çağırıldığında bayrak elde edilebiliyordu.

3 – ORION

Bu level’in uzun süre geçilemesi sonucunda ipucu olarak “Hedef sistem MongoDB kullanmaktadır.” ipucu yayınlandı.

Bu ipucu ışığında NoSQL Injection saldırısı yapılarak hedef sisteme administrator hesabı ile giriş yapılmalıydı. NoSQL Injection saldırıları ile ilgili dökümana bu linkten erişebilirsiniz. https://www.mehmetince.net/mongodb-ve-sql-injection-zafiyetleri/

www.hedefsistem.com/login.php adresine aşağıdaki POST değişkenleri gönderildiğinde bayrak kolaylıkla elde edilebilmekteydi.

login=admin&password[$ne]=gercekolmayansifre

4 – IRON THRONE

Bu level’inda uzun süre çözülememesi nedeniyle hedef sistemde error_reporting değiştirilerek hatalar yarışmacılara gösterilmiştir.

Basit düzey bir MySQL Injection level’i olan Iron Throne’da ki en önemli nokta, html form değişkenlerinin public key ile şifreleniyor olmasıydı. Sunucu tarafında bu talebi karşılayan php kendisinde saklı bulunan private_key ile çözümleyerek ilgili değere göre sql sorgusu çalıştırmaktaydı. Bu önlem ile hemen hemen tüm yarışmacılar sqlmap’i kullanamadıkları için level’ı geçmede başarılı olamadılar. SQL Injection Union Based Like Query türündeydi.

5 – DOMIFY

Bu level’de tüm yarışmacılardan cevapları mail üzerinden alındı ve Chrome, Firefox, Internet Explorer ve Opera için geçerli ortak XSS payloadı beklenmekteydi.

<a href="#" onclick="someRedirectFunc('1337', 'index.php?click=KULLANICI_GIRDISI');">

Yukarıdaki XSS zafiyeti için redirect oluşmadan en fazla tarayıcıyı etkileyen payload’lar en yüksek puanı aldılar.

Kaynak Kodlar Github’da

Yarışmanın kaynak kodlarına https://github.com/mmetince/hacktrick14_web_ctf adresinden erişebilirsiniz

Yarışmayı 1.cilik ile kazanan 0xdeffbeef takımını tebrik ediyoruz. Kendi çözümlerine http://blog.0xdeffbeef.com/ blog adresinde ki yazılarından ulaşabilirsiniz.