Merhaba değerli THT Ailesi
Bugün sizlere Zararlı Yazılım Tespitinde kullanılan {YARA} adlı aracı ayrıca {YARA} dışında zararlı yazılım inceleme programlarında kullanılan arama-eşleştirme mantığının temelini tanıtıp örnekler ve uygulamalar ile anlatacağım.
Konu İçeriği;
:Smiley1007: Malware Nedir?
:Smiley1007: Kısaca Malware Çeşitleri Nelerdir?
:Smiley1007: {YARA} Nedir?
:Smiley1007: Nasıl Çalışır? {YARA}
:Smiley1007: Kullanıcıya Faydası Nedir? {YARA}
:Smiley1007: Neden {YARA} Kullanalım?
:Smiley1007: Nasıl Kurulur?
:Smiley1007: Temel {YARA} Kuralının Mantığı Nedir?
:Smiley1007: {YARA} Örnekleri Ve Kullanımı
Malware Nedir?
Software ve malicious kelimelerinin kısaltılıp birleştirilmiş halidir. Bilgisayarımıza zarar vermek isteyen, sistem ayarlarına erişim sağlamaya çalışan ve kritik bilgileri ele geçirmeye çalışan kötücül yazılımlara verilen isimdir.
Kısaca Malware Çeşitleri Nelerdir?
Adware: En yaygın olan malware türüdür.Bu malware türü sisteme teknik açıdan zarar vermemekle birlikte olur olmadık reklamları karşımıza çıkarabilir.
Spyware: Çalışma mantığı olarak teknik açıdan zarar vermeyebilir fakat gün içindeki surf aktivitelerini izleyerek bir rapor oluşturur ve bunu Adware yazılımlarına iletir.
Truva Atı (Trojan): Zararlı program barındıran yazılımlardır.İşlevselliği olan programların içine enjekte edilip arkaplanda gizlice çalışan tehlikeli bir malware çeşididir.
RootKit: Yönetici haklarını ele geçirir.
{YARA} Nedir?
Malware araştırmacılarının, malware yazılım ve örneklerini tespit etmesi, tanımlaması ve sınıflandırmasını kolaylaştırmak için VirusTotal tarafından geliştirilmiş olan açık kaynak kodlu bir araçtır.Fakat tüm özellikleri bunlarla sınırlı değildir.
Not: YARA, antivirüs yazılımı değildir.
Nasıl Çalışır?
İki kural mantığında çalışmaktadır.Bunlardan basit olanına değinmek gerekirse, bir dosya içerisinde belirli bir text string aramak diyebiliriz.İkincil tanımıyla, çalışmakta olan bir işlemin (process) sanal bellek adresindeki verilerini aramak diyebiliriz.
Metinsel (textual) yada ikili örüntülere (binary pattern) bağlı olarak malware çeşitlerinin kurallarını oluşturabiliriz.
Kullanıcılara Faydası Nedir?
Zararlı Yazılım Analizini kolaylaştırıp ve tespit etmemizi sağlıyor.Ayrıca tespit ettiğimiz malware yazılımlarını kategorilendirip bizlere sunuyor.
Kimler Kullanıyor?
ESET, Kaspersky Lab, McAfee, TrendMicro gibi büyük şirketler başta olmak üzere 60dan fazla güvenlik şirketi bu aracı kullanmaktadır.
Neden {YARA} Kullanalım?
İncelediğimiz zararlı yazılıma ait elimizde hash var,neden YARA Kuralı kullanıyoruz diye düşünebilirsiniz. Açıklamak gerekirse, İmza Tabanlı Koruma kullanımını bypass edecek yeni metodlar geliştirildiği için, sadece imza tabanlı korumayı (Signature-Based Protection) kullanmak tek başına bir işe yaramayabiliyor.
Nasıl Kurulur?
Windows İçin: https://github.com/virustotal/yara/releases/tag/v4.0.2
Linux İçin: https://github.com/VirusTotal/yara.git
Mac OS X İçin: "brew install yara komutu ile kurulum sağlanabilir.
Github YARA: https://github.com/VirusTotal/yara
Temel YARA Kuralının Mantığı Nedir?
Temel bir YARA Kuralı, rule, m-e-t-a, strings ve condition alanlarından oluşmaktadır.Örnekler üzerinden giderek bu alanları daha iyi anlatmaya çalışacağım.
Ana Örnek;
{YARA}:Strings: Nedir?
Bir dosya ile eşleşmemiz gereken karakter dizileri (strings), imza ve desenleri içerir. YARAda 3 çeşit karakter dizisi (Strings) vardır.Bunlar Text Strings, Regex ve Hexadecimal Strings olarak ayrılmaktadır.
Text Strings: Case Nedir?
Text Strings: Düz yazı şeklinde olan karakter dizisidir. ASCII metni biçimindedir.Aratmak istediğimiz anahtar kelime büyük-küçük harfe duyarlı olacaktır.Bunu değiştirmek içinde nocase parametresini eklememiz lazım.Örnek vermek gerekirse;
Büyük-Küçük Harfle Duyarlı Karakter Dizeleri;
Kod:
>[COLOR="Lime"]Örnek = $ text_case_example = deneme [/COLOR]
Aratılacak deneme kelimesi yazıldığı şekilde aratılır.Büyük-küçük harfe duyarlı olur.
Büyük-Küçük Harfe Duyarsız Karakter Dizeleri;
Kod:
[COLOR="lime"]>Örnek= $ text_nocasa_example = deneme nocase[/COLOR]
Genelde nocase parametresi eklenir.
Text Strings: Wide Nedir?
Kuralın başında iki bayd ile kodlanmış dizeleri aramak için kullanılabilir.Çoğunlukla birçok çalıştırılabilir binary dosyada kullanılmaktadır.
Bu şekilde arattığımızda wide parametresi ile, mekor kelimesini iki bayt ile kodlanmış ve nocase parametresi ile de büyük-küçük harfe duyarsız olarak arama sağlayabiliriz.
Text Strings: Fullword Nedir?
Karakter dizinimizi fullword olarak tanımladığımız zaman doğrudan yazdığımız metni, turkhackteam ibaresini aratıp yakalar.Yani direkt olarak yazdığımız şekilde aramak denilebilir.
Örnek vermek gerekirse;
Yakalar:
www.turkhackteam.com
www.turkhackteam.blogspot.com
Yakalayamaz:
www.turkhackteamm.com
TurkHackTeam.org/net
Text Strings: Koşullu Stringler Nelerdir?
Stringlere koşul koyabilir ve bu şekilde aratabiliriz.Koşulumuz hexadecimal biçimde olacaktır.Hexadecimal Stringin ne olduğunu aşağıdaki örnekten sonra anlatacağım.
Böyle bir koşul tanımlayıp aratırsak;
> AA 30 DB BC AA
> AA 30 C2 AA
Bu değerleri yakalar.
AA ve 30 değeri başlangıç, sondaki AA değeri bitiş, verdiğimiz DB BC ve C2 hex değeri ise başlangıç ve bitiş arasındaki aratmada gelirse bunu heximal değer olarak yakalayacaktır.
Hexadecimal Strings Nedir?
Çıktı dosyamızda hex karakterlerle eşleşen değerlere Hexadecimal Strings adı verilir.Hex Strings kullanmanın bize bazı faydaları vardır.
>Arattığımız baytlar arasından bazılarının bilinmediğini ve herhangi bir sonuçla eşleşmeyeceğini belirten Wildcard karakterleri bulmamızı sağlar.Bu karakterler ? ile gösterilir.Örnek vermek gerekirse;
Kod:
[COLOR="Lime"]$ hex_example = {B2 B3? ? B5} [/COLOR]
Burada B3 değerinden sonraki baytları bilmiyorsak [COLOR="Cyan"]?[/COLOR] ekleyerek geçebiliriz.
Jumps
Kalıptaki değerlerin başını biliyorsak fakat belirli aralıklardaki uzunluklarından emin değilsek atlayabiliriz.Örnek vermek gerekirse;
Kod:
[COLOR="Lime"]$ jump_example = {H1 H2 [6-8] 24} [/COLOR]
Burada 6 bayttan, 8 bayta kadar olan herhangi bir kayıt dizinini aratmak istediğimizi gösterir.
Hexadecimal Strings Örnek
şeklinde arattığımızda aşağıdaki iki kuralda eşleşecektir.Yani soru işaretleri koyduğumuz kısma 01 ve AA arasındaki bir sayısal-alfabetik değeri eşleştirecektir.
BB 41 01 D6 AA FB
BB 41 AA D6 AA FB
Conditions
Bir YARA Kuralının Mantığı Nedir? başlığında verdiğimiz örnekte bulunan durum alanıdır.Koşullar olarak
adlandırabiliriz.Koşul kümeleri, bool ifadelerini değerlendirir.Aşağıdaki ana örneğimizde $a veya $b parametresinin true veya false olmasını belirleyen kısımdır.
Conditions Seçenekleri:String Sayısı
Herhangi bir Hexadecimal Strinin kaç defa geçebileceğini veya şu kadar sayıdan fazla veya azdır şeklinde tanımlamalar yapabiliriz.
Örnek vermek gerekirse Strings sayısı;
Kod:
[COLOR="Lime"]$test_string1 = a
$test_string2 = b
$test_string1 = 2 and $test_string2 <10 [/COLOR]
Şeklinde aratırsak aşağıdaki gibi bir eşleşme yakalayacaktır.Yani a değerimiz 2ye eşit ve b değerimiz 10dan küçük şeklinde
Yakalar:
aabbbbb , aabbb, aabbbbbb
Yakalayamaz:
aaabbbbbbbb, bbbbbbbbbbbbbbbbbbbbbbbbaa
Conditions Seçenekleri:Offset
String Offset: Bir condition içerisinde kullanıldığında bağlı bulunduğu stringin dosya içerisinde belirli bir ofsette olup olmadığını öğrenmek istediğimiz zaman kullanabiliriz.Örnek vermek gerekirse;
Kod:
[COLOR="Lime"]$a at 200 and $b at 400 [/COLOR]
A değerini 200. ofsette ve b değerini 400. ofsette bulunmasını bekliyorsak ve arıyorsak bu şekilde yazabiliriz.
Burada a değişkenini Turk ve b değişkenini hackteam olarak belirledik.Koşullar kısmınada, 0x64 ofsetinde a değişkenini, 0xC8 offsetinde ise b değişkenini aradığımızı doğrudan bir kural ile belirtebiliriz.
Deneme: Buraya kadar bahsettiğimiz kurallardan bir örnek kural oluşturup YARA üzerinden eşleştirme sağlamaya çalışalım;
Not Defterini açıp ana örneğimizi buraya yazalım. Notepad++ kullanmanızı öneririm.
Kural adını deneme olarak ayarladık.M-e-t-a kısmına author ve descriptionu yazdık.M-e-t-a kısmını yazmak zorunda değilsiniz.
Ardından strings kısmına $a ve $b olmak üzere iki adet değişken ekledim. $a değişkeni Turkhackteam kelimesini aramasını ve $b değişkeninin mekor ismini aramasını istiyorum.
Condition kısmına ise $a or $b yazdım.Yukarıda bahsettiğimiz üzere bu parametre, incelediğimiz bir dosyanın içerisinde $a ve $b değişkeninden birisi geçiyorsa bu kuralın eşleştirme sağlamasını istedim.
Bu dosyayı .txt olarak İndirilenler kısmına kaydediyorum siz istediğiniz yere kaydedebilirsiniz fakat Windows için indirmiş olduğunuz yara64.exe dosyası ile aynı dizinde olsun.
Gördüğünüz gibi yara64.exe ve kaydetmiş olduğum deneme kuralı aynı klasörde yer alıyor.
Şimdi Başlat > Çalıştır > cmd yazalım ve İndirilenler klasörüne inelim.
Klasöre girdikten sonra yara64.exe --help ile komutlarımıza bakalım.
Başta oluşturmuş olduğumuz deneme kuralımıza, bulmasını istediklerimizi yukarıda yazmıştık.Şimdi ise yeni bir dosya oluşturalım ve içine rastgele kelimeler yazalım.
Şimdi komut penceresini açalım ve başta oluşturduğumuz kural dosyasını yazıp eşleştirelim.
Resimde görüldüğü üzere yara64 deneme.txt . komutunu girdikten sonra aynı dizinde bulunan ornek.txt dosyasını başarıyla eşleştirdi.Burada dosyayı aratmak yerine oluşturduğumuz kuralın adını yazıp kuralın yanına koyduğumuz incelenecek dosyayı bulmasını sağlıyoruz.
Şimdi ise eşleştirilen dosya üzerinde -s parametresi ekleyerek sonuca bakalım.
Gördüğünüz gibi işaretli yerde ki ornek.txt dosyamızda 0x42 offsetinde $a değişkeninde yakaladığı MekoR ismini bize sundu.İşaretli kısmın üzerindeki kural dosyamızda ise aranacak isimleri görebiliriz.
Ornek.txt dosyasına sadece MekoR ismini yazdık bu yüzden Turkhackteam kelimesini karşımıza çıkarmadı.
Ornek.txt dosyamıza Turkhackteam kelimesini ekleyelim ve tekrar eşleştirme yapalım.
Yukarıdaki örnekte $a değişkeninde MekoR ismini bulmuştu.Şimdi ise 0x42 Ofsetinde Turkhackteam kelimesini yakaladı.
Ana kuralımıza dönecek olursak $a or $b değişkeni eklemiştik.Yani MekoR veya Turkhackteam isimlerinden herhangi biri var ise eşleştirmesini istemiştik.Şimdi $a and $b değişkeni ile MekoR ve Turkhackteam isimlerinden ikisi birden varsa eşleştirmesini isteyelim.
'Yara64 deneme.txt . -s' parametresini yazıp sonuca bakalım.
Evet görüldüğü üzere eşleştirme sağlanmadı çünkü ben $a and $b parametresini ekledikten sonra ornek.txt dosyasından Turkhackteam kelimesini silmiştim.Şimdi ise turkhackteam kelimesini tekrardan ekleyip deneyelim.
Gördüğünüz gibi eşleştirdi.
Konunun başında bahsetmiş olduğum kuralları komut istemi üzerinde test ederek sonlandırdık.Siz kendi kurallarınızı oluşturup pratik yapabilirsiniz.
Şimdi PE Studio indirmemiz gerekiyor.Bu program dosya yapısındaki stringsleri baz alarak yazacağımız kuralı eşleştirmek ve doğrulatmak için gereklidir.
-PE Studio İndirme Bağlantısı-
Buraya kadar temel mantık ve örneklerle .txt üzerinden bir anlatım gerçekleştirdik.Şimdi ise örnek olarak bir şifre çalıcı malware indiriyorum.
İndirmiş olduğum Password Stealer Malwareı PE Studio içine sürükle-bırak şeklinde atıyorum.
Sol taraftan strings sekmesine basıyoruz.Sağ tarafta 3 adet URL yakaladı.Biz bu URLleri ne yapacağız?
Oluşturduğumuz YARA Kuralının strings kısmına ekleyeceğiz.
Hemen örnek bir .yara dosyası oluşturalım.Önceki örneklerimizde bu dosyayı oluşturmamıştık çünkü deneme yaptığımız için bir karışıklık olmaması adına eşleştirme sonuçlarında hem kural dosyamız olan deneme.txt hemde incelediğimiz ornek.txtnin CMD çıktılarını görmenizi istedim.Şimdi Notepad++ ile kuralımızı yazalım.
Önceki oluşturduğumuz kuralda 2 tane değişken eklemiştik.Bu kuralda 3 adet değişken ekliyorum ve 3. Değişkenin adını $c yapıyorum. Çünkü PE Studionun strings kısmında bize 3 adet bağlantı URL verdi bu yüzden bu şekilde kural dosyamı düzenleyip kural.yara şeklinde kaydediyorum.
Kuralımızı kaydettikten sonra Komu İstemini (CMD) açalım ve YARAyı attığımız dizine gelelim.Ben İndirenler kısmına attığım için cd Downloads komutu ile bu klasöre geliyorum.
Önceki komutlarımızda yara64.exe -s parametresini kullanmıştık.Şimdi ise yara64.exe -s -r parametresini kullanacağız.
-r parametresi recursive yani, istenilen koşullar sağlandığı takdirde bir fonksiyonun kendini tekrarlaması komutudur.
yara64.exe -s -r kural.yara yazdıktan sonra malware örneğimizi sürükleyerek komut isteminin üzerine bırakıyoruz kendisi dosya yolunu oraya yazacaktır.
Ardından ENTERa basıp eşleşme var mı kontrol edelim.
Kural.yara dosyasında girdiğimiz URLler ile malware örneğimizi eşleştirdi.Şimdi ise Hex Editor ile dosyayı inceleyelim ve MZ yapısını kontrol edelim.
-Hex Editor İndirme Bağlantısı-
MZ: Hex Editor ile açılan herhangi bir PE (Portable Executable) dosyasının en üstünde bulunan iki baytlık yapıya denir.
Bu yapı .exe uzantılı çalıştırıabilir dosyalarda bulunur.Fakat bizdeki dosya bir PE yani .exe dosyası gibi gözükmüyor.Bunu anlamamız için Hex Editor ile açıp en üstteki girdiye bakmak ve bu girdiyi oluşturduğumuz kural ile YARA aracılığıyla eşleştirmektir.
Kırmızı ile işaretlediğim yerde 4D 5A Ofsetinde MZ yapısını görmekteyiz.Kural.yara dosyamızı düzenleyip bu Offseti eşleştirelim.
Kuralımızı düzenledikten sonra Komut İstemine (CMD) gelelim ve tekrar eşleşmesini sağlayalım.
0x0 ofsetinde MZ olduğunu doğruladık.
Not: Çalıştırılabilir dosyalarda MZ yapısı her zaman ilk ofsetde bulunur.
YARAda birçok örnek kural oluşturulabilir bu sizin hayalgücünüze kalmış.Ben temel olanlardan bahsettim fakat YARA ile ilgili oluşturulmuş birçok hazır kurala aşağıda vereceğim bağlantıdan ulaşıp kendinize göre düzenlebilirsiniz.
-YARA Kural Paylaşımları Bağlantı Linki -
Bu yazıda bir Şifre Çalıcı malware inceledik.Siz de böyle örnek virüsler indirmek isterseniz (WannaCry, Fidye Virüsü v.b) yine aşağıda vereceğim linkten bu örnek malwareları indirip derlediğiniz kurallar neticesinde eşleştirme yapıp yapmadığını test ederek pratik yapabilirsiniz.
-Örnek Malwarelar Bağlantı Linki-
Herkese İyi Forumlar