Skip to content

Commit 4ab0b7d

Browse files
committed
Fedorov course notes [SENATOROVAI#4] (SENATOROVAI/DA#4)
Closes SENATOROVAI/DA#4
1 parent 545b66f commit 4ab0b7d

File tree

2 files changed

+438
-0
lines changed

2 files changed

+438
-0
lines changed
Lines changed: 305 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,305 @@
1+
{
2+
"cells": [
3+
{
4+
"cell_type": "code",
5+
"execution_count": null,
6+
"id": "15354bb1",
7+
"metadata": {},
8+
"outputs": [],
9+
"source": [
10+
"\"\"\"Processing yara rules in Python.\"\"\""
11+
]
12+
},
13+
{
14+
"cell_type": "markdown",
15+
"id": "6451a115",
16+
"metadata": {},
17+
"source": [
18+
"# Обработка yara-правил на языке Python"
19+
]
20+
},
21+
{
22+
"cell_type": "markdown",
23+
"id": "04c68fed",
24+
"metadata": {},
25+
"source": [
26+
"[YARA](https://virustotal.github.io/yara/) является мощным средством идентификации и классификации вредоносного ПО. Исследователи вредоносных программ могут создавать правила ```YARA``` на основе текстовой или двоичной информации, содержащейся в образце. Эти правила состоят из набора строк и логического выражения, которое определяет его логику. Как только правило написано, вы можете использовать его для сканирования файлов с применением утилиты ```YARA``` или использовать модуль [yara-python](https://github.com/VirusTotal/yara-python) для интеграции с вашими инструментальными средствами.\n",
27+
"\n",
28+
"Подробнее о написании правил YARA можно узнать на [странице](https://yara.readthedocs.io/en/v4.2.3/writingrules.html).\n",
29+
"\n",
30+
"Полезные ссылки по генерации правил:\n",
31+
"- [How to Write Simple but Sound Yara Rules](https://www.nextron-systems.com/2015/02/16/write-simple-sound-yara-rules/)\n",
32+
"- [yarGen](https://github.com/Neo23x0/yarGen)"
33+
]
34+
},
35+
{
36+
"cell_type": "markdown",
37+
"id": "29273a66",
38+
"metadata": {},
39+
"source": [
40+
"Исходные файлы для блокнота находятся по [ссылке](https://github.com/dm-fedorov/infosec/tree/master/re-tools/yara-rules) и по [ссылке](https://github.com/dm-fedorov/infosec/tree/master/re-tools/samples)."
41+
]
42+
},
43+
{
44+
"cell_type": "markdown",
45+
"id": "61d83fae",
46+
"metadata": {},
47+
"source": [
48+
"Скачиваем архив с правилами для работы в Colab:"
49+
]
50+
},
51+
{
52+
"cell_type": "code",
53+
"execution_count": null,
54+
"id": "9ac20a85",
55+
"metadata": {},
56+
"outputs": [],
57+
"source": [
58+
"!wget https://dfedorov.spb.ru/infosec/yara/yara-rules.zip"
59+
]
60+
},
61+
{
62+
"cell_type": "code",
63+
"execution_count": null,
64+
"id": "ad13f38b",
65+
"metadata": {},
66+
"outputs": [],
67+
"source": [
68+
"!unzip yara-rules.zip"
69+
]
70+
},
71+
{
72+
"cell_type": "markdown",
73+
"id": "aaa3d8cb",
74+
"metadata": {},
75+
"source": [
76+
"Скачиваем архив с файлами для исследования:"
77+
]
78+
},
79+
{
80+
"cell_type": "code",
81+
"execution_count": null,
82+
"id": "124051a9",
83+
"metadata": {},
84+
"outputs": [],
85+
"source": [
86+
"!wget https://dfedorov.spb.ru/infosec/re/samples.zip"
87+
]
88+
},
89+
{
90+
"cell_type": "code",
91+
"execution_count": null,
92+
"id": "491d888d",
93+
"metadata": {},
94+
"outputs": [],
95+
"source": [
96+
"!unzip samples.zip"
97+
]
98+
},
99+
{
100+
"cell_type": "code",
101+
"execution_count": null,
102+
"id": "cf2a9ef5",
103+
"metadata": {},
104+
"outputs": [],
105+
"source": [
106+
"!apt-get install yara"
107+
]
108+
},
109+
{
110+
"cell_type": "code",
111+
"execution_count": null,
112+
"id": "7722d498",
113+
"metadata": {},
114+
"outputs": [],
115+
"source": [
116+
"!pip3 install yara-python"
117+
]
118+
},
119+
{
120+
"cell_type": "markdown",
121+
"id": "924a2b36",
122+
"metadata": {},
123+
"source": [
124+
"## Основы правил YARA\n",
125+
"\n",
126+
"После установки следующим шагом будет создание правил ```YARA```; эти правила могут быть общими или очень конкретными и могут быть созданы с помощью любого текстового редактора.\n",
127+
"\n",
128+
"Рассмотрим в качестве примера простое правило ```YARA```, которое ищет подозрительные строки в любом файле, а именно:\n",
129+
"\n",
130+
"```\n",
131+
"rule suspicious_strings\n",
132+
"{\n",
133+
"strings:\n",
134+
" $a = \"Synflooding\"\n",
135+
" $b = \"Portscanner\"\n",
136+
" $c = \"Keylogger\"\n",
137+
"condition:\n",
138+
" ($a or $b or $c)\n",
139+
"}\n",
140+
"```\n",
141+
"\n",
142+
"Правило ```YARA``` состоит из следующих компонентов:\n",
143+
"- *идентификатор правила*: это имя, которое описывает правило (```suspicious_strings``` в предыдущем примере). Идентификаторы правила могут содержать любой буквенно-цифровой символ и знак подчеркивания, но первый символ не может быть цифрой. Идентификаторы правила чувствительны к регистру, и их количество не может превышать 128 символов;\n",
144+
"- *определение строки*: это раздел, где определены строки (текст, шестнадцатеричные или регулярные выражения), которые будут частью правила. Эта секция может быть опущена, если правило не опирается на какие-либо строки. Каждая строка имеет идентификатор, состоящий из символа ```$```, за которым следует последовательность буквенно-цифровых символов и подчеркивания. Исходя из предыдущего правила, рассматривайте ```$a```, ```$b``` и ```$c``` как переменные, содержащие значения. Эти переменные затем используются в секции условий;\n",
145+
"- *секция условий*: это не дополнительная секция. Здесь находится логика правила. Эта секция должна содержать логическое выражение, указывающее условие, при котором правило будет соответствовать или нет."
146+
]
147+
},
148+
{
149+
"cell_type": "markdown",
150+
"id": "8c1b234b",
151+
"metadata": {},
152+
"source": [
153+
"Следующим шагом будет использование утилиты ```yara``` для сканирования файлов. В предыдущем примере правило искало три подозрительные строки (определенные в ```$a```, ```$b``` и ```$c```) и было основано на условии. Правило соответствовало, если какая-либо из трех строк присутствовала в файле.\n",
154+
"\n",
155+
"Правило было сохранено как ```suspicious_01.yara```:"
156+
]
157+
},
158+
{
159+
"cell_type": "code",
160+
"execution_count": null,
161+
"id": "4438b32d",
162+
"metadata": {},
163+
"outputs": [],
164+
"source": [
165+
"!ls"
166+
]
167+
},
168+
{
169+
"cell_type": "code",
170+
"execution_count": null,
171+
"id": "b006eed4",
172+
"metadata": {},
173+
"outputs": [],
174+
"source": [
175+
"!yara -r yara-rules/suspicious_01.yara samples"
176+
]
177+
},
178+
{
179+
"cell_type": "markdown",
180+
"id": "920bb48a",
181+
"metadata": {},
182+
"source": [
183+
"Предыдущее правило по умолчанию будет соответствовать ASCII-строкам и выполнять сравнение с учетом регистра символов. Если вы хотите, чтобы правило обнаруживало как ASCII-, так и Юникод-строки, укажите модификатор ```ascii``` и ```wide``` рядом со строкой. Модификатор ```nocase``` выполнит сравнение с без учета регистра символов (например, Synflooding, synflooding, sYnflooding и т. д.).\n",
184+
"\n",
185+
"Модифицированное правило для реализации данного сравнения и поиска ASCII- и Unicode-строк показано ниже:\n",
186+
"\n",
187+
"```\n",
188+
"rule suspicious_strings\n",
189+
"{\n",
190+
"strings:\n",
191+
" $a = \"Synflooding\" ascii wide nocase\n",
192+
" $b = \"Portscanner\" ascii wide nocase\n",
193+
" $c = \"Keylogger\" ascii wide nocase\n",
194+
"condition:\n",
195+
" ($a or $b or $c)\n",
196+
"}\n",
197+
"```\n",
198+
"При выполнении предыдущего правила был идентифицирован документ (```v_01.txt```), содержащий Юникод-строки:"
199+
]
200+
},
201+
{
202+
"cell_type": "code",
203+
"execution_count": null,
204+
"id": "670d06de",
205+
"metadata": {},
206+
"outputs": [],
207+
"source": [
208+
"!yara -r yara-rules/suspicious_02.yara samples"
209+
]
210+
},
211+
{
212+
"cell_type": "markdown",
213+
"id": "5610e506",
214+
"metadata": {},
215+
"source": [
216+
"Если вы собираетесь искать строки в исполняемом файле, то можете создать правило, как показано ниже.\n",
217+
"\n",
218+
"```$mz at 0``` в условии указывает ```YARA``` искать сигнатуру ```4D 5A``` (первые два байта PE-файла) в начале файла; это гарантирует, что сигнатура срабатывает только для исполняемых файлов ```PE```. Текстовые строки заключены в двойные кавычки, тогда как шестнадцатеричные строки заключены в фигурные скобки, как в переменной ```$mz```:\n",
219+
"\n",
220+
"```\n",
221+
"rule suspicious_strings\n",
222+
"{\n",
223+
"strings:\n",
224+
" $mz = {4D 5A}\n",
225+
"condition:\n",
226+
" ($mz at 0)\n",
227+
"}\n",
228+
"```\n",
229+
"\n",
230+
"Теперь при выполнении предыдущего правила обнаружены только исполняемые PE-файлы:"
231+
]
232+
},
233+
{
234+
"cell_type": "code",
235+
"execution_count": null,
236+
"id": "8d4ae8c4",
237+
"metadata": {},
238+
"outputs": [],
239+
"source": [
240+
"!yara -r yara-rules/suspicious_03.yara samples"
241+
]
242+
},
243+
{
244+
"cell_type": "markdown",
245+
"id": "fd348f52",
246+
"metadata": {},
247+
"source": [
248+
"Следующее правило ```YARA``` обнаруживает исполняемый PE файл, содержащий встроенный документ Microsoft Office. Правило сработает, если будет найдена шестнадцатеричная строка со смещением больше 1024 байтов (PE-заголовок пропускается), а ```filesize``` определяет конец файла:\n",
249+
"\n",
250+
"```\n",
251+
"rule embedded_office_document\n",
252+
"{\n",
253+
"meta:\n",
254+
" description = \"Detects embedded office document\"\n",
255+
"strings:\n",
256+
" $mz = {4D 5A}\n",
257+
" $a = {D0 CF 11 E0 A1 B1 1A E1}\n",
258+
"condition:\n",
259+
" ($mz at 0) and $a in (1024..filesize)\n",
260+
"}\n",
261+
"```"
262+
]
263+
},
264+
{
265+
"cell_type": "markdown",
266+
"id": "0150fe03",
267+
"metadata": {},
268+
"source": [
269+
"```YARA``` может использоваться для обнаружения шаблонов в любом файле.\n",
270+
"\n",
271+
"Следующее правило обнаруживает связь различных вариантов вредоносной программы `Gh0stRAT` (см. [тут](https://attack.mitre.org/software/S0032/)) в наборах сетевого трафика (pcap формат):"
272+
]
273+
},
274+
{
275+
"cell_type": "markdown",
276+
"id": "6bf57a9a",
277+
"metadata": {},
278+
"source": [
279+
"```\n",
280+
"rule Gh0stRat_communications\n",
281+
"{\n",
282+
"meta:\n",
283+
" Description = \"Detects the Gh0stRat communication in Packet Captures\"\n",
284+
"strings:\n",
285+
" $gst1 = {47 68 30 73 74 ?? ?? 00 00 ?? ?? 00 00 78 9c}\n",
286+
" $gst2 = {63 62 31 73 74 ?? ?? 00 00 ?? ?? 00 00 78 9c}\n",
287+
" $gst3 = {30 30 30 30 30 30 30 30 ?? ?? 00 00 ?? ?? 00 00 78 9c}\n",
288+
" $gst4 = {45 79 65 73 32 ?? ?? 00 00 ?? ?? 00 00 78 9c}\n",
289+
" $gst5 = {48 45 41 52 54 ?? ?? 00 00 ?? ?? 00 00 78 9c}\n",
290+
" $any_variant = /.{5,16}\\x00\\x00..\\x00\\x00\\x78\\x9c/\n",
291+
"condition:\n",
292+
" any of ($gst*) or ($any_variant)\n",
293+
"}\n",
294+
"```"
295+
]
296+
}
297+
],
298+
"metadata": {
299+
"language_info": {
300+
"name": "python"
301+
}
302+
},
303+
"nbformat": 4,
304+
"nbformat_minor": 5
305+
}

0 commit comments

Comments
 (0)