Їдучи з черговою прочитаної лекції щодо захисту інформації, що став свідком цікавої картини, коли у молодої людини в захисній формі, який жебракував в переході метро, висіла на шиї табличку: «Грошей немає, а їсти хочеться». Зі схожою ситуацією мені постійно доводиться стикатися у своїй роботі. Співробітники багатьох організацій, цікавлячись пропонуються нашою компанією рішеннями щодо захисту інформації, заявляють, що «грошей немає, а захищатися хочеться». Напевно, ця ситуація знайома багатьом фахівцям, яким доводиться вибивати з боєм фінанси на придбання різних захисних засобів.

Це надихнуло мене на написання статті, основна мета якої показати, що навіть при відсутності або недостатньому фінансуванні можна побудувати досить надійну і ефективну систему інформаційної безпеки. Вона буде поступатися за своїми характеристиками комерційної системі, але зате на її побудову практично не потрібно витрачати гроші. Рамки статті не дозволяють розглянути всі аспекти створення «безкоштовної» системи захисту і тому я розгляну лише один з її аспектів — виявлення мережевих атак. Ця тема знайома мені ближче всього.

Як показує аналіз існуючих сьогодні систем виявлення атак на рівні мережі, всі вони використовують в якості джерела даних мережевий трафік, який аналізується на наявність в ньому ознак атак. Рідше, але також, можливо, в якості джерела інформації використовувати журнали реєстрації мережевого програмно-апаратного забезпечення (наприклад, маршрутизатора, брандмауера або аналізатора протоколів), що фіксує весь оброблюваний їм трафік.

Механізм функціонування системи виявлення атак на рівні мережі складається з 4 основних етапів:

захоплення пакетів;
фільтрація і складання фрагментів;
розпізнавання атак;
реагування на них.
В залежності від того, звідки беруться дані для аналізу (з мережевої карти, з компонентів мережевого обладнання або з журналу реєстрації), частина, що відповідає за захоплення пакетів, може бути реалізована по-різному, але всі інші частини (фільтрація, розпізнавання та реагування) залишаються без зміни.

Програмне забезпечення системи виявлення атак складається з наступних частин:

Ядро, яке здійснює взаємодію з мережним адаптером, частиною мережевого обладнання або журналом реєстрації, зберігають мережевий трафік. Дане ядро відповідає за захоплення даних. У складних системах виявлення атак, що використовують захоплення з мережевої карти, взаємодія здійснюється за допомогою драйвера самої системи виявлення атак, що підміняє драйвер операційної системи. Крім більш ефективної роботи, це дозволяє реалізувати ряд додаткових функцій, наприклад, стелс-режим, який не дозволяє виявити і атакувати саму систему виявлення атак. Більш прості системи виявлення, в т. ч. і створені самостійно, використовують і аналізують дані, одержувані від драйвера операційної системи. Це ядро по завданням практично повністю аналогічно ядра аналізатора протоколів.
Програмне забезпечення, яке здійснює декодування і аналіз протоколів, з якими працює мережевий адаптер, а також реалізує відповідну логіку роботи системи виявлення атак і реагування на них.
Захоплення мережевого трафіку
Т. к. областю розгляду даної статті є «самопальні» системи виявлення атак, то я не буду розглядати механізми захоплення мережевого трафіку, реалізовані в спеціальному програмно-апаратному забезпеченні, наприклад, в Cisco Catalyst 6000 IDS Module або Cisco Secure Integrated Software. Розглянемо більш прийнятний для самостійної реалізації механізм, який полягає в обробці трафіку, одержуваного з мережевої карти, яка може працювати в двох режимах:

в звичайному режимі, в якому мережева карта обробляє тільки пакети, призначені саме їй;
в «змішаному» або «безладному» (promiscuous) режимі, в якому мережева карта обробляє всі пакети, що передаються в мережевому сегменті.
Саме останній режим використовується для створення своєї системи виявлення атак. Щоб не ускладнювати собі життя, можна скористатися механізмами, пропонованими операційною системою. Ідеальною ОС в цьому випадку є сімейство Unix, що дозволяє без особливих проблем отримати доступ до мережного трафіку. Мало того Спільнота користувачів ОС Unix розробив велику кількість утиліт і бібліотек, які беруть на себе турботу про доступ до мережевої карти і захоплення трафіку. Наприклад, прослуховування і захоплення мережевого трафіку може бути здійснений з допомогою широко відомої бібліотеки libpcap (library for packet capture). Дана бібліотека розроблена для безлічі ОС сімейства Unix, яка дозволяє «захоплювати» (capture) і «прослуховувати» (sniffing) всі пакети, що передаються до поділюваних середовищ передачі даних (shared media). Багато системи виявлення атак для Unix використовують цю бібліотеку в своїй роботі (наприклад, SHADOW, Snort, NFR тощо), а багато розробники ще й оптимізували її для різних платформ, у тому числі існує версія і для платформи Windows, звана Winpcap. Замість libpcap можна використовувати бібліотеку libnet або її версію для Windows, що виконує аналогічні функції.

