• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Статья Пишем свой сигнатурный антивирус на C#. Часть 2 - Пишем Yara правила.

Приветствую гостей и участников портала Codeby.net. Сегодня продолжим подготовку к написанию своего антивируса AV, в первой части мы рассмотрели как получить базу правил, как ее привести в порядок и как обнаруживать вирусы, в этой части мы рассмотрим как писать Yara правила.
Ссылка на первую часть - Пишем свой сигнатурный антивирус на C#. Часть 1 - Небольшой экскурс в YARA.
Сразу перейдем к делу.

Введение в правила YARA.
Давайте начнем с рассмотрения различных компонентов, которые могут быть частью правила.
Как минимум, правило должно иметь имя и условие. Самое простое из возможных правил будет выглядеть следующим образом:
Код:
rule test_for_codeby { condition: false }
Это правило ничего не делает. И наоборот, это правило соответствует чему угодно:
Код:
rule test_for_codeby { condition: true }
Вот немного более полезный пример, который подойдет для любого файла размером более 500 КБ:

Код:
rule test_for_codeby {condition: filesize > 500KB}
Демонстрация последнего правила:

1548578540434.png


Секции или разделы в Yara-правилах.
Писать Yara-правила мы будем со следующими разделами(секциями):
  • Meta раздел(секция). Эта секция состоит из произвольного кол-ва пар-ключей, которые могут быть использованы для описания правила. Этот блок может рассматриваться инструментами которые будут его использовать. Возможно наше Антивирусное Обеспечение также будет читать этот раздел для отображение полной картины. Мета-значения могут быть строками, целыми числами, десятичными числами или логическими значениями.
1548578751390.png

  • strings раздел(секция). Это секция представляет очень большое значение, так как она определяет сигнатуру, которую мы будем искать. По сути этот раздел содержит просто сигнатуру(некую информацию для обнаружения).
    В качестве шаблонов могут выступать:
    • Шестнадцатеричные байты. Часто используется для идентификации уникального кода.
    • Текстовые строки.
    • Регулярные выражения.
1548578970538.png

  • condition раздел(секция). По сути это секция с условиями. Именно в этом блоке проявляется сила и гибкость всего продукта Yara. Вот пример нескольких условных выражений:
    • any of them - Правило будет возвращать True в том случае, если встретилось хотя бы один пункт(найдена одна из строк) из раздела strings.
    • all of them - Правило будет возвращать True в том случае, если встретились все пункты(найдены все строки) из раздела strings.
    • 5 of them - Правило будет возвращать True в том случае, если встретилось не меньше 5 пунктов(найдены > 5 строк) из раздела strings.
    • $a and 3 of ($s*) - Правило возвращает True в том случае, если встретилась строка $a и не меньше 3 строк которые встретились в строке $s.
1548579206697.png


Пишем Yara-правило.
Теперь попробуем написать свое Yara-правило , которое будет искать RMS Telegram Hellion(Это ПО для удаленного управление ПК через Telegram бота, писался для конкурса мною же. Ссылка кому интересно: RMS Hellion - Telegram).

Начнем мы конечно же с названия Yara-правила: Пока правило будет выглядеть следующим образом:
Код:
rule RMSTELEGRAM {}
Здесь мы имеем только название правила и все!
Следующим мы заполним блок с Meta-информацией.
Код:
meta:
  author = "Debug"
  last_updated = "2019-01-25"
  description = "RMS Telegram Bot"

Как говорилось ранее, этот блок не несёт много полезной информации, она нам пригодиться всего-лишь для получение более детальной инфы при обнаружение “зловреда”

Теперь переходим к одному из самых важных блоков strings.
Первая строка будет содержать магическое число(подпись файла, формат файла), в нашем случае нужно искать файл .exe.
При правильном построение правила, поиск вредоноса ускориться в несколько раз при сканирование огромного кол-ва файлов, так как мы четко укажем что искать нужно именно файлы содержащие в себе блок 4D 5A 90 00.
Для exe шестнадцатеричная подпись(формат файла) будет выглядеть следующим образом - 4D 5A 90 00. Кто не знает это - формат исполняемого файла с MZ заглушкой.
Получить больше информации про другие форматы и их байты можно здесь -

Код:
$exe_magic = {4D 5A 90 00}
На этом этапе давайте попробуем проверить работоспособность правила.
Соберем в кучу и получим готовое Yara-правило:
Код:
rule RMSTELEGRAM {

meta:
  author = "Debug"
  last_updated = "2019-01-25"
  description = "RMS Telegram Bot"
strings:
$exe_magic = {4D 5A 90 00}

condition:
  all of them
}
Для тестов я использовал Windows версию с GUI. Сканировал все директорию и вот результат:

