Обработка yara-правил на языке Python#

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; эти правила могут быть общими или очень конкретными и могут быть созданы с помощью любого текстового редактора.

Рассмотрим в качестве примера простое правило 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)
}