YARA — это популяр­ный и уни­вер­саль­ный инс­тру­мент, который иног­да называ­ют швей­цар­ским ножом для иссле­дова­телей вре­донос­ных прог­рамм, но исполь­зовать его мож­но и в дру­гих целях. Сегод­ня мы выс­тупим в жан­ре «Сам себе анти­вирус» и рас­ска­жем, как с помощью YARA писать пра­вила и искать фай­лы по харак­терным приз­накам.

В нашей прош­лой статье («Хеш чет­кий и хеш нечет­кий») мы рас­ска­зали, как заг­ружали заранее клас­сифици­рован­ные объ­екты и при этом пол­ностью упо­вали на зна­ния ран­домных ана­лити­ков и верили (конеч­но, не до кон­ца!), что там дей­стви­тель­но находит­ся мал­варь кон­крет­ного семей­ства. Такое час­то про­исхо­дит в реаль­ном мире, вре­донос­ное ПО нас­толь­ко быс­тро появ­ляет­ся, что информа­цию о том, как иден­тифици­ровать угро­зу и быс­тро реали­зовать пра­вило детек­тирова­ния, порой быва­ет поч­ти что воп­росом жиз­ни или смер­ти.

YARA — это опен­сор­сный инс­тру­мент, который помога­ет иссле­дова­телям искать и клас­сифици­ровать вре­донос­ные сем­плы и даже про­водить Threat Hunting. Ути­лита выпол­няет сиг­натур­ный ана­лиз на осно­ве фор­маль­ных YARA-опи­саний (пра­вил). В них содер­жатся инди­като­ры ком­про­мета­ции для раз­ных типов вре­донос­ного ПО.

Фиш­ка в том, что делать пра­вила лег­ко и не занима­ет мно­го вре­мени. Имен­но поэто­му YARA исполь­зуют в AlienVault, Avast, ESET, FireEye, Group-IB, Kaspersky, Trend Micro, Virus Total, x64dbg... В общем, поч­ти все, кто име­ет дело с ана­лизом вре­донос­ного ПО.

YARA-пра­вила могут обра­баты­вать не толь­ко исполня­емые фай­лы, но и докумен­ты, биб­лиоте­ки, драй­веры — все что угод­но. Ими же мож­но ска­ниро­вать сетевой тра­фик, хра­нили­ща дан­ных, дам­пы памяти. Эти пра­вила мож­но вклю­чать в дру­гие инс­тру­мен­ты, такие как SIEM, анти­фишинг, IDS, песоч­ницы.

Да­вай раз­берем­ся, как же выг­лядят эти пра­вила и как их сос­тавлять.

 

Структура правил

Обыч­но пра­вила хра­нят­ся в тек­сто­вом фор­мате в фай­ле .yar и сос­тоят из двух сек­ций:

  • сек­ции опре­деле­ний (strings) — содер­жит харак­терные для мал­вари кон­стан­ты, хеши, HEX-фраг­менты, ссыл­ки, стро­ки;
  • сек­ции усло­вия (condition) — содер­жит усло­вия, по которым при­нима­ются решения отно­ситель­но ана­лизи­руемо­го фай­ла.

Выг­лядит это так:

rule SomeMalwareName {
meta:
author = "AuthorName"
strings:
condition:
}
 

Применяем YARA

Ми­нималь­но необ­ходимые сек­ции — это наз­вание пра­вила и его усло­вия. Нап­ример, пра­вилом ниже мы будем детек­тировать объ­екты толь­ко по их imphash (на тес­товых объ­ектах из пре­дыду­щей статьи):

import "pe"
rule MyLittleAgentTeslaRuleDetect {
condition:
pe.imphash() == "b21a7468eedc66a1ef417421057d3157" or
pe.imphash() == "f34d5f2d4577ed6d9ceec516c1f5a744"
}

Сох­раним файл как AT.yar и запус­тим на дирек­тории с сем­пла­ми Agent Tesla. Пос­мотрим на резуль­тат и убе­дим­ся, что пра­вило отра­бота­ло на всех пред­ста­вите­лях Agent Tesla.

