[TR] TryHackMe — Wonderland Write-Up
Herkese merhaba, ben Anıl Çelik. Sizlerle bu yazımda, geçtiğimiz günlerde TryHackme platformunda yayınlanan Wonderland isimli makinenin çözümünü paylaşacağım:
İlk olarak nmap taraması ile başlayalım:
Yaptığımız ilk taramanın sonucunda iki adet portun açık olduğunu görebiliriz: 22 ve 80. 80 numaralı porta erişim sağlayıp enumeration işlemine başlayalım:
80 numaralı portu ziyaret ettiğimizde, yukarıdaki sayfayla karşılaşmaktayız. Buradan pek bir şey çıkaramamakla birlikte hemen sonrasında sayfanın kaynağını görüntüleyip burada bir şeyler arayabiliriz ancak buradan da bir sonuç çıkmadığını görebiliriz:
Bir sonraki adım olarak bir gobuster taraması gerçekleştirip, çalışan web servisinde bulunan gizli dizinleri bulmaya çalışalım:
Tarama sonucunda “/img” ve “/r” adında iki gizli dizinin çıktığını görebiliriz. Öncelikle “/img” dizinini ziyaret edelim:
Bu dizini ziyaret ettiğimizde, 3 adet resim dosyasının bulunduğunu görebiliriz. Diğer dizini incelemeden önce, bu dosyaları indirip içlerinde gizli bir bilgi bulundurup bulundurmadıklarına dair bir tarama yapabiliriz:
Resim dosyalarının üzerinde tarama yaptığımızda, white_rabbit_1.jpg isimli dosyanın içerisine gizlenmiş hint.txt adında bir text dosyasının olduğunu görmekteyiz. Bu dosyayı extract edip içeriğini görüntülemeye çalışalım:
hint.txt dosyasını görüntülediğimizde, “follow the rabbit” mesajını görmekteyiz :)
Burada hatırlamamız gereken şey, gizli dizin taraması yaparken bulduğumuz bir diğer dizinin adı da “/r” şeklindeydi; buradan yola çıkarak “follow the white rabbit” mesajını da birleştirirsek “/r/a/b/b/i/t” altında başka bir gizli dizin olduğunu düşünebiliriz:
Gördüğümüz gibi düşüncemiz haksız çıkmadı ve başka bir gizli dizin daha bulduk. Bu sayfanın da kaynağını görüntüleyelim:
Bu sefer sayfa kaynağında gizli bir bilgi bulduk. Bulduğumuz bu bilgi alice kullanıcısına ait SSH oturum bilgisi olabilir. Bu bilgilerle SSH oturumu elde etmeye çalışalım:
SSH oturumunu elde etmeyi başardık. Bulunduğumuz kullanıcı üzerinde neler yapabileceğimize dair enumeration işlemine devam edelim. Öncelikle “/home” directorysi altında bulunan kullanıcılara göz atalım:
Gördüğümüz gibi, alice, hatter, rabbit ve tryhackme adında 4 adet kullanıcı var. Şimdi ise alice kullanıcısı ile devam edelim ve dizinde olan dosyalara göz atalım, belki user flag’i elde edebiliriz:
Maalesef user flag burada değil ancak garip bir şekilde root flag alice kullanıcısının home directorysinde bulunuyor fakat dosyayı görüntüleme yetkimiz olmadığı için içeriğine bakamıyoruz. Dizin içerisinde bulunan “walrus_and_the_carpenter.py” isimli dosyaya da göz atalım:
Dosyanın içeriğini görüntülediğimizde, random modülünün import edildiğini, devamında bazı şiir dizelerinin bulunduğunu ve dosyanın en sonunda da bu dosya çalıştırıldığında dosya içerisinde bulunan dizelerden random olarak 10 tanesinin bastırıldığını görebiliriz:
Ancak geriye dönüp dosya izinlerini incelediğimizde, bu dosyayı çalıştırmaya dair izinlerimizin tanımlanmadığını görebiliriz. Öyleyse öncelikle bulunduğumuz kullanıcıya ait sudo yetkilerine göz atıp bu kullanıcı ile neler yapabileceğimize bir bakalım:
Buradan gördüğümüz çıktıdan alice kullanıcısının yukarıda belirtilen sudo komutunu kullanarak rabbit kullanıcısı için python modülünü kullanarak az önce görüntülemiş olduğumuz dosyayı çalıştırabileceğini görmekteyiz. Öyleyse bu komutu çalıştırmayı deneyelim:
Dosyayı çalıştırdık ancak herhangi bir değişiklik olmadı. Buradan sonra yapabileceğimiz şey, aslında bu dosyaya ilk göz attığımızda düşünebilecek olduğumuz şeyi yapmak olacak: Python Library Hijacking. Bu yöntem ile, Python dosyası içerisinde çalıştırılan random modülünü manipüle ettikten sonra sudo yetkisiyle çalıştırabildiğimiz yukarıdaki komutu tekrar çalıştırarak yetkilerimizi rabbit kullanıcısına yükseltmeye çalışacağız. Bunu yapabiliyor olmamızın sebebi, bir Python dosyasını çalıştırdığımızda, yapısı gereği Python dosya içerisinde import edilen modüllerin öncelikle dosyanın çalıştırıldığı directory içerisinde olup olmadığına bakıyor, eğer bulunan dizin içerisinde hedeflenen modül ile aynı isimde başka bir dosya bulunmuyorsa, daha sonra bulunulan dizin içerisinden çıkıp kendi modüllerini kullanıyor. Yani buradan hareketle biz eğer dosyanın çalıştırıldığı dizin içerisinde random adında başka bir dosya oluşturup bunun içerisine shell kodu eklersek, sudo yetkisiyle erişimimizin olduğu kullanıcı üzerinden shell alabiliriz:
Gördüğümüz gibi, library hijacking işlemini başarılı bir şekilde gerçekleştirip rabbit kullanıcısı ile bir shell aldık. Rabbit kullanıcısında daha fazla ilerlemeden önce, user flag’e tekrar göz atalım:
Maalesef user flag burada da değil ancak makinenin bulunduğu sayfadaki user flag için bulunan ipucuna göz attığımızda aşağıdaki gibi bir şey görebiliriz:
İpucu bize bu makine içerisinde her şeyin tam tersi olduğunu söylüyor. Biraz düşündükten sonra user flag’in aslında root directorysi altında bulunduğunu bulabiliriz:
Gördüğümüz gibi user flag’i elde etmeyi başardık. Şimdi rabbit kullanıcısı üzerinde ilerlemeye devam edebiliriz. Öncelikle az önce dosyaları listelediğimizde gördüğümüz SUID bit set edilmiş teaParty dosyasına göz atalım:
Dosya türüne göz attığımızda, dosyanın bir ELF dosyası yani çalıştırılabilir bir dosya olduğunu görebiliriz. Dosyayı çalıştırdığımızda ve programın istediği input kısmına herhangi bir veri verdiğimizde de “Segmentation fault (core dumped)” hatası aldığımızı görmekteyiz. Burada aklıma ilk Buffer Overflow gelse de, dikkatimizi çeken başka bir şey var; o da “Probably by Mon, 08 Jun 2020 18:24:02 +0000” kısmı. Burdan anlayabileceğimiz şey, dosyanın içerisinde güncel tarih verisini kullanan bir değişken olabilir:
Gördüğümüz gibi programın içerisinde date değişkeni kullanılmakta. Burada yapabileceğimiz şey, bu veriyi manipüle ederek dosyayı çalıştırdıktan sonra yetkilerimizi yükselterek bir sonraki kullanıcı ile shell almak olabilir. Bunun için de PATH variable’ı üzerinden Execution Flow Hijacking işlemi uygulayabiliriz. Çünkü; PATH variable’ı UNIX türü işletim sistemlerinde çalıştırılabilir dosyaları tutan directorylerin pathini belirleyen variablelardır ve burada da SUID bit set edilmiş bir dosya (teaParty) olduğu için, bu dosyanın path variable’ını manipüle ederek dosyanın ait olduğu asıl kullanıcı üzerinden shell alabiliriz. Bunu yapabilmek için öncelikle bulunduğumuz dizin üzerinde date adında başka bir dosya daha oluşturmalıyız:
Dosyayı oluşturduktan sonra, hijacking işlemi için PATH variable’ını ayarlayalım ve programı tekrar çalıştıralım:
Gördüğümüz gibi, Execution Flow Hijacking işlemini başarılı bir şekilde gerçekleştirdik ve hatter kullanıcısı üzerinden shell almayı başardık. Şimdi de bu kullanıcının dizininde bulunan dosyalara göz atalım:
Dosyalara göz attığımızda, password.txt adında bir dosya görmekteyiz. İçeriğine göz atalım:
Bir parola elde ettik. Bu parolayı kullanarak hatter kullanıcısının sudo yetkilerini görüntülemeye çalışalım:
Maalesef hatter kullanıcısı için tanımlanmış herhangi bir sudo yetkisi yok. Bu noktada makineye linPEAS yükleyip neler yapabileceğimize daha geniş bir kapsam içerisinde bakabiliriz:
linPEAS çıktısına göz attığımızda, ilgimizi çeken bir şey görmekteyiz:
Capabilities kısmına göz attığımızda, perl binarysinin sahip olduğu capabilitylerden faydalanalarak yetkilerimizi yükseltebileceğimizi görebiliriz. Bunun ne anlama geldiği ise şu şekilde: Linux içerisindeki Capability kavramının temel amacı; kernel seviyesindeki kullanıcı veya programların yetkilerini daha küçük parçalara bölerek bir processin ihtiyacı olan yetkileri ona sağlamaktır.
SUID ve Capability kavramları arasındaki farklar ise şu şekilde: SUID biti set edilmiş bir program başka bir kullanıcı tarafından o dosyanın sahibine ait izinlerle çalıştırılabilir. Capability kavramı ise Linux üzerinde güvenliği arttırmaya yönelik kullanılan, SUID benzeri ancak thread yetkilerini kontrol etmek için bulunan yapıdır.
Capability kavramını daha anlaşılır bir hale getirmek için şu örneği verebiliriz: 80 portunda çalışan bir web servisinde 1024'den daha önce gelen portları dinleyebilmek için root yetkisine ihtiyacımız olduğunda, yetkisi daha düşük kullanıcılara direk root yetkisi vermektense gerekli binary için capability set edip gerekli işlemin gerçekleştirilebilmesini sağlayabiliriz.
Capabilitylerin çalışma mantıkları ise, root yetkisi ile gerçekleştirilebilecek işlemleri daha küçük parçalara bölerek yetkisi daha düşük kullanıcılara ihtiyacı olan yetkileri tanımlamak üzerinedir, bunun bir benzerini de az önce vermiş olduğumuz örnekte görebiliriz.
Şimdi ise makineye geri dönelim ve bu capabilityden faydalanarak yetkilerimizi yükseltmeye çalışalım. Öncelikle Perl’e ait capabilityler için GTFOBins üzerinde bir arama yapabiliriz:
Buradan görebileceğimiz gibi, eğer yukarıdaki komutu çalıştırırsak yetkilerimizi root seviyesine yükseltebiliriz çünkü capabilityler az önce bahsettiğimiz gibi root seviyesindeki işlemleri küçük parçalara bölmekte; biz bu küçük parçaları manipüle edebilirsek direkt olarak root seviyesine yükselebiliriz:
Gördüğümüz gibi, başarılı bir şekilde root kullanıcısını elde ettik. Root flag’i görüntüleyelim (alice’in home dizini altındaydı):
Gördüğümüz gibi root flag’i de elde etmeyi başardık.
Bu yazı ile ilgili bahsetmek istediklerim bu kadardı, umarım size bir faydası olmuştur.
Yazımı okuduğunuz için teşekkür ederim, bir sonraki yazımda görüşmek üzere.
Kaynaklar: