İmza Tabanlı Basit Zararlı Tanıma

Antivirus , IPS/IDS vb. yazılımların temelde imza tabanlı (signature-based) çalıştığı bilinir. Bu yazıda basit bir düzeyde signature(imza) tabanlı tanıma yöntemini ele alalım. Akıllı imza vb. yöntemleri ise ele alınmayacaktır.

Sırasıyla ASPACK  ile packlenmiş bir programın imzasını çıkartıcağız ve o imzayı kullanarak aspack ile packlenip packlenmediğini belirleyen bir perl kodu daha sonra da Foxit Reader programındaki bir hafıza taşması açığına imza oluşturup, exploitini tanıyan bir program yazacağız. Foxit Reader için yazacağımız signature , vulnerability-based olacak.

Konu hakkında detaylı bilgi için PE Format , Packing , Unpacking gibi konulara göz atabilirsiniz.

Packerlar bildiğiniz gibi programların boyutunu azaltmak , analizini zorlaştırmak veya güvenlik yazılımları tarafından tespit edilmesini zorlaştırmak amacıyla kullanılabilir.

Kobay olarak çok kullanılan ASPACK packer programını seçelim ve bir programı packleyelim.

Hedef programı packlemeden önceki entry point’e baktığımızda , function prologue şu şekilde;

Packlendikten sonra baktığımızda ise değiştiğini görebiliriz. Function Prologue “PUSHAD” instruction ile başlamakta. PUSHAD vb. instructionları kullanmasının sebebi için google’da unpacking/packing konularını arattırıldığında türkçe/ingilizce tonlarca yazı bulunabilir.  ASPACK ile packlenmiş programların Entry Point’i istisnasız PUSHAD instructionını işaret etmekte.

O halde biz ASPACK imzası olarak bu OPCODEları kullanılabilir;

“60 E8 03 00 00 00 E9 EB 04 5D 45”

Yani yazacağımız ASPACK tespit programı belirteceğimiz binary’inin içerisinde yukarıda bulduğumuz hex kodları aratacak. Kolaylığı, esnekliği ve regexdeki başarısı için Perl bu işlerde biçilmiş kaftan.

#Aspack Detection via Perl

#celil ünüver

open(FILE, “<hav.exe”);

binmode(FILE);

my ($buf, $data, $n);

while (($n = read FILE, $data, 200) != 0) {

$buf .= $data;

}

if ($buf =~ /x60xE8x03x00x00x00xE9xEBx04x5Dx45/)

{

print “Aspack Detected!n”;

}

C:Perl64bin>perl aspack.pl

Aspack Detected!

C:Perl64bin>

Gördüğünüz gibi yukarıdaki üç-beş satır kod belirtilen dosyayı binary modunda açıp içerisinde bizim bulduğumuz aspack imzasını aratıyor ve eğer bulursa Aspack Detected uyarısı veriyor.

Şimdi işi biraz daha ilerletip Vulnerability-Based Signature oluşturma kısmına gelelim. Bu konu SNORT kuralları oluşturmanızda da işinize yarayabilir.

Örnek olarak Foxit Reader’daki bir hafıza taşması açığını ele alalım. Zaafiyet PDF formatındaki /Title tag’ine kapasitesinden fazla data girilmesiyle tetikleniyor. Yani  /Title (x2fx54x69x74x6cx65) tag’i ile bu tag’i kapatmak için gerekli olan header’ın başlangıcı (x29x3ex3ex0d) arasındaki datanın uzunluğunu kontrol ederek elimizdeki PDF’in bu açığı sömüren bir exploit olup olmadığını anlayabiliriz. Tabi bir pdf’in içinde birden fazla /Title tag’i olduğuna dikkat etmek gerekli. Bunun için aşağıda da görülen gibi PDF’i split fonksiyonundan yararlanarak parçalara ayırarak analiz ettim.

#celil ünüver

#securityarchitect.org

#foxylady.pl

$filename = $ARGV[0];

open(FILE, $filename);

binmode(FILE);

my ($buf, $data, $n);

while (($n = read FILE, $data, 200) != 0) {

$buf .= $data;

}

@s=split(/x29x3ex3ex0d/, $buf); ####Signature-1

$size=scalar(@s);

for($i=0;$i<=$size;$i++){

@end = split(/x2fx54x69x74x6cx65/, $s[$i]); ####Signature-2

$size2 = scalar(@end);

for($d=1;$d<=$size2;$d++){

if(length($end[$d])>300){

print “ALERT!!! Foxit Title Tag Buffer Overflow Exploit!”;

}

}

}

Programımızı iki adet bu açığı sömüren exploit ile test ettiğimizde başarılı sonuç alıyoruz;

C:Perl64bin>perl foxylady.pl Foxit-exploit.pdf

ALERT!!! Foxit Title Tag Buffer Overflow Exploit!

C:Perl64bin>perl foxylady.pl foxit_title.pdf

ALERT!!! Foxit Title Tag Buffer Overflow Exploit!

C:Perl64bin>

Test edilen exploitler ;

http://www.exploit-db.com/exploits/15532/

http://www.exploit-db.com/exploits/15542/

Yazan: Celil ÜNÜVER

cunuver@bga.com.tr