1548580370857.png


Данное правило хоть и нашло наш .exe файл, но к нему могли подключиться другие ненужные файлы, которые хранили в себе блок - 4D 5A 90 00, а именно были исполняемыми.

Кстати, теперь рассмотрим блок condition: В нем фигурирует всего-лишь одна строка - all of them, суть которой гласит, что правило возвращает True если встретиться все пункты strings. Но в нашем случае мы имеем всего лишь одно strings - $exe_magic = {4D 5A 90 00}

Теперь давайте добавим еще несколько пунктов в блок strings.
Есть один способ нахождение строк из файла(с помощью команду strings <наш файл>, пусть это и будет не лучшей идеей для составление yara-правила, но сегодня мы сделаем именно так.

1548580657621.png


После выполнение команды, наша задача найти строки, которые будут как-то отличаться от других exe файлов(Просто найти уникальность).
Претенденты: Hellion, Telegram.Bot.Types, Telegram.Bot.Types.ReplyMarkups, System.Net, PublicKeyToken, NET Framework, Hellion.SendMsgBot+<sendText>, _Token
Теперь давайте составим блок strings, в котором укажем наши найденные строки.
Блок strings будет выглядеть следующим образом:
Код:
strings:
$exe_magic = {4D 5A}
$s1 = "Telegram.Bot.Types"
$s2 = "System.Net"
$s3 = "NET Framework"
$s4 = "Hellion"
$temp1 = "PublicKeyToken"
$temp2 = "_Token"
Здесь переменные которые начинаются с s(s1, s2, s3) - переменные которые точно должны встретиться, они отображают библиотеку Telegram, Net-проект и т.д.
А вот переменные temp - могут измениться, переменные могут носить другое название.

Блок condition может также иметь условие: all of them. Но это была бы фатальная ошибка для поиска, пусть бы и правило отлично срабатывало. Вместо этого лучше использовать другое условие.

1548580927963.png


Но стоит сделать нам обфускацию кода, как правило уже не может обнаружить “зловреда”
Поэтому мы должны уметь писать правильные правила, и можно поступить следующим образом:
Мы создадим такое условие в котором для возврата истины True - нужно чтобы файл был исполняемый(.exe) + чтобы проект был .Net-ий) + хотя бы одна строка встретилась, здесь полезно найти больше 3 строк).

Конечное правило будет выглядеть следующим образом:
Код:
rule RMSTELEGRAM
{
meta:
  author = "Debug"
  last_updated = "2019-01-25"
  description = "RMS Telegram Bot"
strings:
    $exe_magic = {4D 5A}
    $s2 = "Telegram.Bot.Types"
    $s3 = "System.Net"
    $s4 = "NET Framework"
    $temp1 = "PublicKeyToken"
    $temp2 = "Hellion"
    $temp3 = "_Token"
condition:
($exe_magic) and (($s2 and $s3 and $s4) and ($temp1 or $temp2 or $temp3))
}

1548582734447.png


Можно указывать, например, чтобы файл содержал определенное число строк из заданного набора, с помощью оператора of
Небольшой пример:

1548582947880.png


Генерация правил.
yarGen - это утилита с открытым исходным кодом от Florian Roth, которая генерирует правила YARA для заданного набора образцов.
yarGen генерирует много разных правил для одного набора файлов. Но стоит заметить, что условие для каждого правила, вероятно, будет очень узким (т.е. все они). В этом случае лучше комбинировать эти правила, основываясь на наиболее надежных строках, и группировать их по мере необходимости в условии условия.
Ссылка на репозиторий: Neo23x0/yarGen

Спасибо за внимание, на этом можно закончить написание Yara-правил.))

P.S. Yara-правило для поиска RMS-TELELGRAM-HELLION:
Код:
rule RMSTELEGRAM
{
meta:
  author = "Debug"
  last_updated = "2019-01-25"
  description = "RMS Telegram Bot"
strings:
    $exe_magic = {4D 5A}
    $s2 = "Telegram.Bot.Types"
    $s3 = "System.Net"
    $s4 = "NET Framework"
    $temp1 = "PublicKeyToken"
    $temp2 = "Hellion"
    $temp3 = "_Token"
condition:
($exe_magic) and (($s2 and $s3 and $s4) and ($temp1 or $temp2 or $temp3))
}
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!