[TR] TryHackMe — DogCat Write-Up

Anıl Çelik
5 min readMay 19, 2020

--

(Nisan 2020)

Herkese merhaba, ben Anıl Çelik. Bugünkü yazımda sizlerle TryHackMe platformunda bir hafta kadar önce yayınlanan dogcat isimli makinenin çözümünü paylaşacağım.

Öncelikle port tarama işlemine geçelim :

  • Tarama sonucundan görüyoruz ki, makine üzerinde sadece SSH ve HTTP servislerinin çalıştığı 22 ve 80 numaralı portlar açık. SSH servisinin versiyonunda bir zafiyet bulunmadığı için, öncelikle 80 numaralı portu ziyaret edelim:
  • 80 numaralı portu ziyaret ettiğimizde, bizi yukarıdaki gibi bir sayfa karşılıyor. Butonlardan önce “A dog” isimli butona tıkladığımızda:
  • Yukarıdaki gibi bir köpek fotoğrafıyla karşılaşıyoruz. Aynı şekilde “A cat” isimli butona tıkladığımızda da:
  • Buradaki gibi bir kedi fotoğrafıyla karşılaşıyoruz. Butonlara tıkladıkça farklı köpek ve kedi fotoğrafları geliyor. Burada ilk yaptığım şey, fotoğrafların ID değerlerini incelemek oldu. Ulaştığım sonuçta köpek ve kedi fotoğrafları için ikisinden de 10’ar tane olduğunu buldum. Fotoğrafların içerisinde gizli bir bilgi olup olmadığına dair fotoğrafları indirip baktım ancak bir şey çıkmadı. Daha sonrasında makinenin LFI zafiyeti ile olduğunu hatırlayınca, site üzerinde LFI zafiyeti aramaya başladım:
  • /?view= parametresi sonrasında normalde dog adında bir dosya geliyor ve köpek fotoğrafı görüntüleniyor. Birkaç denemeden sonra bu dosyanın sonuna .php uzantısı ekledim ve yukarıdaki uyarıyla karşılaştım. Neden yazdığım uzantının sonuna otomatik olarak tekrar ikinci bir .php uzantısı eklendiğini araştırırken, bunu çözmek için LFI PHP Filtering kullanmam gerektiğini buldum (ikinci bir .php uzantısının eklenme sebebi, sayfanın kaynak kodlarında yer alan bir kontrolden kaynaklanıyor, buraya daha sonra geleceğiz):
  • Buradan bize Base64 türünde encode edilmiş bir veri döndü. Decode etmeye çalışalım:
  • Sayfanın içeriğine ulaştık :) gördüğümüz gibi burada sunucu üzerinde gerçekleştirdiğimiz file requestler $_GET[“ext”] parametresiyle gerçekleştiriliyor ve eğer dog veya cat dışında başka bir şey request edilirse ‘Sorry, only dogs or cats are allowed.’ şeklinde bir hata mesajı dönüyor. Bu noktadan sonra gerçekleştirmek istediğim işlem için ext parametresini manipüle etmenin bir yolunu bulup buradan ilerlemem gerektiğini düşündüm ancak öncesinde belki bir SSH bilgisi bulurum diye öncelikle sistem loglarına göz atmak istedim. Bunun için bir araştırma yaparken isteğimi Log Poisoning yöntemi ile gerçekleştirebileceğimi farkettim:
  • İşlemi uyguladığımda, aşağıdaki gibi logları elde edebildim ancak kayda değer bir şey çıkmadı:
  • Bu noktadan sonra, elimde kalan tek şeyle, yani request’i manipüle etmeye yönelik ilerlemem gerekiyor. Request injection ile ilgili araştırma yaparken, PHP’nin resmi sitesinde aşağıdaki bilgileri buldum.
  • Buradan gördüğüm şey, request injection atakları gerçekleştirilirken yapmak istediğimiz değişikliği istek database’e ulaşmadan önce yapmamız gerektiği. Burada ise aklıma gelen tek bir şey var: BurpSuite. Yine biraz araştırma yaptıktan sonra, bu işlemi de istek içerisinde giden User-Agent üzerinden gereçekleştirebileceğime dair exploit-db üzerinde bir veri buldum:
  • Biraz uğraştan sonra, PHP’ye ait file_put_contents ve file_get_contents metodlarından yararlanarak Burp üzerinde araya girerek isteğimi gerçekleştirdim:
  • Sonrasında ise, nihayet shell almayı başardım:
  • İçerde biraz dolaştıktan sonra, aslında bir Docker container’ı içerisinde olduğumu farkettim :)
  • Docker container’ını atlatmaya çalışmadan önce, bulunduğum yerde alabileceğim bir bilgi olmasına karşın tarama işlemlerine devam ettim. Üzerinde bulunduğum www-data kullanıcısının sudo yetkilerini sorgularken, bir sudo yetkisine sahip olduğunu gördüm:
  • Sonrasında ise GTFOBins üzerinden ilgili yetkiye dair SUDO yetkisindeki komutu buldum:
  • Sonrasında ise komutu çalıştırdığımda, root kullanıcısına eriştim ve 3 numaralı flag’i ele geçirdim Ayrıca hostname komutunu çalıştırdığımızda bize dönen cevaptan da bir Docker container’ı içerisinde olduğumuzu anlayabiliriz:
  • Yine Docker’ı atlatmadan önce önceki 2 flag’in de nerede olduğunu aramak için bulunduğum yerde dolaştığımda flag 2’yi de buldum:
  • 1 numaralı flag’i aradım ancak henüz bulamadım. Docker’ı atlatmak için araştırma yaptığımda öncelikle aşağıdaki dosyayı buldum:
  • Buradan anladığım kadarıyla, container üzerinden karşı tarafta bulunan root yetkisindeki kullanıcı bir shell oturumu açıyor ve arşivlenen backup dosyasını kendi tarafına alıyor. Buna göre, eğer gönderilen dosya üzerinde kendi bilgisayarımda oturum elde etmemi sağlayacak bir reverse shell dosyası gönderirsem, karşı taraf üzerinde root yetkilerine sahip bir oturum elde etmiş ve dolayısıyla Docker container’ını atlatmış olurum:
  • Gerekli komutu backup.sh dosyasına yazdıktan sonra, ikinci bir netcat oturumu açıyor ve shell’in düşmesini bekliyorum:
  • Gördüğümüz gibi root yetkilerine ulaştık ve 4 numaralı flag’i ele geçirdik. Ancak hala flag 1 i bulamadık :) Biraz araştırdıktan sonra, 1 numaralı flag’i de ilk başta PHP kodlarını çektiğim yöntemle, yani LFI ile ulaşmam gerektiğini farkettim ve yine dönen Base64 formatındaki veriyi decode ettiğimde, 1 numaralı flag’e de ulaştım:

Bu makine ile ilgili sizlerle paylaşmak istediklerim bu kadardı, yazımı okuduğunuz için teşekkür ederim.

Bir sonraki yazımda görüşmek üzere.

--

--

Anıl Çelik
Anıl Çelik

No responses yet