В нашей прошлой статье («Хеш четкий и хеш нечеткий») мы рассказали, как загружали заранее классифицированные объекты и при этом полностью уповали на знания рандомных аналитиков и верили (конечно, не до конца!), что там действительно находится малварь конкретного семейства. Такое часто происходит в реальном мире, вредоносное ПО настолько быстро появляется, что информацию о том, как идентифицировать угрозу и быстро реализовать правило детектирования, порой бывает почти что вопросом жизни или смерти.
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.
и запустим на директории с семплами Agent Tesla. Посмотрим на результат и убедимся, что правило отработало на всех представителях Agent Tesla.
C:\>
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
) — значит, что должно встретиться после байта 59 либо два байта E9 D8, либо один байт FF.D8|FF 5?
значит, что здесь может быть вариация от 50 до 5F. E8 [4-6] 94 значит, что между байтами E8 и 94 могут быть любые от 4 до 6 байт. -
MyURL_Yandex
— правило срабатывает при нахождении в объекте строки, содержащей ссылку. -
MyRar_SFX
— пример правила для поиска архивов SFX."sfx"
означает, что строка может быть с любой вариацией регистров символов, напримерnocase Sfx
илиSFX
. Параметрwide
означает, что в строке должно быть соответствие по ASCII-символам, которые могут кодироваться двумя байтами (wide), что типично для исполняемых бинарников.ascii
Посмотрим, как выглядят исходные файлы для тестирования правил.
Запустим проверку с нашим правилом MyExe.yar и оценим результат.
C:\>
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
— то же самое, что «1 of them».of them
И так далее, полный список смотри в документации.
Автоматизация
Для получения правил есть три пути: скачать готовые (ссылки — ниже), сделать самому (вариант для энтузиастов) либо заставить машину сделать их самостоятельно. В последнем случае подойдут разные генераторы, например yabin, YaYaGen, yarGen, BASS. В основном для генерации правил они находят уникальные строки в фрагментах вредоносов, но ты сам понимаешь, что это не самый надежный способ.
Полезные ссылки
Остался только один вопрос: где взять все эти готовые индикаторы компрометации (IoC) и правила? Отвечаем: есть официальный репозиторий (и его зеркало) и масса агрегаторов правил в подборке на GitHub.
Все правила, кстати, ты можешь объединить в один файл .yar. Единственное требование — у правил должны быть уникальные имена, которые будут выводиться в результате работы программы.