Tr0ll 2 Writeup

Arif ARI
5 min readDec 2, 2021

--

Bu yazımda tr0ll zafiyetli makinesinin 2. versiyonunu ele aldım. Keyifli okumalar..
Nmap’in -sP parametresinin kullanarak klasik bir şekilde ağ üzerindeki aktif cihazları görüntüledim ve tr0ll 2 makinesine ait ip adresini tespit ettim: 192.168.216.145

Tarayıcıdan adrese gittiğimizde sayfada bizi aşağıdaki gibi bir görsel karşılayacaktır.

Hedef sistemde açık portları tespit etmek için tekrardan nmap kullandım. Burada belirttiğim -T4 parametresi taramayı hızlı bir şekilde yapması içindir.

Sistemde ftp, ssh ve http portları açıktır. Ftp ve ssh üzerinden bağlantı kurabiliriz ama nasıl? Öncelikle bir dirb taraması yaptım ve mevcut dizinleri getirmesini istedim.

Her dizini tek tek görüntülediğinizde sadece robots.txt dizininde işimize yarayacak birtakım şeylerin olduğunu göreceksiniz.

Sayfa üzerinde birçok dizin mevcut var ve bunlardan dört tanesinin(noob, keep_trying, dont_bother, ok_this_is_it) içinde bir jpg dosyası mevcut.

Bu 4 jpg dosyasını wget aracıyla indirdim ve dosya boyutlarını inceledim. Dosyalardan bir tanesinin boyutu fazla ve şüpheli bir durum teşkil etmektedir. Dosya boyutu fazla olan bu dosyayı strings komutuyla görüntüledikten sonra ‘Look deep within your_self for the answer’ yazını farkettim.

Look Deep within your_self for the answer > Cevap için your_self’in derinliklerine bak!
your_self adlı bir dizin mevcut olabilir düşüncesiyle tarayıcıdan adrese gittim ve bir txt dosyası vardı.

answer.txt önemli bir dosya olabilir.

Dosyayı görüntüledim ve dosyanın bir wordlist olduğunu düşünerek indirdim. Dosya içeriğinde büyük-küçük harf, noktalama işareti ve sayıdan oluşan karakterler var. Büyük ihtimalle base64 ile kodlanmış.

İndirdikten sonra base64 ile decode ettim ve çıktıyı decode.txt adında bir dosyaya kaydettim.

Dosya içeriğinde A’dan Z’ye birçok kelime görülmektedir. Daha öncede bahsettiğim gibi bu bir wordlist ve bunu bağlantı için kullanabilirim. İleride işimize yarayacak mı? Göreceğiz.

Ftp portu üzerinden bağlantı kurmak istediğimde hemen ilk satırda giriş için bir ipucu bırakılmış. Bağlantı için kullanıcı adını ve parolayı Tr0ll olarak girdiğimde başarılı oldum. Dosyaları görüntülediğimde lmao.zip adlı sıkıştırılmış bir dosyanın var olduğunu farkettim. Ardından get komutuyla bu dosyayı çektim.

Malesef zip dosyası şifrelenmiş, erişebilmemiz için bizden parolasını girmemiz istenmektedir. Zip dosyasını şifresini kırabilmek için fcrackzip aracını indirdim ve az önce elde ettiğimiz decode.txt adlı wordlist dosyasını kullanarak fcrackzip aracıyla parolayı kırdım.

Burada belirttiğim üç parametreye değinecek olursam, -u parametresini dosyayı arşivden çıkartmak için, -D parametresini bir parola listesi kullanarak brute force yapmak için, -p parametresini de wordlisti belirtmek için kullandım. Sonuç olarak parolayı tespit ettim.

Ssh bağlantılarında kullanıcı parolasıyla bağlantı sağlanabildiği gibi ssh keyleriyle de bazen bağlantı sağlanabilmektedir. Elde ettiğimiz parolayla dosyamıza giriş yaptığımda bir private key elde ettim. Bu key bir ssh bağlantısı kurmamı sağlayabilir. Dosyayı unzip edip görüntüledim ve bağlantı için kullanacağım keyi kopyaladım.

