Теперь необходимо пояснить еще несколько аспектов языка фильтров TCPdump. Этот язык не является сложным по сравнению с конструкциями и операциями, доступными в других языках, например С или Perl. Однако часто для описания полей, которые выходят за рамки целых байтов, приходится возвращаться к основам языка ассемблера.

Использование TCPdump не вызывает никаких затруднений, когда для хранения значения поля используется целое число байтов, и необходимо исследовать все 8 бит этих байтов. Для объединения нескольких байтов после значения смещения можно указать нужную длину в байтах, но что делать, если нужно исследовать только некоторые биты или диапазон битов? Другими словами, что делать, если не нужно проверять значение всего байта? Эта задача несколько сложнее и требует элементарных навыков работы с двоичными и шестнадцатеричными данными.

Выбор и отбрасывание отдельных битов

Рассмотрим еще раз структуру IP-заголовка, и в частности его первый байт, который состоит из двух 4-битовых полей. Каждое из этих полей является полубайтом (nibble). Как быть, если нужно исследовать только значение поля длины IP-заголовка, не проверяя значения поля “Версия”? Нужно выбрать только значение младшего полубайта, отбросив значение старшего. По существу, четыре бита старшего полубайта должны считаться равными 0. Такой метод позволит при исследовании первого байта IP-заголовка проверять значения только младшего полубайта. Сейчас мы рассмотрим все это подробнее.

Вспомним логические (булевы) арифметические операции. Наверняка, у некоторых читателей вырвался невольный стон. Лично я еще не встречал человека, которому бы нравились таблицы истинности, но, к сожалению, ничего не поделаешь и придется воскресить в памяти действия с логическим оператором И (табл. 12.1).

Таблица 12.1. Таблица истинности для оператора И

Бит А

и

Бит В

Результат

0

0

0

1

0

0

0

1

0

1

1

I

В этой таблице представлены все возможные значения двух битов и результаты их логического умножения (оператор И). Результат будет равен 1, только когда оба бита равны 1. Какое это имеет отношение к фильтрам ТСРс1итр? Вспомните: нам ведь нужно, чтобы все биты старшего полубайта первого байта 1Р-заголовка хранили значение 0. Необходимо выполнить логическое умножение битов старшего полубайта на 0 (и этот полубайт будет отброшен), а битов младшего полубайта на 1 (и значения битов этого полубайта останутся без изменений).

Посмотрим, как это сделать. На рис. 12.2 в двух прямоугольниках (по 4 бит) указаны значения битов реального 1Р-заголовка. Исследуем значение дейтаграммы. Значение старшего полубайта равно 0100, где 1 соответствует 22, что в результате дает 4. Это стандартное значение версии протокола 1Р. Значение младшего полубайта определяется как 2~ + 2° = 5. Это длина 1Р-заголовка. Но это значение представлено в виде 32-битового слова, и для его преобразования в байты его следует умножить на 4. Таким образом, длина этого заголовка равна 20 байт, что является стандартным значением для заголовка без параметров.

Рис. 12.2. Побитовое маскирование

Создание маски

Вернемся к задаче отбрасывания четырех битов старшего полубайта. На рис. 12.2 строка, указанная ниже значений битов действительной 1Р-дейтаграмммы, представляет собой маску. Маска - это байт, биты которого будут использованы при операции логического умножения с соответствующими битами нулевого байта 1Р-заголовка. При этом мы добиваемся “отбрасывания” значений старшего полубайта и сохранения значений младшего полубайта. Начнем умножение слева направо. Самый старший бит нулевого байта 1Р-заголовка хранит значение 0, соответствующий бит маски тоже равен 0. Естественно, что результат логического умножения двух битов тоже будет равен 0. Если при логическом умножении хотя бы одно из значений равно 0, то результат всегда будет равен 0. Согласно этому принципу все биты старшего полубайта при умножении на биты маски получат значение 0 - 0 0 0 0.

Поскольку нельзя создать маску только для части байта, нужно маскировать и младший полубайт, сохранив при этом его значение. Снова начнем со старшего бита (крайнего слева), значение которого 0, а значение соответствующего бита маски - 1. Операция И для значений двух битов дает результат 0, то есть оригинальное значение сохраняется. Аналогично умножаем следующую 1 на 1. Таким образом, маска, состоящая из одних 1, позволяет сохранить значения битов младшего полубайта. Таким образом наша цель достигнута - сохранено только значение поля длины 1Р-дейтаграммы. Нам пришлось применить маску, так как часть байта анализировать нельзя. Прежде чем приступать к изучению методов создания самих фильтров, рассмотрим еще одну тему. Как заставить ТСРсІитр выполнить операцию И, а также как задать маску?

Прежде всего нужно записать значение маски в виде двух шестнадцатеричных символов. Например, 0000 1111 соответствует 0x0і. Приставка Ох указывает

ТСРсІитр, что это значение шестнадцатеричное (по умолчанию ТСРсІитр работает в десятичной системе счисления). Теперь запишем созданную часть фильтра, ір [0] & ОхС^

На данный момент этот фильтр указывает на необходимость выполнить логическую операцию И для значений нулевого байта 1Р-заголовка и шестнадцатеричного числа (Ж

Выводы

Рассмотрев нулевой байт 1Р-заголовка, мы выполнили логическое умножение значения этого байта со значением ОхОґ, что позволило сохранить только значение поля длины IP-заголовка. Зачем выделять значение этого поля? Например, для проверки наличия параметров IP-дейтагараммы. Стандартный размер IP-дейтаграммы равен 20 байт или пяти 32-битовым словам. Это означает, что IP-заголовок с такими потенциально опасными параметрами, как маршрутизация от источника, будет иметь длину больше значения 5, указанного в этом поле. Параметры IP-дейтаграмм в основном используются только хакерами с вредоносными целями, поэтому их установку желательно контролировать. Согласно синтаксису написания фильтров TCPdump необходимо указывать оператор отношения и значение. Итог создания фильтра, который задает сигнатуру IP-дейтаграммы без установленных параметров, будет выглядеть следующим образом, ip [0] & OxOf > 5

Вот и все. Этот материал может показаться довольно сложным, требующим фундаментальных теоретических знаний, но на самом деле все станет намного проще после недолгих практических занятий. Конечно, придется внимательно изучить все аспекты создания фильтров, но в результате вы сможете исследовать любое поле и даже отдельные биты IP-дейтаграмм. Не все системы обнаружения вторжений обладают такими возможностями. TCPdump позволяет анализировать и сохранять нужные данные с максимальной точностью. Кроме того, не многие владельцы систем обнаружения вторжений могут этим похвастаться. Именно поэтому следует ближе познакомится с программой TCPdump и ее фильтрами.

Правила создания фильтров tcpdump | Обнаружение нарушений безопасности в сетях | Ip-фильтры программы tcpdump


Обнаружение нарушений безопасности в сетях



Новости за месяц

  • Июнь
    2021
  • Пн
  • Вт
  • Ср
  • Чт
  • Пт
  • Сб
  • Вс