C:\>yara64.exe -r AT.yar AgentTesla
MyLittleAgentTeslaRuleDetect AgentTesla\AT11.exe
MyLittleAgentTeslaRuleDetect AgentTesla\AT12.exe
MyLittleAgentTeslaRuleDetect AgentTesla\AT13.exe
MyLittleAgentTeslaRuleDetect AgentTesla\AT14.exe
MyLittleAgentTeslaRuleDetect AgentTesla\AT16.exe
MyLittleAgentTeslaRuleDetect AgentTesla\AT2.exe
MyLittleAgentTeslaRuleDetect AgentTesla\AT18.exe
MyLittleAgentTeslaRuleDetect AgentTesla\AT15.exe
MyLittleAgentTeslaRuleDetect AgentTesla\AT10.exe
MyLittleAgentTeslaRuleDetect AgentTesla\AT3.exe
MyLittleAgentTeslaRuleDetect AgentTesla\AT6.exe
MyLittleAgentTeslaRuleDetect AgentTesla\AT7.exe
MyLittleAgentTeslaRuleDetect AgentTesla\AT1.exe
MyLittleAgentTeslaRuleDetect AgentTesla\AT9.exe
MyLittleAgentTeslaRuleDetect AgentTesla\AT4.exe
MyLittleAgentTeslaRuleDetect AgentTesla\AT17.exe
MyLittleAgentTeslaRuleDetect AgentTesla\AT5.exe
MyLittleAgentTeslaRuleDetect AgentTesla\AT8.exe

Ре­зуль­тат — все из всех.

Как ты мог заметить, пра­вила YARA под­держи­вают импорт полез­ных модулей. Соот­ветс­твен­но, мож­но написать свои модули. Вот нес­коль­ко наибо­лее час­то исполь­зуемых:

  • pe — фун­кции, нуж­ные при работе с объ­екта­ми Portable Executable, нап­ример кон­троль­ная сум­ма imphash, мет­ка вре­мени соз­дания, рас­положе­ние сек­ций;
  • hash — рас­чет кон­троль­ных сумм и крип­тогра­фичес­ких хешей;
  • math — матема­тичес­кие под­сче­ты, нап­ример сред­нее ариф­метичес­кое или энтро­пия.

Пол­ный спи­сок ты всег­да можешь гля­нуть в офи­циаль­ной докумен­тации по YARA.

 

Пишем правила

В опци­ональ­ной сек­ции опре­деле­ний мож­но юзать мас­ки (wildcard, подобия регуляр­ных выраже­ний). Нап­ример, для шес­тнад­цатерич­ных строк воз­можны такие мас­ки:

  • сим­вол ? — наличие любого бай­та на мес­те это­го сим­вола;
  • ди­апа­зоны ([4-6] — от 4 до 6 раз­личных бай­тов);
  • аль­тер­нативы (логичес­кое ИЛИ — |).

Рас­смот­рим еще один при­мер с нес­коль­кими пра­вила­ми и про­демонс­три­руем тебе раз­нооб­разие воз­можнос­тей детек­тирова­ния YARA:

import "hash"
rule MyExe_RUFUS {
strings:
$my_HEX_string = { E0 38 D2 21 32 4D 1B C1 79 EC 00 70 76 F5 62 B6 }
condition:
$my_HEX_string and hash.md5(0, filesize) == "d35936d329ac21ac3b59c525e2054078"
}
rule MyExe_Hercules4 {
strings:
$my_HEX_string = { 59 (E9 D8|FF) 1A 00 00 5? E8 [4-6] 94 8F }
condition:
$my_HEX_string
}
rule MyURL_Yandex {
strings:
$my_URL_string = "https://yandex.ru"
condition:
$my_URL_string
}
rule MyRar_SFX {
strings:
$winrar1 = "WINRAR.SFX" nocase wide ascii
$winrar2 = ";The comment below contains SFX script commands" wide ascii
$winrar3 = "Silent=1" wide ascii
$winrar4 = { E8 65 64 00 00 E9 78 FE FF FF}
//$winrar4 = "sfx" nocase
condition:
1 of them
}