У випадку з обробкою журналів реєстрації мережевого устаткування проблем менше, т. к. мережевий трафік вже захоплений і навіть записаний в зручному для аналізу форматі.

Фрагмент журналу реєстрації маршрутизатора Cisco (для IOS 12.0 T)
Feb 25 21:14:38 134.161.1.101 21043: %SEC-6-IPACCESSLOGP: list ingress denied udp 38.29.63.57(4419) -> 134.161.67.71(34555), 1 packet

Фрагмент журналу реєстрації міжмережевого екрану Check Point Firewall-1
«421316» «29Dec2000» “9:32:16” «daemon» «localhost» «alert» «accept» “” «x.x.x.x x.x.x.x» «ip» “” “” “” “” “” “” “” “” “” “” “” «MAD» “additionals: attack=blocked_connection_port_scanning”

Все, що необхідно зробити в цьому випадку, — це виявити сліди несанкціонованої мережевий діяльності, за що і відповідає модуль фільтрації.

Фільтрація
Модуль фільтрації також як і модуль захоплення пакетів, не обов’язково писати самостійно, а можна реалізувати з допомогою вільно розповсюджуваних утиліт. Наприклад, ngrep або tcpdump. Дані системи засновані на механізмі захоплення необроблених (raw) пакетів мережевого трафіку і пропускати їх через синтаксичний аналізатор «регулярних виразів», який шукає в трафіку відповідність шаблону. Прикладом шаблону можна назвати: “/cgi-bin/phf”, який вказує на спробу використання уразливого CGI-скрипта PHF. Створюючи таку систему, ви аналізуєте відомі атаки, пишете для них сигнатуру, і додаєте їх в базу даних системи виявлення атак.

Відразу необхідно обмовитися, що можна не винаходити велосипед і використовувати вже наявні напрацювання в даній області. Наприклад, системи SHADOW, Snort або libnids. Вихідний код названих утиліт і бібліотек доступний в Internet. До них можна «прикрутити» щось, що вирішує завдання, але основне ядро залишається незмінним. За таким принципом йдуть багато незалежні розробники. Наприклад, до системи Snort існує дуже багато додаткових утиліт, розширюють її функціональність. До їх числа можна віднести:

Snort-panel і IDScenter — графічний інтерфейс до системи Snort;
Guardian і SnortSam — скрипти для зміни міжмережевих екранів IPCHAINS і VPN-1&Firewall-1 у разі виявлення атаки;
Snort_stat — скрипт для статистичного аналізу журналу реєстрації Snort;
Snort2html, SnortSnarf і SnortReport — скрипти для генерації HTML-звіту на основі журналу реєстрації Snort;
RotateLogs і snort_log_rotate — резервування та очищення журналів реєстрації Snort;
і т. д. З повним списком всіх утиліт, що розширюють функціональність Snort, можна ознайомитися за адресою snort.sourcefire.com/downloads.html.
Найпростіші системи виявлення атак просто подають на вхід утиліти regexp події, отримання за допомогою бібліотеки libcap або використовують tcpdump. Ефективність такої системи виявлення атак залежить від кількості і якості регулярних виразів, які описують виявляються атаки. Однак розробники деяких систем надходять ще простіше і просто зіставляють мережеві пакети з сигнатурами відомих атак. Системи, що використовують regexp і libcap, мають одну велику перевагу — простоту модифікацію бази даних сигнатур. Вироби цього класу (наприклад, система Snort) мають велику кількість сигнатур і є найбільш часто і своєчасно оновлюваними. Крім того, простота реалізації призводить до того, що ці системи безкоштовно (чи майже безкоштовно) доступні в мережі Internet і будь-хто може використовувати їх у своїй мережі. Аналогічним чином будь-який бажаючий може самостійно змінювати вихідний код і додавати сигнатури атак в ці системи, тим самим, розширюючи їх функціональність.

