Yusuf Can Çakır tarafından yazılmıştır.
Merhabalar herkese, bugün sizlere YARA’nın ne olduğundan ve YARA kuralları ile zararlı yazılımın nasıl tespit edildiğini, kuralının nasıl yazıldığından bahsedeceğim. Şimdiden keyifli okumalar.
YARA, VirusTotal tarafından üretilmiş zararlı yazılımların kodları üzerinde çalışan kişilerin, zararlının kodlarını sınıflandırma ve tanımlamalarına olanak sağlayan, zararlı yazılım analizi ve tespiti yapan bir araçtır. Uzman kişilerin, zararlı yazılımın kodlarını hızlıca analiz edip, derinlemesine analize geçişlerini hızlandırmaktadır. Ayrıca adli bilişim olaylarında bellek analizinde (volatility ile) YARA kurallarının kullanılmasına olanak tanımaktadır. Unutulmaması gereken önemli bir şey de YARA bir anti-virüs yazılımı değildir.
Üstte de belirttiğim gibi zararlı yazılımların sınıflandırılması ve tespitinde rol oynayan YARA kuralları, yapılan işi hızlandırmaktadır. Bu kurallarda zararlı yazılımın ailesini, bu zararlı yazılımı yazan grubun kimliği gibi verileri öğrenebiliriz.
YARA’yı https://plusvic.github.io/yara sitesinden Linux, Windows ve MacOS için sürümlerini indirebilirsiniz. İndirme işlemini yaptıktan sonra aşağıdaki adımları izleyerek kurulumu yapabilirsiniz.
tar -zxf yara-4.0.5.tar.gz
cd yara-4.0.5
./build.sh
sudo make install
Kurulumu tamamladık. YARA’yı çalıştırmak için komut satırına yara yazdığımızda hangi komutları çalıştırabileceğimizi gösteriyor. yara –help komutunu çalıştırdığımızda ise aşağıdaki çıktıyı vermektedir.
┌─[can@parrot]─[~/Desktop/yara-4.0.5]
└──╼ $yara --help
YARA 4.0.5, the pattern matching swiss army knife.
Usage: yara [OPTION]... [NAMESPACE:]RULES_FILE... FILE | DIR | PID
Mandatory arguments to long options are mandatory for short options too.
--atom-quality-table=FILE path to a file with the atom quality table
-C, --compiled-rules load compiled rules
-c, --count print only number of matches
-d, --define=VAR=VALUE define external variable
--fail-on-warnings fail on warnings
-f, --fast-scan fast matching mode
-h, --help show this help and exit
-i, --identifier=IDENTIFIER print only rules named IDENTIFIER
-l, --max-rules=NUMBER abort scanning after matching a NUMBER of rules
--max-strings-per-rule=NUMBER set maximum number of strings per rule (default=10000)
-x, --module-data=MODULE=FILE pass FILE's content as extra data to MODULE
-n, --negate print only not satisfied rules (negate)
-w, --no-warnings disable warnings
-m, --print-meta print metadata
-D, --print-module-data print module data
-e, --print-namespace print rules' namespace
-S, --print-stats print rules' statistics
-s, --print-strings print matching strings
-L, --print-string-length print length of matched strings
-g, --print-tags print tags
-r, --recursive recursively search directories (follows symlinks)
--scan-list scan files listed in FILE, one per line
-k, --stack-size=SLOTS set maximum stack size (default=16384)
-t, --tag=TAG print only rules tagged as TAG
-p, --threads=NUMBER use the specified NUMBER of threads to scan a directory
-a, --timeout=SECONDS abort scanning after the given number of SECONDS
-v, --version show version information
Send bug reports and suggestions to: [email protected].
Yukarıdaki çıktıya bakarsanız eğer yara‘nın kurallardan oluştuğuna görebilirsiniz. YARA da oluşturulan kurallar diğer uygulamalarda (volatility de bellek analizi veya https://www.hybrid-analysis.com/ daki YARA Search kısmı gibi.) kullanılabilmektedir. Kısa bir örnek yapıp bunun üzerinde anlatmak istiyorum.
rule Kural_adi
{
meta:
author="Yusuf Can Çakır"
description= "[email protected]"
strings:
$x = "zararlı yazılım"
$y = "yara kuralı"
condition:
$x or $y
}
YARA kuralları rule anahtar sözcüğü ile başlar ve bir isim verilir. meta alanındaki kısımlar ise yara kuralının temel bilgileridir, kim yaptı, açıklaması gibi.
Strings bilgiler zararlı yazılım ile eşleşmesi gereken bölümdür. Burada üç farklı string yapısı vardır:
Hexadecimal string verileri, dosyanın hex karakterleri ile eşlenecektir. Burada kullanılan önemli bir parametre olan Wildcard karakter den bahsetmek istemekteyim.
Wildcard karakter “??” şeklinde tanımlanmaktadır ve siz kuralınızda bunu kullanırsanız, dosyada ne olursa olsun eşleşecektir. Altta örnekli gösterim de daha rahat anlayabilirsiniz.
rule Kural_adı
{
meta:
author="Yusuf Can Çakır"
description= "[email protected]"
strings:
$hex_strings = { B9 02 07 00 00 BE ?? ?? ?? ?? 8B F8 6A 00 F3 A5 }
condition:
$hex_strings
}
Buradaki önemli olan şey şudur: örnek olarak:
B9 02 07 00 00 BE AA AA AA AA 8B F8 6A 00 F3 A5 da olsa eşleşecektir.
B9 02 07 00 00 BE BB BB BB BB 8B F8 6A 00 F3 A5 olsa da eşleşecektir.
Text Strins kısmı ASCII veri şeklinde olmaktadır.
Büyük küçük harf duyarlı olmaması için nocase kullanmalıyız. Örnek olarak:
Büyük küçük harfe duyarlı değişkenler
$text_case = "Deneme1"
Büyük küçük harfe duyarsız değişkenler
$text_nocase = "deneme1" nocase
Buradaki önemli husus, verdiğimiz text verisinin tamamen aynısı olan bir veri ile eşleşmesi gerekiyor.
rule PwnLabMe
{
strings:
$text_fullword = "pwnlab.me"
condition:
$text_fullword
}
Eşleşmede yakalayabilecekleri:
Eşleşmede yakalayamayacakları:
String değerleri gibi tanımlanmaktadır fakat çift tırnak işaretleri yerine eğik çizgiler ile işlem yapılmaktadır.
rule PwnLabMe
{
strings:
$regular = /md5: [0-9a-fA-F]{32}/
condition:
$regular
}
Regular Expressions’larda da strings’lerdeki gibi wide, fullword ve nocase gibi ifadeler kullanılmaktadır.
Strings’ler daha geniş fakat burada sonlandırıyorum.
Koşullar bütün programlama dillerindeki if koşulu gibidir ve boole‘dan farklı bir şey değildir. Tipik koşul ifadeleri and, or ve not; bağıntısal ifadeler ise <=, >=, <, > ve != şeklindedir.
rule PwnLabMe
{
strings:
$k = "text1"
$l = "text2"
$m = "text3"
$n = "text4"
condition:
($k or $l) and ($m or $n)
}
rule PwnLabMe
{
strings:
$a = "pwnlab"
$b = "yusuf can"
condition:
$a == 6 and $b > 10
}
Örnek üzerinden anlatmak daha kolay olacağı için ilk olarak örnek verdim. Burada $a değişkeninde 6 tane olursa ve $b değişkenide 10 kereden fazla olursa eşleşme olacaktır.
Koşullarda kullandığımız strings ile hedefteki process memory’nin herhangi bir noktasında olup olmadığını öğrenmek için kullanılmaktadır.
$k at 100 and $l at 150
Örnekteki gibi $k için çalışan process’deki virtual address kısmının 100 olup olmadığına bakar. Aynı şeyler $l içinde geçerlidir.
YARA kuralları için anlatacaklarım bu kadardı, şimdi de YARA kurallarını oluşturmamızda bizlere yardımcı olan araçlardan bahsedeceğim.
Alien Vault tarafından geliştirilen bir araçtır. GitHub adresine gitmek için: https://github.com/AlienVault-OTX/yabin
Xen0ph0n/ tarafından geliştirilen bir araçtır. GitHub adresine gitmek için: https://github.com/Xen0ph0n/YaraGenerator
Bunları da verdikten sonra ufak bir demo yapalım birlikte.
Öncelikle zararlı yazılım ve ona uygun bir yara kural dosyası bulmamız(veya kendimiz yazmamız) gerekiyor. Zararlı yazılım örneklerini https://thezoo.morirt.com/ buradan indirebilirsiniz.Kurulumu oldukça kolaydır fakat kısaca anlatmak isterim.
şeklinde yapmalısınız. Ardından bir malware seçmemiz gerekiyor ki ben ZeroLocker isimli malware’i seçtim. Uygun YARA kural dosyasını https://github.com/reversinglabs/reversinglabs-yara-rules buradan indirebilirsiniz. Şimdi YARA’yı zaten indirmiştik başta, şimdi kullanımına geçelim.
Yara_kullanımı
yara -mrs yara_kural_dosyası.yar zararlı_yazılım
şeklinde yazıyoruz. Buradaki parametrelerin anlamını anlatayım.
-m -print-meta = meta data'yı yazdırır.
-r -recursive = Alt dizinlerine kadar tarar
-s -print-string = eşleşen string değerlerini yazdırır.
Anlatacaklarım bu kadardı, umarım beğenmişsinizdir. Başka bir yazıda görüşmek üzere^^.
[TR] YARA Nedir? YARA ile Malware Tespiti
Merhabalar herkese, bugün sizlere YARA’nın ne olduğundan ve YARA kuralları ile zararlı yazılımın nasıl tespit edildiğini, kuralının nasıl yazıldığından bahsedeceğim. Şimdiden keyifli okumalar.
YARA Nedir?
YARA, VirusTotal tarafından üretilmiş zararlı yazılımların kodları üzerinde çalışan kişilerin, zararlının kodlarını sınıflandırma ve tanımlamalarına olanak sağlayan, zararlı yazılım analizi ve tespiti yapan bir araçtır. Uzman kişilerin, zararlı yazılımın kodlarını hızlıca analiz edip, derinlemesine analize geçişlerini hızlandırmaktadır. Ayrıca adli bilişim olaylarında bellek analizinde (volatility ile) YARA kurallarının kullanılmasına olanak tanımaktadır. Unutulmaması gereken önemli bir şey de YARA bir anti-virüs yazılımı değildir.
Neden YARA Kuralları?
Üstte de belirttiğim gibi zararlı yazılımların sınıflandırılması ve tespitinde rol oynayan YARA kuralları, yapılan işi hızlandırmaktadır. Bu kurallarda zararlı yazılımın ailesini, bu zararlı yazılımı yazan grubun kimliği gibi verileri öğrenebiliriz.
YARA Kurulumu
YARA’yı https://plusvic.github.io/yara sitesinden Linux, Windows ve MacOS için sürümlerini indirebilirsiniz. İndirme işlemini yaptıktan sonra aşağıdaki adımları izleyerek kurulumu yapabilirsiniz.
tar -zxf yara-4.0.5.tar.gz
cd yara-4.0.5
./build.sh
sudo make install
Kurulumu tamamladık. YARA’yı çalıştırmak için komut satırına yara yazdığımızda hangi komutları çalıştırabileceğimizi gösteriyor. yara –help komutunu çalıştırdığımızda ise aşağıdaki çıktıyı vermektedir.
┌─[can@parrot]─[~/Desktop/yara-4.0.5]
└──╼ $yara --help
YARA 4.0.5, the pattern matching swiss army knife.
Usage: yara [OPTION]... [NAMESPACE:]RULES_FILE... FILE | DIR | PID
Mandatory arguments to long options are mandatory for short options too.
--atom-quality-table=FILE path to a file with the atom quality table
-C, --compiled-rules load compiled rules
-c, --count print only number of matches
-d, --define=VAR=VALUE define external variable
--fail-on-warnings fail on warnings
-f, --fast-scan fast matching mode
-h, --help show this help and exit
-i, --identifier=IDENTIFIER print only rules named IDENTIFIER
-l, --max-rules=NUMBER abort scanning after matching a NUMBER of rules
--max-strings-per-rule=NUMBER set maximum number of strings per rule (default=10000)
-x, --module-data=MODULE=FILE pass FILE's content as extra data to MODULE
-n, --negate print only not satisfied rules (negate)
-w, --no-warnings disable warnings
-m, --print-meta print metadata
-D, --print-module-data print module data
-e, --print-namespace print rules' namespace
-S, --print-stats print rules' statistics
-s, --print-strings print matching strings
-L, --print-string-length print length of matched strings
-g, --print-tags print tags
-r, --recursive recursively search directories (follows symlinks)
--scan-list scan files listed in FILE, one per line
-k, --stack-size=SLOTS set maximum stack size (default=16384)
-t, --tag=TAG print only rules tagged as TAG
-p, --threads=NUMBER use the specified NUMBER of threads to scan a directory
-a, --timeout=SECONDS abort scanning after the given number of SECONDS
-v, --version show version information
Send bug reports and suggestions to: [email protected].
YARA Kurallarının Tanımlanması
Yukarıdaki çıktıya bakarsanız eğer yara‘nın kurallardan oluştuğuna görebilirsiniz. YARA da oluşturulan kurallar diğer uygulamalarda (volatility de bellek analizi veya https://www.hybrid-analysis.com/ daki YARA Search kısmı gibi.) kullanılabilmektedir. Kısa bir örnek yapıp bunun üzerinde anlatmak istiyorum.
rule Kural_adi
{
meta:
author="Yusuf Can Çakır"
description= "[email protected]"
strings:
$x = "zararlı yazılım"
$y = "yara kuralı"
condition:
$x or $y
}
Strings
Rule
YARA kuralları rule anahtar sözcüğü ile başlar ve bir isim verilir. meta alanındaki kısımlar ise yara kuralının temel bilgileridir, kim yaptı, açıklaması gibi.
Strings
Strings bilgiler zararlı yazılım ile eşleşmesi gereken bölümdür. Burada üç farklı string yapısı vardır:
- Hexadecimal Strings
- Regex
- Text Strings
Hexadecimal Strings
Hexadecimal string verileri, dosyanın hex karakterleri ile eşlenecektir. Burada kullanılan önemli bir parametre olan Wildcard karakter den bahsetmek istemekteyim.
Wildcard karakter “??” şeklinde tanımlanmaktadır ve siz kuralınızda bunu kullanırsanız, dosyada ne olursa olsun eşleşecektir. Altta örnekli gösterim de daha rahat anlayabilirsiniz.
rule Kural_adı
{
meta:
author="Yusuf Can Çakır"
description= "[email protected]"
strings:
$hex_strings = { B9 02 07 00 00 BE ?? ?? ?? ?? 8B F8 6A 00 F3 A5 }
condition:
$hex_strings
}
Buradaki önemli olan şey şudur: örnek olarak:
B9 02 07 00 00 BE AA AA AA AA 8B F8 6A 00 F3 A5 da olsa eşleşecektir.
B9 02 07 00 00 BE BB BB BB BB 8B F8 6A 00 F3 A5 olsa da eşleşecektir.
Text Strings
Text Strins kısmı ASCII veri şeklinde olmaktadır.
nocase
Büyük küçük harf duyarlı olmaması için nocase kullanmalıyız. Örnek olarak:
Büyük küçük harfe duyarlı değişkenler
$text_case = "Deneme1"
Büyük küçük harfe duyarsız değişkenler
$text_nocase = "deneme1" nocase
Fullword
Buradaki önemli husus, verdiğimiz text verisinin tamamen aynısı olan bir veri ile eşleşmesi gerekiyor.
rule PwnLabMe
{
strings:
$text_fullword = "pwnlab.me"
condition:
$text_fullword
}
Eşleşmede yakalayabilecekleri:
Eşleşmede yakalayamayacakları:
Regular Expressions
String değerleri gibi tanımlanmaktadır fakat çift tırnak işaretleri yerine eğik çizgiler ile işlem yapılmaktadır.
rule PwnLabMe
{
strings:
$regular = /md5: [0-9a-fA-F]{32}/
condition:
$regular
}
Regular Expressions’larda da strings’lerdeki gibi wide, fullword ve nocase gibi ifadeler kullanılmaktadır.
Strings’ler daha geniş fakat burada sonlandırıyorum.
String Tamamlayıcıları
YARA Anahtar Kelimeleri
Conditions (Koşullar)
Koşullar bütün programlama dillerindeki if koşulu gibidir ve boole‘dan farklı bir şey değildir. Tipik koşul ifadeleri and, or ve not; bağıntısal ifadeler ise <=, >=, <, > ve != şeklindedir.
rule PwnLabMe
{
strings:
$k = "text1"
$l = "text2"
$m = "text3"
$n = "text4"
condition:
($k or $l) and ($m or $n)
}
Strings Sayı
rule PwnLabMe
{
strings:
$a = "pwnlab"
$b = "yusuf can"
condition:
$a == 6 and $b > 10
}
Örnek üzerinden anlatmak daha kolay olacağı için ilk olarak örnek verdim. Burada $a değişkeninde 6 tane olursa ve $b değişkenide 10 kereden fazla olursa eşleşme olacaktır.
Strings Offset
Koşullarda kullandığımız strings ile hedefteki process memory’nin herhangi bir noktasında olup olmadığını öğrenmek için kullanılmaktadır.
$k at 100 and $l at 150
Örnekteki gibi $k için çalışan process’deki virtual address kısmının 100 olup olmadığına bakar. Aynı şeyler $l içinde geçerlidir.
YARA kuralları için anlatacaklarım bu kadardı, şimdi de YARA kurallarını oluşturmamızda bizlere yardımcı olan araçlardan bahsedeceğim.
YARA için Araçlar
Yabin
Alien Vault tarafından geliştirilen bir araçtır. GitHub adresine gitmek için: https://github.com/AlienVault-OTX/yabin
YaraGenerator
Xen0ph0n/ tarafından geliştirilen bir araçtır. GitHub adresine gitmek için: https://github.com/Xen0ph0n/YaraGenerator
Bunları da verdikten sonra ufak bir demo yapalım birlikte.
Demo (ZeroLocker)
Öncelikle zararlı yazılım ve ona uygun bir yara kural dosyası bulmamız(veya kendimiz yazmamız) gerekiyor. Zararlı yazılım örneklerini https://thezoo.morirt.com/ buradan indirebilirsiniz.Kurulumu oldukça kolaydır fakat kısaca anlatmak isterim.
Kod:
git clone https://www.github.com/ytisf/theZoo
cd theZoo
pip install --user -r requirements.txt
şeklinde yapmalısınız. Ardından bir malware seçmemiz gerekiyor ki ben ZeroLocker isimli malware’i seçtim. Uygun YARA kural dosyasını https://github.com/reversinglabs/reversinglabs-yara-rules buradan indirebilirsiniz. Şimdi YARA’yı zaten indirmiştik başta, şimdi kullanımına geçelim.
Yara_kullanımı
yara -mrs yara_kural_dosyası.yar zararlı_yazılım
şeklinde yazıyoruz. Buradaki parametrelerin anlamını anlatayım.
-m -print-meta = meta data'yı yazdırır.
-r -recursive = Alt dizinlerine kadar tarar
-s -print-string = eşleşen string değerlerini yazdırır.
Anlatacaklarım bu kadardı, umarım beğenmişsinizdir. Başka bir yazıda görüşmek üzere^^.
Moderatör tarafında düzenlendi: