Настройка и тестирование IDS Snort

В настоящее время существует ряд IDS-систем, предназначеных для обнаружения сетевых вторжений. Системы относительно сложные, по многим из них просто не найти информации в открытых источниках. Работают все они на основании заложенных в них правил. В классическом виде системы позволяют выслеживать в проходящем трафике сигнатуры сетевых атак и, в случае их нахождения, передавать сигнал на местный Firewall с тем, чтобы последний заблокировал (скажем на уровне web-сервера) доступ определенному IP адресу. Таким образом обеспечивается безопасность работы компьютера (внутренней локальной сети). Большинство IDS-систем платного характера, но есть несколько и бесплатных, одна из которых система Snort. В связи с тем, что в рунете практически нет никакой информации позволяющей оценить стойкость этой системы (как самого распространенного представителя целого класса IDS-систем), на основании проведенных тестов, мы решили провести свое исследование на предмет оценки работоспособности системы. Итак, начнем. Система Snort:

1. Прежде всего нужно провести установку системы:
Для установки нам понадобится библиотека Libpcap необходимая для организации стандартного межплатформенного интерфейса. Скачать библиотеку можно на сайте производителя: www.tcpdump.org.

В разархивированном каталоге достаточно выполнить следующие команды:

./configure
make
make install

Библиотека установлена. Можно приступать к снорту.
Последний стабильный релиз Снорта можно скачать по адресу: http://snort.org/dl/
После распаковки файла в выбранный каталог, необходимо выполнить прежние команды:
./configure
make
make install

Если при выполнении configure у вас возникнет ошибка, придется остановиться и выполнить все требования предустановки нужных библиотек (например libpcap или pcre).

Далее нам нужно создать каталог в который будут писаться события snort (это каталог с логами). Создать его можно следующей командой:
mkdir /var/log/snort/

