YARA является мощным средством идентификации и классификации вредоносного ПО. Исследователи вредоносных программ могут создавать правила YARA
на основе текстовой или двоичной информации, содержащейся в образце. Эти правила состоят из набора строк и логического выражения, которое определяет его логику. Как только правило написано, вы можете использовать его для сканирования файлов с применением утилиты YARA
или использовать модуль yara-python для интеграции с вашими инструментальными средствами.
Подробнее о написании правил YARA можно узнать на странице.
Полезные ссылки по генерации правил:
Скачиваем архив с правилами для работы в Colab:
!wget https://dfedorov.spb.ru/infosec/yara/yara-rules.zip
!unzip yara-rules.zip
Скачиваем архив с файлами для исследования:
!wget https://dfedorov.spb.ru/infosec/re/samples.zip
!unzip samples.zip
!apt-get install yara
!pip3 install yara-python
После установки следующим шагом будет создание правил YARA
; эти правила могут быть общими или очень конкретными и могут быть созданы с помощью любого текстового редактора.
Рассмотрим в качестве примера простое правило YARA
, которое ищет подозрительные строки в любом файле, а именно:
rule suspicious_strings
{
strings:
$a = "Synflooding"
$b = "Portscanner"
$c = "Keylogger"
condition:
($a or $b or $c)
}
Правило YARA
состоит из следующих компонентов:
suspicious_strings
в предыдущем примере). Идентификаторы правила могут содержать любой буквенно-цифровой символ и знак подчеркивания, но первый символ не может быть цифрой. Идентификаторы правила чувствительны к регистру, и их количество не может превышать 128 символов;$
, за которым следует последовательность буквенно-цифровых символов и подчеркивания. Исходя из предыдущего правила, рассматривайте $a
, $b
и $c
как переменные, содержащие значения. Эти переменные затем используются в секции условий;Следующим шагом будет использование утилиты yara
для сканирования файлов. В предыдущем примере правило искало три подозрительные строки (определенные в $a
, $b
и $c
) и было основано на условии. Правило соответствовало, если какая-либо из трех строк присутствовала в файле.
Правило было сохранено как suspicious_01.yara
:
!ls
sample_data samples samples.zip yara-rules yara-rules.zip
!yara -r yara-rules/suspicious_01.yara samples
Предыдущее правило по умолчанию будет соответствовать ASCII-строкам и выполнять сравнение с учетом регистра символов. Если вы хотите, чтобы правило обнаруживало как ASCII-, так и Юникод-строки, укажите модификатор ascii
и wide
рядом со строкой. Модификатор nocase
выполнит сравнение с без учета регистра символов (например, Synflooding, synflooding, sYnflooding и т. д.).
Модифицированное правило для реализации данного сравнения и поиска ASCII- и Unicode-строк показано ниже:
rule suspicious_strings
{
strings:
$a = "Synflooding" ascii wide nocase
$b = "Portscanner" ascii wide nocase
$c = "Keylogger" ascii wide nocase
condition:
($a or $b or $c)
}
При выполнении предыдущего правила был идентифицирован документ (v_01.txt
), содержащий Юникод-строки:
!yara -r yara-rules/suspicious_02.yara samples
suspicious_strings samples/v_01.txt
Если вы собираетесь искать строки в исполняемом файле, то можете создать правило, как показано ниже.
$mz at 0
в условии указывает YARA
искать сигнатуру 4D 5A
(первые два байта PE-файла) в начале файла; это гарантирует, что сигнатура срабатывает только для исполняемых файлов PE
. Текстовые строки заключены в двойные кавычки, тогда как шестнадцатеричные строки заключены в фигурные скобки, как в переменной $mz
:
rule suspicious_strings
{
strings:
$mz = {4D 5A}
condition:
($mz at 0)
}
Теперь при выполнении предыдущего правила обнаружены только исполняемые PE-файлы:
!yara -r yara-rules/suspicious_03.yara samples
suspicious_strings samples/task-1.exe
Следующее правило YARA
обнаруживает исполняемый PE файл, содержащий встроенный документ Microsoft Office. Правило сработает, если будет найдена шестнадцатеричная строка со смещением больше 1024 байтов (PE-заголовок пропускается), а filesize
определяет конец файла:
rule embedded_office_document
{
meta:
description = "Detects embedded office document"
strings:
$mz = {4D 5A}
$a = {D0 CF 11 E0 A1 B1 1A E1}
condition:
($mz at 0) and $a in (1024..filesize)
}
YARA
может использоваться для обнаружения шаблонов в любом файле.
Следующее правило обнаруживает связь различных вариантов вредоносной программы Gh0stRAT
(см. тут) в наборах сетевого трафика (pcap формат):
rule Gh0stRat_communications
{
meta:
Description = "Detects the Gh0stRat communication in Packet Captures"
strings:
$gst1 = {47 68 30 73 74 ?? ?? 00 00 ?? ?? 00 00 78 9c}
$gst2 = {63 62 31 73 74 ?? ?? 00 00 ?? ?? 00 00 78 9c}
$gst3 = {30 30 30 30 30 30 30 30 ?? ?? 00 00 ?? ?? 00 00 78 9c}
$gst4 = {45 79 65 73 32 ?? ?? 00 00 ?? ?? 00 00 78 9c}
$gst5 = {48 45 41 52 54 ?? ?? 00 00 ?? ?? 00 00 78 9c}
$any_variant = /.{5,16}\x00\x00..\x00\x00\x78\x9c/
condition:
any of ($gst*) or ($any_variant)
}