Раз­берем каж­дое из пра­вил:

  • MyExe_RUFUS — пра­вило сра­баты­вает, если будет обна­ружен ука­зан­ный машин­ный код и сов­падет хеш MD5;
  • MyExe_Hercules4 — при­мер пра­вила с исполь­зовани­ем мас­ки по шес­тнад­цатерич­ным зна­чени­ям. 59 (E9 D8|FF) — зна­чит, что дол­жно встре­тить­ся пос­ле бай­та 59 либо два бай­та E9 D8, либо один байт FF. 5? зна­чит, что здесь может быть вари­ация от 50 до 5F. E8 [4-6] 94 зна­чит, что меж­ду бай­тами E8 и 94 могут быть любые от 4 до 6 байт.
  • MyURL_Yandex — пра­вило сра­баты­вает при нахож­дении в объ­екте стро­ки, содер­жащей ссыл­ку.
  • MyRar_SFX — при­мер пра­вила для поис­ка архи­вов SFX. "sfx" nocase озна­чает, что стро­ка может быть с любой вари­ацией регис­тров сим­волов, нап­ример Sfx или SFX. Параметр wide ascii озна­чает, что в стро­ке дол­жно быть соот­ветс­твие по ASCII-сим­волам, которые могут кодиро­вать­ся дву­мя бай­тами (wide), что типич­но для исполня­емых бинар­ников.

Пос­мотрим, как выг­лядят исходные фай­лы для тес­тирова­ния пра­вил.

За­пус­тим про­вер­ку с нашим пра­вилом MyExe.yar и оце­ним резуль­тат.

C:\>yara64.exe -r MyExe.yar C:\SAMPLES
MyExe_Hercules4 C:\SAMPLES\Hercules4.exe
MyExe_RUFUS C:\SAMPLES\rufus-2.17p.exe
MyRar_SFX C:\SAMPLES\HV_DETECT_FIN.exe
MyURL_Yandex C:\SAMPLES\Dear_Recipient.pdf

До­кумен­ты PDF и DOCX иден­тичны, но YARA не смог­ла най­ти стро­ку ссыл­ки в нем, так как фор­мат DOCX — это архив ZIP. Для работы с ним нуж­но будет добавить кас­томный модуль для работы с архи­вами, но мы не будем в это углублять­ся.

Са­мое глав­ное — гра­мот­но сос­тавить усло­вие, по которо­му будет про­верять­ся файл. Обыч­но оно ком­биниру­ет перемен­ные из сек­ции опре­деле­ния, под­держи­вают­ся логичес­кие опе­рато­ры вро­де or и and, скоб­ки и кон­стан­ты. Нап­ример:

  • filesize — раз­мер фай­ла;
  • at — задание сме­щения;
  • 1 of them — хотя бы одно усло­вие из перечис­ленных в пра­виле дол­жно выпол­нить­ся;
  • any of them — то же самое, что «1 of them».

И так далее, пол­ный спи­сок смот­ри в докумен­тации.

 

Автоматизация

Для получе­ния пра­вил есть три пути: ска­чать готовые (ссыл­ки — ниже), сде­лать самому (вари­ант для энту­зиас­тов) либо зас­тавить машину сде­лать их самос­тоятель­но. В пос­леднем слу­чае подой­дут раз­ные генера­торы, нап­ример yabin, YaYaGen, yarGen, BASS. В основном для генера­ции пра­вил они находят уни­каль­ные стро­ки в фраг­ментах вре­доно­сов, но ты сам понима­ешь, что это не самый надеж­ный спо­соб.

 

Полезные ссылки

Ос­тался толь­ко один воп­рос: где взять все эти готовые инди­като­ры ком­про­мета­ции (IoC) и пра­вила? Отве­чаем: есть офи­циаль­ный репози­торий (и его зер­кало) и мас­са агре­гато­ров пра­вил в под­борке на GitHub.

Все пра­вила, кста­ти, ты можешь объ­еди­нить в один файл .yar. Единс­твен­ное тре­бова­ние — у пра­вил дол­жны быть уни­каль­ные име­на, которые будут выводить­ся в резуль­тате работы прог­раммы.

1 комментарий

  1. Аватар

    Борис Осепов

    24.11.2020 в 06:47

    Объяснение any of them следующее — хотя бы одно (или несколько) соответствие из секции определений.

Оставить мнение