Побітове маскування
Delphi site: daily Delphi-news, documentation, articles, review, interview, computer humor.
Тепер потрібно пояснити ще кілька аспектів мови фільтрів TCPdump. Ця мова не є складною порівняно з конструкціями та операціями, доступними в інших мовах, наприклад, С або Perl. Однак часто для опису полів, які виходять за межі цілих байтів, доводиться повертатися до основ мови асемблера.
Використання TCPdump не викликає жодних труднощів, коли для зберігання значення поля використовується ціла кількість байтів, і необхідно дослідити всі 8 біт цих байтів. Для об'єднання кількох байтів після значення зміщення можна вказати потрібну довжину в байтах, але що робити, якщо потрібно дослідити лише деякі біти чи діапазон бітів? Іншими словами, що робити, якщо не потрібно перевіряти значення всього байта? Це завдання дещо складніше і потребує елементарних навичок роботи з двійковими та шістнадцятковими даними.
Вибір та відкидання окремих бітів
Розглянемо ще раз структуру IP-заголовка, і, зокрема, його перший байт, який складається з двох 4-бітових полів. Кожна з цих полів є напівбайтом (nibble). Як бути, якщо потрібно дослідити лише значення поля довжини IP-заголовка, не перевіряючи значення поля Версія? Потрібно вибрати лише значення молодшого напівбайта, відкинувши значення старшого. Фактично, чотири біти старшого напівбайта повинні вважатися рівними 0. Такий метод дозволить щодо першого байта IP-заголовка перевіряти значення лише молодшого напівбайта. Зараз ми розглянемо все це докладніше.
Згадаймо логічні (бульові) арифметичні операції. Напевно, у деяких читачів вирвався мимовільний стогін. Особисто я ще не зустрічав людину, якій би подобалися таблиці істинності, але,на жаль, нічого не поробиш і доведеться воскресити у пам'яті дії з логічним оператором І (табл. 12.1).
Таблиця 12.1. Таблиця істинності для оператора І
У цій таблиці представлені всі можливі значення двох бітів та результати їхнього логічного множення (оператор І). Результат дорівнюватиме 1, тільки коли обидва біти дорівнюють 1. Яке це має відношення до фільтрів ТСРс1ітр? Згадайте: адже нам потрібно, щоб всі біти старшого напівбайта першого байта 1Р-заголовка зберігали значення 0. Необхідно виконати логічне множення бітів старшого напівбайта на 0 (і цей напівбайт буде відкинутий), а бітів молодшого напівбайта на 1 (і значення бітів цього напівбайта залишиться без змін).
Подивимося, як це зробити. На рис. 12.2 у двох прямокутниках (по 4 біт) вказано значення бітів реального 1Р-заголовка. Досліджуємо значення дейтаграми. Значення старшого напівбайта дорівнює 0100, де відповідає 2 2 , що в результаті дає 4. Це стандартне значення версії протоколу 1Р. Значення молодшого напівбайта визначається як 2
+ 2 ° = 5. Це довжина 1Р-заголовка. Але це значення представлено у вигляді 32-бітового слова, і для його перетворення на байти його слід помножити на 4. Таким чином, довжина цього заголовка дорівнює 20 байт, що є стандартним значенням для заголовка без параметрів.

Мал. 12.2. Побітове маскування
Повернемося до завдання відкидання чотирьох біт старшого напівбайта. На рис. 12.2 рядок, вказаний нижче значень бітів дійсної 1Р-дейтаграми, являє собою маску. Маска - це байт, біти якого будуть використані під час операції логічного множення з відповідними бітами нульового байта 1Р-заголовка. При цьому ми домагаємось “відкидання” значень старшого напівбайта та збереження значень молодшогонапівбайт. Почнемо множення зліва направо. Найстарший біт нульового байта 1Р-заголовка зберігає значення 0, відповідний біт маски теж дорівнює 0. Природно, що результат логічного множення двох бітів теж дорівнюватиме 0. Якщо при логічному множенні хоча б одне зі значень дорівнює 0, то результат завжди дорівнюватиме 0 p align="justify"> Відповідно до цього принципу всі біти старшого напівбайта при множенні на біти маски отримають значення 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 та її фільтрами.