{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "[YARA](https://virustotal.github.io/yara/) является мощным средством идентификации и классификации вредоносного ПО. Исследователи вредоносных программ могут создавать правила ```YARA``` на основе текстовой или двоичной информации, содержащейся в образце. Эти правила состоят из набора строк и логического выражения, которое определяет его логику. Как только правило написано, вы можете использовать его для сканирования файлов с применением утилиты ```YARA``` или использовать yara-python для интеграции с вашими инструментальными средствами. \n", "\n", "Подробнее о написании правил YARA можно узнать на [странице](https://yara.readthedocs.io/en/v4.0.2/writingrules.html).\n", "\n", "Полезные ссылки по генерации правил:\n", "- [How to Write Simple but Sound Yara Rules](https://www.nextron-systems.com/2015/02/16/write-simple-sound-yara-rules/)\n", "- [yarGen](https://github.com/Neo23x0/yarGen)\n", "- [Joe Sandbox Cloud](https://www.joesandbox.com/)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#apt-get install yara" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#!pip3 install yara-python" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Основы правил YARA\n", "\n", "После установки следующим шагом будет создание правил ```YARA```; эти правила могут быть общими или очень конкретными и могут быть созданы с помощью любого текстового редактора. \n", "\n", "Рассмотрим в качестве примера простое правило ```YARA```, которое ищет подозрительные строки в любом файле, а именно:\n", "\n", "```\n", "rule suspicious_strings\n", "{\n", "strings:\n", " $a = \"Synflooding\"\n", " $b = \"Portscanner\"\n", " $c = \"Keylogger\"\n", "condition:\n", " ($a or $b or $c)\n", "}\n", "```\n", "\n", "Правило ```YARA``` состоит из следующих компонентов:\n", "- *идентификатор правила*: это имя, которое описывает правило (```suspicious_strings``` в предыдущем примере). Идентификаторы правила могут содержать любой буквенно-цифровой символ и знак подчеркивания, но первый символ не может быть цифрой. Идентификаторы правила чувствительны к регистру, и их количество не может превышать 128 символов;\n", "- *определение строки*: это раздел, где определены строки (текст, шестнадцатеричные или регулярные выражения), которые будут частью правила. Эта секция может быть опущена, если правило не опирается на какие-либо строки. Каждая строка имеет идентификатор, состоящий из символа ```$```, за которым следует последовательность буквенно-цифровых символов и подчеркивания. Исходя из предыдущего правила, рассматривайте ```$a```, ```$b``` и ```$c``` как переменные, содержащие значения. Эти переменные затем используются в секции условий;\n", "- *секция условий*: это не дополнительная секция. Здесь находится логика правила. Эта секция должна содержать логическое выражение, указывающее условие, при котором правило будет соответствовать или нет." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Следующим шагом будет использование утилиты ```yara``` для сканирования файлов. В предыдущем примере правило искало три подозрительные строки (определенные в ```$a```, ```$b``` и ```$c```) и было основано на условии. Правило соответствовало, если какая-либо из трех строк присутствовала в файле. \n", "\n", "Правило было сохранено как ```suspicious_01.yara```:" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "samples yara-rules yara-правила.ipynb нечеткое хеширование.ipynb\n" ] } ], "source": [ "!ls" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [], "source": [ "!yara -r yara-rules/suspicious_01.yara samples" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Предыдущее правило по умолчанию будет соответствовать ASCII-строкам и выполнять сравнение с учетом регистра символов. Если вы хотите, чтобы правило обнаруживало как ASCII-, так и Юникод-строки, укажите модификатор ```ascii``` и ```wide``` рядом со строкой. Модификатор ```nocase``` выполнит сравнение с без учета регистра символов (например, Synflooding, synflooding, sYnflooding и т. д.). \n", "\n", "Модифицированное правило для реализации данного сравнения и поиска ASCII- и Unicode-строк показано ниже:\n", "\n", "```\n", "rule suspicious_strings\n", "{\n", "strings:\n", " $a = \"Synflooding\" ascii wide nocase\n", " $b = \"Portscanner\" ascii wide nocase\n", " $c = \"Keylogger\" ascii wide nocase\n", "condition:\n", " ($a or $b or $c)\n", "}\n", "```\n", "При выполнении предыдущего правила был идентифицирован документ (```v_01.txt```), содержащий Юникод-строки:" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "suspicious_strings samples/v_01.txt\n" ] } ], "source": [ "!yara -r yara-rules/suspicious_02.yara samples" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Если вы собираетесь искать строки в исполняемом файле, то можете создать правило, как показано ниже. \n", "\n", "```$mz at 0``` в условии указывает ```YARA``` искать сигнатуру ```4D 5A``` (первые два байта PE-файла) в начале файла; это гарантирует, что сигнатура срабатывает только для исполняемых файлов ```PE```. Текстовые строки заключены в двойные кавычки, тогда как шестнадцатеричные строки заключены в фигурные скобки, как в переменной ```$mz```:\n", "\n", "```\n", "rule suspicious_strings\n", "{\n", "strings:\n", " $mz = {4D 5A}\n", "condition:\n", " ($mz at 0)\n", "}\n", "```\n", "\n", "Теперь при выполнении предыдущего правила обнаружены только исполняемые PE-файлы:" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "suspicious_strings samples/task-1.exe\n" ] } ], "source": [ "!yara -r yara-rules/suspicious_03.yara samples" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Следующее правило ```YARA``` обнаруживает исполняемый PE файл, содержащий встроенный документ Microsoft Office. Правило сработает, если будет найдена шестнадцатеричная строка со смещением больше 1024 байтов (PE-заголовок пропускается), а ```filesize``` определяет конец файла:\n", "\n", "```\n", "rule embedded_office_document\n", "{\n", "meta:\n", " description = \"Detects embedded office document\"\n", "strings:\n", " $mz = {4D 5A}\n", " $a = {D0 CF 11 E0 A1 B1 1A E1}\n", "condition:\n", " ($mz at 0) and $a in (1024..filesize)\n", "}\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "```YARA``` может использоваться для обнаружения шаблонов в любом файле.\n", "\n", "Следующее правило обнаруживает связь различных вариантов вредоносной программы Gh0stRAT (см. [тут](https://www.rsa.com/content/dam/en/case-study/gh0st-rat.pdf) и [тут](https://attack.mitre.org/software/S0032/)) в наборах сетевого трафика (pcap формат):" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "```\n", "rule Gh0stRat_communications\n", "{\n", "meta:\n", " Description = \"Detects the Gh0stRat communication in Packet Captures\"\n", "strings:\n", " $gst1 = {47 68 30 73 74 ?? ?? 00 00 ?? ?? 00 00 78 9c}\n", " $gst2 = {63 62 31 73 74 ?? ?? 00 00 ?? ?? 00 00 78 9c}\n", " $gst3 = {30 30 30 30 30 30 30 30 ?? ?? 00 00 ?? ?? 00 00 78 9c}\n", " $gst4 = {45 79 65 73 32 ?? ?? 00 00 ?? ?? 00 00 78 9c} \n", " $gst5 = {48 45 41 52 54 ?? ?? 00 00 ?? ?? 00 00 78 9c}\n", " $any_variant = /.{5,16}\\x00\\x00..\\x00\\x00\\x78\\x9c/\n", "condition:\n", " any of ($gst*) or ($any_variant)\n", "}\n", "```" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.3" } }, "nbformat": 4, "nbformat_minor": 4 }