Опции проверки содержимого пакетов (payload)
content
Ключевое слово content обеспечивает поддержку одной из важнейших функций Snort – проверку содержимого пакетов. Эта опция позволяет пользователю создавать правила для поиска в пакетах определенной информации и выполнения тех или иных действий при ее обнаружении. Для проверки содержимого пакетов используется функция поиска по шаблону Boyer-Moore. Если заданная последовательность данных обнаружена в поле содержимого пакета, проверка считается успешной и выполняется остальная часть правила. Следует помнить, что при поиске учитывается регистр символов.
Аргумент опции может содержать как текст, так и двоичные данные (обычно они указываются между парой символов | и задаются последовательностью шестнадцатеричных представлений байтов). Ниже показан пример задания строки поиска, содержащей текст и бинарные данные.
alert tcp any any -> any 139 (content:”|5c00|P00|I|00|E|00 5c|”;)
Отметим, что в одном правиле может присутствовать более одной опции content, что позволяет снижать уровень ложных срабатываний за счет более точного задания искомых последовательностей.
Если перед опций помещен знак отрицания (!), правилу будут соответствовать пакеты, не содержащие указанных данных. Такая возможность полезна для генерации сигналов в случае обнаружения пакетов, не содержащих заданной последовательности.
Формат
content: [!] "<строка поиска>";
Пример задания смешанной (текст и бинарные данные) был приведен выше, а здесь дается пример поиска текстовой строки.
alert tcp any any -> any 80 (content:!”GET”:)
Изменение параметров поиска
Ключевое слово content поддерживает множество опций-модификаторов, которые изменяют поведение системы поиска. Список модификаторов приведен ниже: 68. depth (размер области поиска) 69. offset (смещение начало поиска от начала поля данных) 70. distance (количество пропускаемых байтов после первого найденного соответствия) 71. within (размер области поиска после первого найденного соответствия) 72. nocase (без учета регистра символов) 73. rawbytes (поиск в необработанных данных)
nocase
Ключевое слово nocase позволяет задать программе Snort, что следует осуществлять поиск, заданный предыдущей опцией content без учета регистра символов.
Формат
nocase;
Пример поиска без учета регистра символов показан ниже.
alert tcp any any _ any 21 (msg:”FTP ROOT”; content:”USER root”; nocase;)
rawbytes
Ключевое слово rawbytes позволяет искать в пакете необработанные (raw) данные, игнорирую декодирование, выполняемое препроцессорами. Ключевое слово изменяет поиск данных, указанных предыдущей опцией content.
Формат
rawbytes;
Приведенный пример показывает правило поиска необработанных данных вместо результатов декодирования препроцессором telnet.
alert tcp any any -> any 21 (msg: "Telnet NOP"; content: "|FF F1|"; rawbytes;)
depth
Ключевое слово depth показывает размер блока данных из пакета, в котором осуществляется поиск, заданных предыдущей опцией content. Например, при задании глубины 5 программ Snort будет просматривать в поисках заданной последовательности только первые 5 байтов поля данных в пакете.
Ключевое слово depth меняет режим поиска для опции keyword, указанной перед depth.
Формат
depth: <целое число>;
Пример использования опции depth показан ниже.
alert tcp any any -> any 80 (content: “/cgi-bin/phf”; offset: 4; depth:20;)
offset
Ключевое слово offset позволяет задать смещение в поле данных пакет, с которого начинается поиск последовательности, заданной предыдущей опцией content. Например, offset 5 будет говорить программе Snort о необходимости начинать поиск, пропустив первые 5 байтов поля данных.
Ключевое слово offset меняет режим поиска для опции keyword, указанной перед offset.
Пример использования опций content, offset и depth был показан выше. В этом примере программа будет искать текст /cgi-bin/phf в 20 байтах пакета HTTP после пропуска первых 5 байтов поля данных.
Формат
offset: <целое число>;
distance
Ключевое слово distance показывает программе Snort сколько байтов нужно пропустить после найденной предыдущей опцией content строки поиска для начало поиска последовательности, заданной другой опцией content. Например, правило
alert tcp any any -> any any (contenet: ”ABC”; content: “DEF”; distance: 1;)
позволяет находить в поле данных пакета строки вида ABC?DEF (знак вопроса означает любой символ)
Формат
distance: <число байтов>;
within
Ключевое слово within размер области поиска для опции content от конца подстроки, найденной предыдущей опцией content. Например, правило
alert tcp any any -> any any (contenet: ”ABC”; content: “DEF”; distance: 1;)
ограничивает поиск подстроки DEF 10 байтами после найденной в поле данных подстроки ABC.
Формат
within: <число байтов>;
uricontent
Опция uricontent служит для поиска в нормализованных полях запросов URI. Это означает, что при создании правил, включающих нормализуемые данные (например, %2f или обход каталогов - directory traversal), эти правила не следует использовать.
Например, URI
/scripts/..%c0%af/winnt/system32/cmd.exe?/c+verend{verbatim}
будет нормализоваться в
begin{verbatim}/winnt/system32/cmd.exe?/c+ver
Нормализованная форма URI
begin{verbatim} /cgi-bin/aaaaaaaaaaaaaaaaaaaaaaaaaa/..%252fp%68f? end{verbatim}
будет иметь вид
begin{verbatim}/cgi-bin/phf?
При создании правил uricontent укажите содержимое, которое вы хотите найти в контексте нормализованного URI. Например, если Snort нормализует обход каталогов (directory traversal), не включайте directory traversal.
Вы можете создавать правила поиска в ненормализованном содержимом пакетов с помощью опции content (см. выше).
Эта опция использует тот же набор модификаторов, который применяется для описанной выше опции content.
Эта опция работает совместно с препроцессором HTTP Inspect.
Формат
uricontent:[!];
isdataat
Эта опция позволяет проверить наличие данных в заданном участке пакета (возможно относительно завершения подстроки, найденной с помощью опции content).
Формат
isdataat:[,relative];
Например, правило
alert tcp any any -> any 111 (content:"PASS"; isdataat:50,relative;
content:!"|0a|"; distance:0;)
будет обеспечивать поиск в поле данных пакета подстроки PASS и после ее обнаружения будет проверять наличие в пакете по крайней мере еще 50 байтов, после чего проверит отсутствие символа новой строки в 50 байтах после PASS.
pcre
Ключевое слово pcre позволяет создавать правила, содержащие регулярные выражения, совместимые с языком perl. Более детальную информацию об использовании таких регулярных выражений вы найдете на сайте http://www.pcre.org.
Формат
pcre:[!]"(//|m)[ismxAEGRUB]";
Модификаторы в конце правила устанавливают флаги для регулярного выражения.
Таблица 3: Модификаторы, совместимые с Perl
i
|
Регистр символов не принимается во внимание
|
s
|
Включать символы новой строки в dot metacharacter
|
m
|
По умолчанию строка трактуется как одна большая последовательность символов. С помощью специальных символов ^ и $ можно задать проверку соответствия для начала или конца строки. При наличии модификатора m символы ^ и $ задают поиск соответствия в начале или в конце каждой новой строки (относительно символа перевода строки в буфере), а также в начале и в конце буфера.
|
x
|
Символы пробелов в шаблоне поиска игнорируются за исключением случаев использования перед таким символом escape-символа или включения пробела в символьный класс (character class)
|
Таблица 4: Модификаторы, совместимые с PCRE
A
|
Наличие заданной подстроки проверяется только в начале буфера (аналогично ^ )
|
E
|
Задает для $ поиск соответствия только в самом конце строки. Без модификатора E символ $ будет задавать также поиск перед символом новой строки (если таковой имеется) в конце буфера.
|
G
|
Инвертирует трактовку параметров количества повторов (quantifier) так, что если по умолчанию они не являются “жадными” (greedy - число повторов может быть любым, вплоть до максимального) установка знака вопроса (?) вслед за параметром, меняет “состояние жадности”.
|
Таблица 5: Модификаторы Snort
R
|
Задает поиск соответствия относительно конца предыдущего найденного соответствия (аналогично опции distance:0;)
|
U
|
Задает поиск в декодированном буфере URI (аналогично uricontent)
|
B
|
Отключает использование декодированного буфера (аналогично rawbytes)
|
Модификаторы R и B не следует использовать совместно.
Приведенный ниже пример задает нечувствительный к регистру символов поиск в поле данных подстроки BLAH.
alert ip any any -> any any (pcre:"/BLAH/i";)
byte_test
Эта опция позволяет сравнить байт с заданным значением. Опция может использоваться применительно к двоичным значениям или их символьному представлению.
Формат
byte_test: , [!], ,
[,relative] [,] [,, string];
Таблица 6: Параметры опции byte_test
Параметр
|
Описание
|
bytes_to_convert
|
Число байтов, которые могут извлекаться из пакета
|
operator
|
Операция, выполняемая для сравнения байта с заданным значением:
|
value
|
Значение, с которым выполняется сравнение
|
offset
|
Смещение в поле данных пакета, с которого начинается операция сравнения
|
relative
|
Задает отсчет смещения от конца предыдущего найденного соответствия
|
endian
|
Задает порядок следования:
-
big - big endian (старший разряд слева, используется по умолчанию)
-
little - little endian (старший разряд справа)
|
string
|
Указывает, что данные в пакете представлены в символьном формате
|
number type
|
Задает тип считываемых значений:
|
Любой из операторов можно использовать со знаком инверсии (!). При использовании знака ! без оператора в качестве последнего принимается оператор равенства (=).
Ниже показано несколько примеров использования опции byte_test.
alter udp $EXTERNAL_NET any -> $HOME_NET any
(msg:”AMD procedure 7 plog overflow “;
content:”|00 04 93 F3|”;
content:”|00 00 00 07|”; distance 4; within 4;
byte_test: 4, >, 1000, 20, relative;)
alter tcp $EXTERNAL_NET any -> $HOME_NET any
(msg:”AMD procedure 7 plog overflow “;
content:”|00 04 93 F3|”;
content:”|00 00 00 07|”; distance 4; within 4;
byte_test: 4, >, 1000, 20, relative;)
alert udp any any -> any 1234
byte_test: 4, =, 1234, 0, string, dec;
msg: “got 1234!”;)
alert udp any any -> any 1235
byte_test: 3, =, 123, 0, string, dec;
msg: “got 123!”;)
alert udp any any -> any 1236
byte_test: 2, =, 12, 0, string, dec;
msg: “got 12!”;)
alert udp any any -> any 1237
byte_test: 10, =, 1234567890, 0, string, dec;
msg: “got 1234567890!”;)
alert udp any any -> any 1238
byte_test: 8, =, 0xdeadbeef, 0, string, hex;
msg: “got DEADBEEF!”;)
byte_jump
Опция byte_jump позволяет создавать простые правила считывания данных из пакетов с пропускам некоторого количества байтов, задаваемого значением поля в пакете. С помощью этой опции считывается размер части пакета, которую следует пропустить и считываются данные, расположенные после этой части.
Опция byte_jump сначала определяет размер пропускаемой области данных, преобразуя считанную из пакета информацию в целое число и потом пропускает соответствующее число байтов, устанавливая указатель, который будет использоваться для следующего считывания информации из пакета. Этот указатель называют detect offset end pointer или doe_ptr.
Формат
byte_jump: ,
[,relative] [,multiplier ] [,big] [,little][,string]
[,hex] [,dec] [,oct] [,align] [,from_beginning];
Таблица 7: Параметры опции byte_jump
Параметр
|
Описание
|
bytes_to_convert
|
Число байтов, считываемых из пакета.
|
offset
|
Смещение в поле данных пакета, с которого начинается обработка.
|
relative
|
Задает использование смещения относительно конца предыдущего найденного соответствия.
|
multiplier
|
Умножает количество вычисленных байтов на значение параметра <value> и пропускает полученное количество байтов.
|
big
|
Обрабатывает данные как big endian (старший разряд сначала – используется по умолчанию).
|
little
|
Обрабатывает данные как little endian (сначала младший разряд).
|
string
|
Данные в пакете представлены в виде текстовой строки.
|
hex
|
Преобразовать строку данных в шестнадцатеричное значение.
|
dec
|
Преобразовать строку данных в десятичное значение.
|
oct
|
Преобразовать строку данных в восьмеричное значение.
|
align
|
Округляет число конвертируемых байтов по следующей 32-битовой границе.
|
from_beginning
|
Задает отсчет пропускаемых байтов от начала поля данных пакета, а не от текущей позиции в пакете.
|
Ниже приведен пример использования опции byte_jump.
alert udp any any -> any 32770:34000 (content: “|00 01 86 B8|”;
content: “|00 00 00 01|”; distance: 4; within: 4;
byte_jump: 4, 12, relative, align;
byte_test: 4, >, 900, 20, relative;
msg: “statd format string buffer overflow”;)
regex
Взамен regex следует использовать опцию pcre.
content-list
Опция content-list устарела и ее не следует использовать.
Примечание:
|