Розпізнавання атак
Модуль розпізнавання є самим важливим в будь системи виявлення атак. Від якості його реалізації залежить ефективність всієї системи. Цей модуль в загальному випадку використовує три широко відомих методів для розпізнавання атаки:

Сигнатури, засновані на шаблоні (pattern-based signatures), виразі або рядку, що характеризують атаку чи іншу підозрілу діяльність. Ці сигнатури містять деякі ключові слова або вираження, виявлення яких і свідчить про атаку. Наприклад, фрагмент «cwd ~root» в FTP-сеанс однозначно визначає факт обходу механізму аутентифікації на FTP-сервері і спробі перейти в кореневий каталог FTP-сервера. Іншим прикладом є виявлення аплетів Java в мережевому трафіку на основі шістнадцяткового фрагмента «CA FE BA BE». Ці ж сигнатури дозволяють виявляти багатьох троянських коней, якщо останні використовують стандартні значення портів. Наприклад, троянець NetBus, як це вже описувалося у третьому номері BYTE за цей рік, визначається по використанню 12345-го і 12346-го портів, а троянець BackOrifice — за 31337-го порту.
Сигнатури, засновані на контролі частоти подій або перевищенні порогової величини. Ці сигнатури описують ситуації, коли протягом деякого інтервалу часу відбуваються події, число яких перевищує задані заздалегідь показники. Прикладом такої сигнатури є виявлення сканування портів або виявлення атаки SYN Flood. У першому випадку пороговим значенням є число портів, перевірених в одиницю часу. У другому випадку — число спроб встановлення віртуального з’єднання з вузлом за одиницю часу.
Виявлення аномалій. Даний тип сигнатур дозволяє виявляти події, що відрізняються від попередньо заданих. Наприклад, якщо система виявлення атак фіксує вхід співробітника компанії в мережу в суботу о 2.30, то це може свідчити про те, що пароль цього користувача вкрадений або підібраний і його зловмисник використовує для несанкціонованого проникнення.
Необхідно відзначити, що при створенні своєї власної системи виявлення атак за допомогою описаних вище утиліт і бібліотек можна запрограмувати, в основному, сигнатури першого типу.

База сигнатур атак
База сигнатур є серцем будь-якої системи виявлення атак. Всі атаки або інші несанкціоновані дії побудовані на стандартних фільтрах, які є основою будь-якої системи виявлення атак. Розглянемо два типи фільтрів. Перший — на прикладі утиліти TCPdump, другий — на прикладі міжмережевого екрану Check Point VPN-1&Firewall-1. Другий приклад обумовлений тим, що іноді в організації гроші все ж виділяються і тоді відділи захисту інформації набувають міжмережевий екран (МСЕ). У більшості випадків — це рішення компанії Check Point. Деякі фахівці знають, що цей МСЕ володіє чудовим механізмом — мовою опису мережних подій INSPECT, який дозволяє оперувати будь-якими полями (включаючи поле даних) мережевих пакетів. Використовуючи цю мову можна побудувати досить ефективну систему виявлення мережевих атак, вбудовану в так полюбився російським користувачам міжмережевий екран. Гідність цього рішення в тому, що на єдину консоль адміністратора «сипляться» повідомлення від міжмережевого екрану і від системи виявлення атак.

В даній статті я не ставив за мету описати всі можливі сигнатури атак (та й розмір статті не дозволяє це). Я б хотів, щоб читач сам розібрався в цьому, попутно підвищуючи свою кваліфікацію в області виявлення атак і розуміння мережевих протоколів. Ті ж, хто поспішає захистити себе від хакерських напастей, можу відіслати до своєї книги «Виявлення атак» [1], в якій досить докладно розглядаються питання створення своїх сигнатур на прикладі утиліти TCPdump. Продемонструю кілька прикладів, які показують, як просто можна описати сигнатури різних мережевих подій і атак, які повинні контролюватися і виявлятися. Наприклад, робота за протоколом TCP визначається правилом ip[9:1] = 6 (для TCPdump) або accept [9:1]=6 (для Check Point Firewall-1). Дев’ятий байт в IP-заголовку характеризує ідентифікатор протоколу (TCP це значення дорівнює 6). Оператор accept в мові INSPECT [2] дає команду міжмережевого екрану пропустити пакет, який відповідає даній умові (можуть бути і інші оператори — drop, reject, hold тощо). Атака Land може бути визначена наступним чином (для TCPdump):

