Snort: Часть 8. Создание собственных правил для Snort. Синтаксис правил.
Данная статья в основном основана на официальной документации SNORT Users Manual.
Snort использует правила, написанные простым, но в то же время гибким и достаточно мощным языком. Большинство правил пишутся в одну строку, хотя могут занимать и несколько строк, в этом случае каждая строка, кроме последней, должна заканчиваться символом “" (без кавычек). В более сложных случаях можно также вызывать другие программы, используя инструкцию включения. Правила для Snort делятся на два вида:
- Бесконтекстные (обычные) - применяются для каждого пакета отдельно, без связи с другими пакетами
- Контекстные (правила препроцессоров) - применяться к той или иной совокупности (последовательности) пакетов.
Правила Snort состоят из заголовка (Rule Header) и опций (Rule Options). Заголовок содержит описание действия, протокол передачи данных, IP-адреса, сетевые маски и порты источника и назначения. После заголовка правила следует необязательная часть правила - его опции, они включают определение дополнительных критериев выполнения правила и определение дополнительных реагирующих действий. Они используются для организации более жесткой и направленной фильтрации траффика. Весь набор опций заключается в круглые скобки, сами опции отделяются друг от друг с помощью точки с запятой “;” (последняя опция в списке тоже должна заканчиваться этим символом). Ключевые слова (keywords) опций отделяются от своих аргументов (values) двоеточием “:”. Структура правил Snort в общем случае выглядит следующим образом:
Заголовок | Опции | |||||||||
---|---|---|---|---|---|---|---|---|---|---|
Действие | Протокол | IP-адреса отправителей | Порты отправителей | Оператор направления | IP-адреса получателей | Порты получателей | [Мета данные] | [Данные в полезной нагрузке] | [Данные в заголовке] | [Действие после обнаружения] |
Синтаксис записи правил Snort:
<Действие> <Протокол> <IP-адреса отправителей> <Порты отправителей> <Оператор направления> <IP-адреса получателей> <Порты получателей> (ключ_1 : значение_1; ключ_2 : значение_2; ... ключ_N : значение_N;)
Заголовок правила
Допустимые параметры для каждого поля заголовка правил Snort:
Действия правила
Действие | Описание |
---|---|
alert | генерирует предупреждение, используя указанное предупреждение, и передаёт информацию системе журналирования |
log | просто протоколирует пакеты без предупреждений |
pass | игнорирует пакеты |
activate | генерирует предупреждение, затем включает указанное динамическое правило |
dynamic | остаётся пассивным, пока не активируется динамическим правилом, затем действует как log |
В режиме inline к предыдущим действиям добавляются дополнительные действия:
Действие | Описание |
---|---|
drop | блокирует (отбрасывает) пакет и передаёт информацию системе журналирования |
sdrop | блокирует (отбрасывает) пакет и не использует систему журналирования |
reject | блокирует (отбрасывает) пакет, передаёт информацию системе журналирования, а затем посылает сегмент сброса TCP (TCP RST), если протокол TCP, или сообщение ICMP-порт недоступен, если протокол UDP |
Также можно создать свои собственные типы правил и связать один или несколько выходных модулей с ними. Можно затем использовать созданные типы правил в качестве действий в правилах Snort. В примере ниже создаётся тип правила, который будет регистрировать только tcpdump:
ruletype suspicious
{
type log
output log_tcpdump: suspicious.log
}
А в этом примере создаётся тип правила, регистрирующей и tcpdump, и syslog:
ruletype redalert
{
type alert
output alert_syslog: LOG_AUTH LOG_ALERT
output log_tcpdump: suspicious.log
}
Протоколы
Обозначает протокол передачи данных. На данный момент Snort умеет анализировать на предмет подозрительного содержания/поведения 4 типа протоколов: TCP, UDP, ICMP, IP, соответственно, возможны 4 значения: tcp, udp, icmp или ip, что означает любой IP-протокол. В будущем, возможно, этот список пополнят и другие протоколы, к примеру, ARP, IGRP, GRE, OSPF, RIP, IPX и другие.
IP-адресация
Поскольку Snort не имеет встроенного механизма получения IP адреса, используя доменное имя, то нужно указывать конкретный IP адрес или же диапазон IP адресов. В этом параметре можно использовать маски. Адреса задаются в формате: IP/mask, где IP – IP-адрес сети или узла, mask – маска сети, которая задаётся как десятичное число, которое равняется числу единиц в двоичной маске. Например, для сетей класса C /24 (число 24 эквивалентное шестнадцатеричной маске FF.FF.FF.0), для сетей класса B - /16, также можно использовать маску /32 и другие. Здесь может применяться и отрицание (инвертирование), обозначаемое символом “!” (Например: !127.0.0.1). Если вместо IP адреса указать ключевое слово any, то это будет подразумевать абсолютно все хосты. Для указания списка можно использовать перечисление IP адресов через “,” содержащихся в квадратных скобках. (Например: [212.116.1.1,10.10.1.0/24]). В качестве IP-адреса можно использовать переменные HOME_NET, EXTERNAL_NET и другие.
Порты
После IP адреса указывается номер порта, с которого отсылаются данные и на который приходят. Можно указать диапазон портов: 1:1024 (все порты в диапазоне от 1 до 1024 включая 1 и 1024). Часто используется оператор отрицания “!” (Например: !123:321 исключает все порты в диапазоне от 123 до 321). Если опущен один из параметров диапазона, например “:321” или “123:”, то пропускаемый параметр принимает крайнее значение общего количества портов, то есть 0 или 65535.
Операторы направления
Оператор направления служит для обозначения направления траффика, для которого применяется правило, и обозначается “->” (знаком минуса и закрывающей угловой скобкой). IP-адрес и номер порта слева от оператора определяют источник траффика, а справа от него - назначение. Существует также оператор так называемой “двунаправленности” и обозначается “<>” (двумя угловыми скобками). Этот оператор говорит Snort рассматривать указанные пары адресов и портов в обе стороны, вне зависимости от того, кто является источником, а кто – получателем. Это удобно в тех случаях, когда нужно сохранить траффик от обеих сторон, например, в Telnet или POP3 сессиях. Важно отметить, что оператор “<-“ не существует.
Опции правила
Все опции можно разделить на четыре большие категории:
- general (meta-data) - данные опции предоставляют информацию о правиле, но никак не влияют на обнаружение;
- payload - данные опции позволяют искать информацию внутри полезной нагрузки (данных пользователя) пакетов и могут быть взаимосвязаны;
- non-payload - данные опции позволяют искать информацию внутри служебной (управляющей) информации о пакете (заголовке);
- post-detection - данные опции являются определёнными триггерами, указывающими задачи, которые необходимо осуществить после срабатывание правила.
General (meta-data)
-
msg
Указывает сообщение, текстовое описание сигнала тревоги (для экранирования используется символ “"), которое будет выведено или же записано, используя систему журналирования.
Синтаксис:
msg:"<message text>";
Примеры:
-
reference
Указывает ссылки на online системы идентификации атак. Значениями этого поля могут быть ссылки на ресурсы bugtraq, cve, nessus, arachnids, mcafee и другие url. Идентификация осуществляется по SID номерам.
Поддерживаемые системы:
- bugtraq: http://www.securityfocus.com/bid/
- cve: http://cve.mitre.org/cgi-bin/cvename.cgi?name=
- nessus: http://cgi.nessus.org/plugins/dump.php3?id=
- arachnids: (в данный момент не работает) http://www.whitehats.com/info/IDS
- mcafee: http://vil.nai.com/vil/content/v_
- osvdb: http://osvdb.org/show/osvdb/
- msb: http://technet.microsoft.com/en-us/security/bulletin/
- url: http://
Синтаксис:
reference:<id system>, <id>; [reference:<id system>, <id>;]
Примеры:
alert tcp any any -> any 7070 (msg:"IDS411/dos-realaudio"; \ flags:AP; content:"|fff4 fffd 06|"; reference:arachnids,IDS411;)
alert tcp any any -> any 21 (msg:"IDS287/ftp-wuftp260-venglin-linux"; \ flags:AP; content:"|31c031db 31c9b046 cd80 31c031db|"; \ reference:arachnids,IDS287; reference:bugtraq,1387; \ reference:cve,CAN-2000-1574;)
-
gid
Ключевое слово gid (generator id) используется для идентификации того, какая часть Snort генерирует событие, когда срабатывает конкретное правило. Например, gid равный 1 ассоциируется с подсистемой правил, а различные gid свыше 100 предназначены для определённых препроцессоров и декодеров. Опция gid является необязательной, и если она не определена в правиле, то по умолчанию она устанавливается равной 1, и правило будет являться частью общей подсистемы правил. Чтобы избежать потенциальных конфликтов с gid, определёнными в Snort, рекомендуется использовать значения начиная с 1000000. Для общих правил не рекомендуется использовать ключевое слово gid. Данная опция должна быть использована с опцией sid. Файл “etc/gen-msg.map” содержит больше информации о gid препроцессоров и декодеров.
Синтаксис:
gid:<generator id>;
Примеры:
alert tcp any any -> any 80 (content:"BOB"; gid:1000001; sid:1; rev:1;)
-
sid
Ключевое слово sid (Snort id или иногда упоминается как signature id) используется для уникальной идентификации правил Snort. По значению его аргумента можно легко идентифицировать правило. Данное ключевое слово должно использоваться вместе с ключевым словом rev. Файл “sid-msg.map” содержит соответствие предупреждающих сообщений и идентификаторов правил Snort. Значения аргумента:
< 100 зарезервировано разработчиками 100 - 999.999 использованы в правилах, уже включенных в дистрибутив Snort
= 1.000.000 можно использовать для собственных правил
Синтаксис:
sid:<snort rules id>;
Примеры:
alert tcp any any -> any 80 (content:"BOB"; sid:1000983; rev:1;)
-
rev
Указывает значение версии правила. С помощью REV интерпретатор правил Snort определяет версию написанного правила. Этот параметр используется в паре с SID.
Синтаксис:
rev:<revision integer>;
Примеры:
alert tcp any any -> any 80 (content:"BOB"; sid:1000983; rev:1;)
-
classtype
Используется для присвоения категории атаки, к которой необходимо отнести правило, являющееся частью более общего класса атак. Snort предоставляет набор классов, которые используются предоставляемыми правилами по умолчанию. Классификация атак позволяет лучше организовать события, производимые Snort. Классификация атак представлена в файле “classification.conf”. В файле используется следующий синтаксис для каждой записи:
config classification: <имя класса>,<описание класса>,<приоритет по умолчанию>
Приоритет 1 (high) является наиболее высоким, а 4 (very low) - самым низким. Также классификация типов атак представлена в таблице:
Тип класса Описание Приоритет attempted-admin Попытка получения прав администратора high attempted-user Попытка получения прав пользователя high inappropriate-content Обнаружено неприемлемое (несоответствующее) содержание high policy-violation Потенциальное нарушение корпоративной конфиденциальности high shellcode-detect Обнаружен исполняемый код high successful-admin Успешное получение прав администратора (повышение привилегий) high successful-user Успешное получение прав пользователя (повышение привилегий) high trojan-activity Обнаружена активность сетевой троянской программы high unsuccessful-user Неудачная попытка получения прав пользователя high web-application-attack Атака на Web-приложение high attempted-dos Предпринята попытка атаки отказ в обслуживании (DoS) medium attempted-recon Попытка утечки информации (разведка) medium bad-unknown Потенциально нежелательный траффик medium default-login-attempt Попытка входа с помощью стандартного логина/пароля medium denial-of-service Обнаружена атака отказ в обслуживании (DoS) medium misc-attack Прочие атаки medium non-standard-protocol Обнаружено использование нестандартного протокола или нестандартное событие medium rpc-portmap-decode Decode of an RPC Query (Декодирован удалённый вызов процедуры (RPC)) (Обнаружен запрос RPC) medium successful-dos Успешная DOS-атака medium successful-recon-largescale Крупномасштабная утечка информации medium successful-recon-limited Утечка информации medium suspicious-filename-detect Обнаружено подозрительное имя файла medium suspicious-login Обнаружена попытка входа с подозрительным логином medium system-call-detect Обнаружено обращение к ядру системы (system call) (Обнаружен системный вызов) medium unusual-client-port-connection Клиент использует нестандартный порт medium web-application-activity Доступ к потенциально уязвимому Web-приложению medium icmp-event Общее событие ICMP low misc-activity Прочая активность low network-scan Обнаружена попытка сканирования сети low not-suspicious Не являющийся подозрительным траффик low protocol-command-decode Generic Protocol Command Decode (Обнаружена попытка шифрования) (Обнаружена обычная команда протокола) low string-detect Обнаружена подозрительная строка low unknown Неизвестный траффик low tcp-connection Обнаружено TCP соединение very low Синтаксис:
classtype:<class name>;
Примеры:
alert tcp any any -> any 25 (msg:"SMTP expn root"; flags:A+; content:"expn root"; nocase; classtype:attempted-recon;)
Предупреждения:
Опция classtype может иметь только те значения для классификации, которые определены в
snort.conf
с помощьюconfig classification
. Snort предоставляет стандартный набор классификации в файлеclassification.config
, который используется в поставляемых наборах правил. -
priority
Задаёт правилам уровень важности. Возможно использовать параметр priority вместе с classtype, при этом изменится уровень приоритета параметра classtype.
Синтаксис:
priority:<priority integer>;
Примеры:
alert tcp any any -> any 80 (msg:"WEB-MISC phf attempt"; flags:A+; content:"/cgi-bin/phf"; priority:10;)
alert tcp any any -> any 80 (msg:"EXPLOIT ntpdx overflow"; dsize:>128; classtype:attempted-admin; priority:10;)
-
metadata
Позволяет автору правил включать дополнительную информацию о правиле, как правило, в формате “ключ-значение”. Ключи и значения тега metadata перечислены в таблице ниже:
Ключ Описание Формат значения engine Указывает правило библиотеки общего пользования (Indicate a Shared Library Rule) "shared" soid GID и SID правила библиотеки общего пользования (Shared Library Rule Generator and SID) sid service Идентификатор сервиса на основе цели (Target-Based Service Identifier) "http" Отличные от указанных в таблице ключи Snort фактически игнорирует, поэтому они могут быть записаны в свободной форме в формате “ключ-значение”. Несколько ключей подряд разделяются запятыми, а ключи и значения отделяются между собой пробелом.
Синтаксис:
metadata:key1 value1; metadata:key1 value1, key2 value2;
Примеры:
alert tcp any any -> any 80 (msg:"Shared Library Rule Example"; metadata:engine shared; metadata:soid 3|12345;)
alert tcp any any -> any 80 (msg:"Shared Library Rule Example"; metadata:engine shared, soid 3|12345;)
alert tcp any any -> any 80 (msg:"HTTP Service Rule Example"; metadata:service http;)
Payload
-
content
Позволяет устанавливать условие в правила, которые ищут определённое содержание (контент) в полезной нагрузке пакетов. Условия могут содержать как двоичные данные, так и текстовые. Двоичные данные должны быть заключены между вертикальными чертами “|” в виде байт-кода. Байт-код представляет двоичные данные в виде шестнадцатеричных чисел. В одном правиле может быть указано несколько content-условий. “!” - модификатор отрицания. Если правилу предшествует модификатор отрицания, то правило срабатывает на пакетах, которые не содержат заданный контент.
Ключевое слово content имеет ряд модификаторов, которые изменяют поведение ранее указанного content. Список модификаторов:
- nocase
- rawbytes
- depth
- offset
- distance
- within
- http_client_body
- http_client_body
- http_cookie
- http_raw_cookie
- http_header
- http_raw_header
- http_method
- http_uri
- http_raw_uri
- http_stat_code
- http_stat_msg
- fast_pattern
Синтаксис:
content:[!]"<content string>";
Примеры:
alert tcp any any -> any 139 (content:"|5c 00|P|00|I|00|P|00|E|00 5c|";)
alert tcp any any -> any 80 (content:!"GET";)
Предупреждения:
Необходимо экранировать следующие символы:
; \ "
-
protected_content
Имеет схожую функциональность с content, однако работает несклько иным образом. Основное преимущество ключевого слова protected_content над content в том, что оно позволяет скрыть целевой контент, раскрывая только хэш-сумму (дайджест) указанного контента. Как и в случае content, основная цель - сопоставить строки определённых байтов. Поиск осуществляется путём хэширования частей входящих сообщений и сравнения полученных результатов с предоставляемой в условии хэш-суммой. Из-за чего проделывается очень большой объём вычислений.
На данный момент с ключевым словом protected_content возможно использование алгоритмов хэширования MD5, SHA256, и SHA512. Алгоритм хэширования должен быть указан в правиле с использованием ключевого слова hash, если он не задан по умолчанию в конфигурации Snort. Кроме того, вместе с protected_content обязательно должен быть указан модификатор length, чтобы указать длину исходных данных.
Как и в случае content, в правиле возможно использование нескольких условий protected_content. В правиле допускается совместное использование content и protected_content. Также в protected_content можно использовать модификатор отрицания “!”.
Ключевое слово protected_content имеет те же модификаторы, что и content, за исключением следующих:
Синтаксис:
protected_content:[!]"<content hash>", length:orig_len[, hash:md5|sha256|sha512];
Примеры:
Следующие правила срабатывают на строке “HTTP”.
alert tcp any any <> any 80 (msg:"MD5 Alert"; protected_content:"293C9EA246FF9985DC6F62A650F78986"; hash:md5; offset:0; length:4;)
alert tcp any any <> any 80 (msg:"SHA256 Alert"; protected_content:"56D6F32151AD8474F40D7B939C2161EE2BBF10023F4AF1DBB3E13260EBDC6342"; hash:sha256; offset:0; length:4;)
-
Используется для указания алгоритма хэширования, который будет использоваться при сопоставлении с образцом, заданным в условии protected_content. Если в конфигурации Snort не указан алгоритм по умолчанию, то необходимо указать используемый алгоритм в правиле с protected_content. На данный момент поддерживаются следующие алгоритмы хэширования: MD5, SHA256, и SHA512.
Синтаксис:
hash:[md5|sha256|sha512];
-
Используется для задания исходной длины контента, для которого задана хэш-сумма (дайджест) в protected_content. Указанное значение должно быть в интервале от 0 до 65536.
Синтаксис:
length:[<original_length>];
-
Является модификатором для располагающегося до него ключевого слова content, указывая ему сравнивать содержание без учета регистра символов.
Синтаксис:
nocase;
Примеры:
alert tcp any any -> any 21 (msg:"FTP ROOT"; content:"USER root"; nocase;)
-
Ключевое слово rawbytes является модификатором для располагающегося до него ключевого слова content, позволяя работать с необработанными данными пакета, игнорируя любое декодирование, произведённое с помощью препроцессоров.
HTTP Inspect имеет набор ключевых слов http_raw_cookie, http_raw_header, http_raw_uri и др. для работы с необработанными данными, которые сопоставляют определённые части HTTP запросов и ответов. С данными ключевыми словами использовать rawbytes не нужно, так как эти условия по умолчанию работают с необработанными данными.
Большинство других препроцессоров по умолчанию используют декодированные/нормализованные данные для сопоставления с образцом. Поэтому для сопоставления с произвольными необработанными данными из пакета необходимо указывать ключевое слово rawbytes.
Синтаксис:
rawbytes;
Примеры:
alert tcp any any -> any 21 (msg:"Telnet NOP"; content:"|FF F1|"; rawbytes;)
-
Синтаксис:
Примеры:
Предупреждения:
-
Синтаксис:
Примеры:
Предупреждения:
-
Синтаксис:
Примеры:
Предупреждения:
-
Синтаксис:
Примеры:
Предупреждения:
-
Ключевое слово http_client_body ограничивает поиск по телу запроса HTTP-клиента. Ключевое слово http_client_body является модификатором для располагающегося до него ключевого слова content. Размер области данных, по которым производится поиск, зависит от опции post_depth в HttpInspect. Паттерн с данным ключевым словом не будет работать, если post_depth в установлена “-1”.
Синтаксис:
http_client_body;
Примеры:
alert tcp any any -> any 80 (content:"ABC"; content:"EFG"; http_client_body;)
-
Синтаксис:
Примеры:
Предупреждения:
-
Синтаксис:
Примеры:
Предупреждения:
-
Ключевое слово http_header ограничивает поиск по извлечённым полям заголовка запроса HTTP-клиента или ответа HTTP-сервера (определяется в конфигурации HttpInspect). Ключевое слово http_method является модификатором для располагающегося до него ключевого слова content. Извлечённые поля заголовка можно нормализовать, определив это в конфигурации HttpInspect.
Синтаксис:
http_header;
Примеры:
alert tcp any any -> any 80 (content:"ABC"; content:"EFG"; http_header;)
-
Синтаксис:
Примеры:
Предупреждения:
-
Ключевое слово http_method ограничивает поиск по извлечённому методу из запроса HTTP-клиента. Ключевое слово http_method является модификатором для располагающегося до него ключевого слова content.
Синтаксис:
http_method;
Примеры:
alert tcp any any -> any 80 (content:"ABC"; content:"GET"; http_method;)
-
Ключевое слово http_uri ограничивает поиск по нормализованному полю URI запроса. Ключевое слово http_uri является модификатором для располагающегося до него ключевого слова content. Использование опции http_uri после content эквивалентно опции uricontent.
Синтаксис:
http_uri;
Примеры:
alert tcp any any -> any 80 (content:"ABC"; content:"EFG"; http_uri;)
-
Ключевое слово http_raw_uri ограничивает поиск по ненормализованному полю URI запроса. Ключевое слово http_raw_uri является модификатором для располагающегося до него ключевого слова content.
Синтаксис:
http_raw_uri;
Примеры:
alert tcp any any -> any 80 (content:"ABC"; content:"EFG"; http_raw_uri;)
-
Ключевое слово http_stat_code ограничивает поиск по извлечённому полю пояснения к статус коду ответа HTTP-сервера. Ключевое слово http_stat_code является модификатором для располагающегося до него ключевого слова content. Поле пояснения к статус коду будет извлечено, если только задана опция extended_response_inspection в HttpInspect.
Синтаксис:
http_stat_code;
Примеры:
alert tcp any any -> any 80 (content:"ABC"; content:"200"; http_stat_code;)
-
Синтаксис:
Примеры:
Предупреждения:
-
http_encode
Синтаксис:
Примеры:
Предупреждения:
-
Синтаксис:
Примеры:
Предупреждения:
-
uricontent
Синтаксис:
Примеры:
Предупреждения:
-
urilen
Синтаксис:
Примеры:
Предупреждения:
-
isdataat
Синтаксис:
Примеры:
Предупреждения:
-
pcre
Ключевое слово pcre позволяет использовать Perl-совместимые регулярные выражения PCRE.
Синтаксис:
pcre:[!]"(/<regex>/|m<delim><regex><delim>)[ismxAEGRUBPHMCOIDKYS]";
Примеры:
alert tcp any any -> any 80 (content:"/foo.php?id="; pcre:"/\/foo.php?id=[0-9]{1,10}/iU";)
Предупреждения:
-
pkt_data
Синтаксис:
Примеры:
Предупреждения:
-
file_data
Синтаксис:
Примеры:
Предупреждения:
-
base64_decode
Синтаксис:
Примеры:
Предупреждения:
-
base64_data
Синтаксис:
Примеры:
Предупреждения:
-
byte_test
Синтаксис:
Примеры:
Предупреждения:
-
byte_jump
Синтаксис:
Примеры:
Предупреждения:
-
byte_extract
Синтаксис:
Примеры:
Предупреждения:
-
byte_math
Синтаксис:
Примеры:
Предупреждения:
-
ftpbounce
Синтаксис:
Примеры:
Предупреждения:
-
asn1
Синтаксис:
Примеры:
Предупреждения:
-
cvs
Синтаксис:
Примеры:
Предупреждения:
Оставить комментарий