Sisteme -i paramtresiyle kullanacağım ssh keyi belirterek bağlantı sağladım fakat saniyeler içinde bağlantımı kesti.
Bunun için internette çözüm tarattığımda belirli karakterler ekleyerek yazdığım komutu çalıştırabileceğim bir zafiyet buldum. İlk olarak ‘() { :;}; uname -a’ olarak çalıştırdım ve başarılı bir şekilde sistemin sürüm bilgisini öğrendim. Bu şekilde zafiyetin çalışabildiğini görünce zaman kaybetmeden bash shell’i aldım.

Biraz kurcaladıktan sonra etkileşimli bir shell alıp işlemlerime öyle devam ettim. find / -perm -4000 type f 2>/dev/null komut satırıyla, boş döndürmemesini ve root yetkisiyle çalışan programları listelemesini istedim.

Ekranda /nothing_to_see_here/choose_wisely dizinine ait 3 ayrı kapı olduğu görülmekte. Ve her birine ait r00t adlı çalıştırılabilir bir dosya var.
Sırasıyla ilk kapıda (door2) ki dosyayı çalıştırdığımda bağlantımı sonlandırdı ve yeniden bağlantı yapmak zorunda bıraktı.

Ardından door3 kapısında ki dosyayı çalıştırdım ve sistemde çalıştırmak istediğimiz komutları iki dakika süresince çalıştıramaz hale getirdi.

Son kapıda ki (door1) dosyayı çalıştırdığımda ise bir input değeri istendi. Bu input değerini arif olarak girdiğimde çıktı olarak verdi.

Burada input değerinin çok fazla bir değer verilerek girilmesi durumunda sistemde bellek taşmasına neden olabilir mi diye bir deneme yaptım.
./r00t $(python –c ‘print “A” * 650) komutuyla 650 tane karakterini input olarak döndürmesini istediğimde Segmentation fault hatası aldım. Yani tahmin ettiğimiz gibi sistemde bir bellek taşma zafiyeti mevcut.

Peki bu zafiyetten nasıl yararlanabilirim?
Bunun içinde kısa bir araştırma yapıp sonrasında /usr/share/metasploit-framework/exploit/ dizininde ki pattern_create.rb ile 700 karakterlik random bir değer oluşturdum.

Bu değeri gdb aracıyla çalıştırdığımızda tekrardan bir segmentation fault hatası aldık fakat bu araç bize hatanın kodunu verdi.

Aldığımız hata kodunu (0x6a413969) /usr/share/metasploit-framework/exploit/ dizinindeki pattern_offset.rb ile çalıştırdığımızda 268 den fazla değer girildiğinde hata alınacağını farkettim. Ayrıca sisteme ait ESP kaydının 0xbfff9e0 olduğunu öğrendim. Bu kayda ait internette bir shellcode mevcut ve bunu kullanarak sistemde kod çalıştırabiliriz.

Son olarak bu shellcode kullanılarak r00t dosyasını çalıştırıldığında bizi kök dizinine atayacaktır. Ardından root dizini altındaki Proof.txt dosyasını görüntülendiğinde anahtar elde edilecek ve tr0ll 2 makinesi başarıyla çözümlenmiş olacaktır.

NOT1: door klasörleri içindeki r00t dosyalarının yerleri yapılan işlemler esnasında değişebilmektedir. Örneğin iki dakikalık kilitlenmeye neden olan door3 kapısı daha sonra input değeri isteyen kapı olarak karşımıza çıkabilmektedir.
NOT2: robots.txt dosyasında tespit edilen dizinleri tek tek görüntülemek zaman kaybı olabilir. Bunun için dosyayı indirip ayrıyeten bir dirb taraması da gerçekleştirilebilir.

--

--

Arif ARI
Arif ARI

No responses yet