ip[12:4] = ip[16:4] або tcp and (ip[12:4] = ip[16:4]) and (tcp[0:2] = tcp[2:2])

Перше правило виявляє тільки ті пакети, в яких збігаються тільки адреси одержувача та відправника, а другий виявляє пакети з збігом не тільки цих адрес, але і портів одержувача і відправника. Мова INSPECT є об’єктно-орієнтованим і в правилах можна використовувати різні мережеві об’єкти (вузли, мережі, користувачі і т. д.), що істотно полегшує роботу по створенню сигнатур атак. Наприклад, наступне правило:

inbound [email protected] // Правило застосовується до вхідному трафіку від мережного об’єкта router77
drop // Заборонити пакети, відповідні правила
(ip_src = ip_dst) // Адреса джерела збігається з адресою призначення
LOG(long,LOG_NOALERT,1) // Зареєструвати атаку в журналі реєстрації

також призначений для виявлення атаки Land. Але це правило спрацьовує не для всього трафіку, як у попередньому випадку з TCPdump, а тільки для мережевих пакетів, що передаються від об’єкта з ім’ям router77 на всі інтерфейси міжмережевого екрану.

Може здатися, що з допомогою TCPdump не можна будувати серйозні сигнатури. Це не так. Наприклад, таке правило дозволяє виявляти пакети, які приходять з Internet, в яких в якості адреси вказані джерела немаршрутизируемые адреси:

net 10 or net 192.168 or
(net and 172
( ((ip[13] > 15) and (ip[13] 15) and (ip[17] = 67) and (ip[12] = 67) and (ip[12] 239) or net 255

де, номер після ключового слова net і є номером немаршрутизируемой або неможливою мережі. Правило виявлення троянця BackOrifice виглядає так:

udp and ((dst port 31337) or (src port 31337))
До речі BackOrifice може бути виявлений і з допомогою 8-мибайтовой послідовності” CE 63 D1 D2 16 E7 13 CF”, виявленої в мережевих пакетах, які передаються між клієнтом і сервером Back Orifice:

udp[8:8] = 0xce63d1d216e713cf

Висновок
Однак, незважаючи на велику кількість сигнатур, які можна створити своїми силами, системи, побудовані своїми руками, не можуть виявляти атаки, що складаються з декількох пакетів або використовують фрагментовані пакети (за винятком деяких випадків). Крім того, ці системи не можуть виявити атаки, трохи відрізняються (навіть одним бітом) від тих сигнатур, які занесені в базу даних. Наприклад, 8 байтів «CE 63 D1 D2 16 E7 13 CF» в потоці даних, що передаються по протоколу UDP, з високою вірогідністю характеризують використання троянця Back Orifice з паролем, заданим за замовчуванням. І навіть при тому, що 80% всіх зловмисників залишають пароль, заданий за замовчуванням, інші 20% (найбільш кваліфікованих) змінюють його. Така модифікована атака не буде виявлена системою, побудованої на застосуванні регулярних виразів. Багато з цих систем не обробляють також фрагментовані пакети. І зловмисник міг би обійти систему виявлення атак, просто змінюючи значення MTU на своєму комп’ютері. Справедливості заради необхідно відзначити, що і більш складні і дорогі комерційні системи виявлення атак не завжди не контролюють фрагментовані повідомлення.

Для власноручно створених систем дуже великий відсоток помилкових спрацьовувань (false positives), при якому аналізований трафік визначається як атака, незважаючи на те, що реальної атаки в цьому трафіку немає. Наприклад, зазначені 8 байт для троянця Back Orifice не настільки незвичайні, щоб їх можна було зустріти в звичайному трафіку. Розглянуті системи в цьому випадку просигналізує про виявлення використання Back Orifice там, де його насправді немає. Або інший приклад. Ви пишіть лист другові, в якому попереджаєте, що скрипт “/cgi-bin/phf” є вразливим. Більшість комерційних систем, що аналізують не просто окремі мережні пакети, а цілком трафік конкретного протоколу, «побачить», що текстовий фрагмент “/cgi-bin/phf”, що характеризує атаку передається не по 80 (HTTP), а за 25 (SMTP) порту і не будуть сигналізувати про атаку. На відміну від пакетно-орієнтованих систем, побудованих на базі TCPdump або INSPECT.

Однак такі системи мають право на існування, і технології, описані в цій статті, використовуються при створенні своєї (нехай не настільки потужною, як RealSecure Sensor Network) системи виявлення атак, на яку не треба витрачати багато грошей.