Дальше два пути:
1. Скачать готовые правила snort и установить их (полный набор правил здесь - http://snort.org/pub-bin/downloads.cgi)
2. Разрабатывать правила с учетом особенностей своей среды (пользователей, сервисов и т.п.). В этом случае IDS будет работать быстрее.

Есть еще третий пусть - дополнять готовую базу правил снорта своими. Эксеримента ради мы решили идти именно по этому пути. Цель нашего исследования - найти уязвимые места в последних базах снорта, в результате использования современных эксплойтов (или сканеров). Ну и как следствие, предложить правила противодйствия им, с тем, чтобы не нарушалась конфиденциальность/целостность/доступность системы.

Итак. Настройку Снорта стоит начать с файла /etc/snort.conf
В этом файле содержатся все необходимые параметры функционала Снорта:


Начиная настройку конфигурационного файла снорта, прежде всего нужно задать домашнюю (анализируемую) сеть, т.е. ту на которую будут проходить атаки (или возможны). Другими словами нам нужно прописать хост или список хостов, трафик которых, будет анализировать наша Snort-система:
var HOME_NET = IP адрес

Ниже, в том же файле, задаём внешнюю сеть, ту из которой грозит атака. Здесь можно задать маску, сетевой интерфейс и другие переменные:
var EXTERNAL_NET = any

Здесь же необходимо определить перечень серверов входящих в домашнюю сеть:

Вот эти переменные:
var DNS_SERVERS $HOME_NET//перечень используемых DNS-серверов
var SMTP_SERVERS $HOME_NET
//перечень используемых SMTP-серверов
var HTTP_SERVERS $HOME_NET
//перечень используемых HTTP-серверов
var SQL_SERVERS $HOME_NET
//перечень используемых SQL-серверов
var TELNET_SERVERS $HOME_NET
//перечень используемых TELNET-серверов
var SNMP_SERVERS $HOME_NET
//перечень используемых SNMP-серверов

Для начала стоит отключить все препроцессоры, которые предназначены для дополнительных пока не нужных нам проверок (проверок специфичных протоколов и др.). Для этого нам нужно закоментировать всю секцию #3

Далее в файле (в секции 6) прописывается перечень используемых правил, которые в свою очередь разделены по видам атак. Среди прочих: DOS-атаки, DDOS-атаки, эксплойты, нежелательный трафик и т.д.

Любой из этих наборов правил можно редактировать, дополнять. Чем мы и займемся далее.

Снорт готов к запуску. Если в процессе запуска системы snort происходит ошибка об этом сообщает коммандная строка с описанием ошибки и номером строки конфигурационного файла.
snort в режиме sniffer $ snort -dev
snort как демон $ snort -D

В случае, если snort обнаруживает совпадение с правилом, то в файл /var/log/snort/alert дописывается информация о срабатывании того или иного правила.
Например:
Для того, чтобы заставить snort писать не только заголовки, но и содержимое пакета нужно включить опцию "-d" для записи содержимого пакетов, или опцию "-b" для записи пакета целиком в бинарном виде.
Как уже отмечалось выше, IDS-системы, как и сам Snort, работают на основании списка правил, по которым они и определяют есть ли в проходящем трафике "опасные" пакеты или нет. Так вот у ситемы Snort этот список правил выглядит таким образом:
каким???
2. Вторая часть установки снорта - это модуль SnortSam. Этот модуль позволяет связывать систему Snort с местной Firewall-системой. Другими словами это и есть активная часть системы, которая позволяет реагировать на нежелательный трафик. Итак, установка модуля SnortSam. Есть 2 варианта: Первый (более простой): - скачиваем готовые бинарники snortsam и уже модифицированный snort с сайта http://www.snortsam.net/download.html - помещаем их в каталог /usr/bin/ Второй (для опытных пользователей): - скачиваем архив с исходниками snortsam - разархивируем - компилируем snortsam (./configure , make , make install) - скачиваем архив c патчем к snort - разархивируем - запускаем pathsnort.sh в качестве параметра указываем путь к исходникам snort: $ pathsnort.sh /root/snort-2.6.0.2 - компилируем пропатченный snort (./configure , make , make install) После установка модуля нужно провести его настройку. Поключаем плагин вывода для Snort (файл /etc/snort.conf):
img=snortsam-snortconf
192.168.1.253 - Хост на котором запущен файрВолл и SnortSam. В качестве экспериментального фаервола мы выбрали iptables.

Настраиваем SnortSam (файл /etc/snortsam.conf):
------------------------------------------------------------------------
# accept <host>/<mask>,<key>
#
# В этой опции перечисляются Snort сенсоры, от которых SnortSam будет
# принимать пакеты. Вы можете задать имя хоста, IP адресс, IP адресс и
# маску подсети, а так же ключ шифрования, используемяй для этого хоста
# или сети.
#
# Examples: accept 10.10.0.0/16, officepassword
# accept snort1, hostpassword
# accept 192.168.1.1
#
# Если паророль отсутствует, используется ключ по умолчанию DEFAULTKEY. Вы
# можете задать только один хост в каждой строке, но Вы можете использовать
# неограниченное количество строк.

accept 192.168.1.253



# bindip
#
# Эта опция заставляет Snortsam прослушивать только ожин IP адрес (или
# интерфейс), вместо всех интерфейсов/адресов.
#
# Пример: bindip 192.168.0.1

bindip 192.168.1.253



# iptables <adapter> <logoption>
#
# Этот плагин вызывает iptables для блокирования хоста, путём домавления
# правила к набору активного списка блокировки. Вы должны указать адаптер
# на котором осущесвляется блокировка (напр. eth0), так же Вы можете указать
# опции логирования.
#



------------------------------------------------------------------------
Убеждаемся, что незадано никаких правил фильтрации для ФайрВолла:
------------------------------------------------------------------------
# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination

Chain FORWARD (policy ACCEPT)
target prot opt source destination

Chain OUTPUT (policy ACCEPT)
target prot opt source destination
------------------------------------------------------------------------


3. Двигаемся дальше. IDS настроена. Время для проведения экспериментов. В натуральном исполнении нам понадобится web-сервер (это чуть позже), пока же проведем эмуляцию сервера с помощью программы netcat.

Как уже было сказано выше, Snort работает с сигнатурами. Сигнатура - это совокупность байт индивидуально идентифицирующих приложение. Например любой WEB обозреватель, прежде чем запросить HTML страницу с сервера, посылает ему определённую информацию (представляется), для более комфортного взаимодействия (использования специфических функций работающих только в представляющемся приложении). Эта информация, в частности, включает в себя и уникальное имя (версию) броузера. Чтобы это увидеть, запустите на своём компьтере (в консоле) программу NetCat (которая позволяет имулировать web-сервер), как показано ниже.

# nc -l -p 80

Флаги:
-l (listen) Запускает NetCat в режиме прослушивания порта;
-p (port) Прослушивает указанный порт (в нашем случае 80)

Все обозреватели интернет, по умолчанию запрашивают WEB страницу с 80 (http) порта. Поэтому мы будет эмулировать WEB сервер, пока нам для этого хватит только прослушивание порта сервера. Нужно помнить! Если ваш порт 80 занят другим приложением, вам необходимо закрыть это приложение, чтобы пример работал правильно. Что это проверить, нужно запустить:

    netstat -anb : для Windows
    netstat -anp | grep 80 : для Linux

Среди результатов необходимо найти программу которая занимает порт 80.
Если таковой нет, значит порт свободен.


Теперь нужно запустить любой интернет обозреватель, и наберите адрес:
http://localhost

После этого NetCat должен Вам показать все, передаваемые броузером, HTTP заголовки. А броузер выдаст ошибку по которой он неможет найти хост или
открыть стараницу (так как NetCat не реализует весь функционал WEB сервера).

Ниже приведены примеры HTTP заголовков для InternetExplorer 6.0.2900 и для Firefox 2.0.0.2.

Вот как представился InternetExplorer 6.0.2900:
-- InternetExplorer -------------------------------------------------------
GET / HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, */*
Accept-Language: en-ca
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon)
Host: localhost
Connection: Keep-Alive
----------------------------------------------------------------------------


А вот так Firefox 2.0.0.2:
-- Firefox ----------------------------------------------------------------
GET / HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.8.1.2) Gecko/20070219 Firefox/2.0.0.2
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;
q=0.5
Accept-Language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
---------------------------------------------------------------------------

Среди различной служебной информации можно найти строки: MSIE и Firefox. По ним обычно и идентифицируется тип пользовательского обозревателя.
Заголовки, идентифицирующии браузер, присылаются серверу исключительно как избыточная информация, те. они не предусмотрены спецификацией, как обязательные,
следовательно их может не быть совсем. Так же эти заголовки эллементарно подделать (в Опере, например, можно прямо в установках указать тип браузера которым ей нужно представляться).

Допустим Вы убеждённый фанат открытого исходного кода и не хотите пускать коммерческий InternetExplorer на свой WEB сайт. Реализуем эту идею с
помощью Snort. Для начала научимся просто распознавать наличие IE в Snort'е, а затем посмотрим как мождно заблокировать доступ к сайту.

Допустим у вас установлен WEB сервер и Snort на одном компьютере. Чтобы настроить Snort на обнаружения InternetExplorer, добавим своё правило в стандартные правила Snort. По умолчанию папка для правил распологается по адрессу "/etc/snortrules/rules". Для пользовательских правил существует специальные файл "local.rules". Изначально правил там
нет, добавим туда такую строку:

    alert tcp any any -> $HOME_NET 80 (msg: "M$ InternetExplorer detected"; content: "MSIE"; nocase;)

Сохраниете файл и перезапустите Snort. Теперь зайдите с любого комьютера к сайт через IE. В логах Snort'a появиться соответствующее сообщение из
нашего правила. Следует заметить, что другие обозреватели (напр. FF) не вызовут никакого логирования.


Теперь научим Snort блокировать хост, с которого производится запрос к нашему сайту через IE. Для этого понадобиться плагин для Snort'а Snortsam (который мы уже настроили).
Всё что необходимо сделать это немного отредактировать наше правило. Теперь оно должно выглядеть так:

    alert tcp any any -> $HOME_NET 80 (msg: "M$ InternetExplorer detected"; content: "MSIE"; nocase; fwsam: src, 1 hour;)

1 hour - (1 час) это время на которое "злоумышленник" будет заблокирован. Попробуйте снова войти на сайт с помощью IE, и убедитесь, что этот сайт не
сообщит вам никакой информации в течении часа. А если не смените броузер, то и никогда.
Таким образом мы забраликовали нежелательный трафик. Сделали мы это с помощью IDS Snort, ее модуля SnortSam и фаервола IPtables. Нужно понимать, что это лишь тривиальный пример блокирования нежелательного трафика. На примере браузера сработало. Теперь стоит проверить на примере специализированных сетевых приложений, например сетевого сканера, собирающего информацию по работающему серверу. Итак, в качестве сканера мы выбрали широко распространенный и функциональный XSpider.
Поставим задачу заблокировать сетевой сканер, на примере XSPider 7.5.
Для этого нам понадобится установленный WEB сервер. Для примера, выберем широко известный Apache. Сначала нам необходимо найти уникальную сигнатуру сканера.
Для наглядности определим сигнатуру XSPider'а. Сделаем это используя стандартные средства логирования сервера и с помощью сниффера. В качестве сниффера будем использовать Wireshark, но подойдём и любой другой. Все приходящии от клиентов запросы Apche записывает в файл access.log. В конфигурационном файле Apache (по умолчанию httpd.conf), должна присутствовать запись вида:
   
    CustomLog logs/access.log common
   
Будем использовать этот факт для прослеживания действий XSPider. Итак, запускаем Wireshark на прослушивание локального интерфейса. А на втором хосте запускаем XPSpider. Добавляем хост для сканирония на котором установлен Web сервер, из контекстного меню хоста "Сканировать отдельный сервис" и вводим порт 80 (порт web сервера). Теперь нажимаем
кнопку "Сканировать" и немного подождём.



Переместим всё внимание на хост Web сервера. Просмотрим файл access.log, первые запросы сканера выглядят следующим образом:

192.168.1.111 - - [17/Mar/2007:12:40:11 +0300] "GET / HTTP/1.1" 200 709
192.168.1.111 - - [17/Mar/2007:12:40:12 +0300] "GET SCANNER HTTP/1.1" 400 342
192.168.1.111 - - [17/Mar/2007:12:40:12 +0300] "GET /hxaiktusqunkqknr.htm HTTP/1.1" 400 395
192.168.1.111 - - [17/Mar/2007:12:40:13 +0300] "GET / HTTP/1.1" 200 709
192.168.1.111 - - [17/Mar/2007:12:40:13 +0300] "GET /https-admserv/bin/index HTTP/1.1" 404 297
192.168.1.111 - - [17/Mar/2007:12:40:13 +0300] "GET /Admin.po?proceed=yes HTTP/1.1" 404 282
192.168.1.111 - - [17/Mar/2007:12:40:14 +0300] "GET /Admin/index.jsp HTTP/1.1" 404 289
...

Весьма специфичным является второй запрос, где от сервера требуется предоставить файл "SCANNER":

    192.168.1.111 - - [17/Mar/2007:12:40:12 +0300] "GET SCANNER HTTP/1.1" 400 342

Естественно мало на каком сайте подобный файл будет существовать и мы можем воспринимать его как приветствие XSPider'a. Среди результатов Wireshark'а тоже можно увидеть эту картину. Для большей наглядносьти применим фильтр

    (ip.src == 192.168.1.105) && (http.request.method == "GET")


Запрос "SCANNER" явно отличается от остальных, хотя бы тем, что не указан в абсолютной форме, т.е. не начинается со знака "/". Многие сканеры
безопасности специально оставляют свои сигнатуры при поисках уязвимостей. Теперь когда мы знаем, как представляется XSPider, мы можем его
заблокировать при помощи системы Snort (при помощи все того же модуля Snortsam). Для этого добавим в файл "local.rules"
строку:

   alert tcp any any -> $HOME_NET 80 (msg: "XSpider detected"; content: "GET SCANNER HTTP/1.1"; nocase; fwsam: src, 1 hour;)

После этого эксперимента ради попробуем просканировать XSPider'ом Web сервер ещё раз. Результат: сканер заблокирован на 1 час.
Другими словами мы заблокировали попытку сканирования с любого IP адреса наш web-сервер с использованием сканера XSpider. Подобным образом можно настроить Snort на любой другой сканер (эксплойт). Обязательным условием, в данном случае, должно быть то, что эта утилита должна как-то отличаться от обычного трафика (иметь постоянную сигнатуру, по которой ее можно вычислить).

Мы провели анализ некоторых современных сетевых эксплойтов реализующих атаку типа DOS. Эксплойты действительно выбивали из строя современную ОС Win XP SP2, однако при этом никаким образом не представлялись, посылая лишь классические SYN пакеты с попыткой установления соединения. Так вот такие эксплойты заблокировать с помошью IDS Snort нам не удалось. Продолжаем свое исследование.

Hosted by uCoz