Система обнаружения вторжений Snort

Web-интерфейс

Здравствуйте друзья! Сегодня, наконец, дошли руки до написания статьи на тему защиты своей внутренней сети от вторжений извне. Точнее даже не самой защиты, а своевременной и наглядной идентификации.

Итак, перейду ближе к делу.

У нас имеется сервер с Debian 8 (скачал новую версию специально для этого дела), два сетевых интерфейса eth0 и eth1. Как водится, это граничный шлюз, будет раздавать инет, приходящий на внешний интерфейс eth0 во внутреннюю сеть eth1. Это мы уже делали, на этом зацикливаться не буду.

Первым делом нам потребуется ssh, чтобы “рулить” уже с рабочего места (не очень удобно торчать в морозной серверной с консолью, стоя и в неприятном шуме).

# apt-get -y install openssh-server

Далее открываем конфиг:

# vi /etc/ssh/sshd_config

И раскомментируем строчки:

Protocol 2
Port 22

Запустим сервис:

# /etc/init.d/ssh start

Всё, теперь можно коннектиться уже с рабочего места. Перехожу из серверной к себе в уютную коморку (фотки уже проскакивали ;).

….

Вот жеж! Балбес. Пришлось снова идти в серверную. На только что установленной системе не был прописан IP адрес интерфейса, не смог приконнектиться…. Исправлюсь

Открываем файл конфигурации интерфейсов и прописываем наши данные (DHCP у меня нет):

# vi /etc/network/interfaces

Статический адрес
Статический адрес

А теперь перезагружаем сеть

# /etc/init.d/networking restart

Всё, теперь все действия будем выполнять уже удалённо. Да, не забываем прописать валидный DNS в файл /etc/resolv.conf

nameserver 8.8.8.8

Один из вариантов, публичный гугловский.

Прописываем дополнительные источники пакетов

Для этого открываем файл /etc/apt/sources.list и дописываем следующие источники:

deb http://packages.dotdeb.org jessie all
deb-src http://packages.dotdeb.org jessie all

sources
sources

Соответственно, добавляем ключ для доступа к этим источникам:

# cd /tmp && wget http://www.dotdeb.org/dotdeb.gpg
# cat dotdeb.gpg | apt-key add -

Обновляемся и ставим сопутствующий софт

# apt-get update && apt-get -y install apache2 apache2-doc autoconf automake bison ca-certificates ethtool flex g++ gcc libapache2-mod-php5 libcrypt-ssleay-perl libmysqlclient-dev libnet1 libpcre3 libpcre3-dev libphp-adodb libssl-dev libtool libwww-perl make mysql-client mysql-common mysql-server ntp php5-cli php5-gd php5-mysql php-pear sysstat

Ставится куча компонентов и зависимостей, они нам понадобятся в будущем. Идём пить кофе, у меня процесс установки занялся минут на 5.

Придётся ввести пароль root для mysql-сервера. Попутно выдается предупреждение о том, что adodb установлен в /usr/share/php/adodb, запомним этот путь, он нам пригодится потом.

Разгружаем ядро (если планируется большой трафик)

# vi /etc/rc.local

offload
offload

Дописываем строки перед exit 0

ethtool --offload eth0 rx off tx off
ethtool -K eth0 gso off
ethtool -K eth0 gro off

Ставим библиотеки из исходников

Дальше нам понадобится libpcap для захвата пакетов в режиме promisc

# cd /usr/src
# wget http://www.tcpdump.org/release/libpcap-1.6.1.tar.gz
# tar xzf libpcap-1.6.1.tar.gz
# cd libpcap-1.6.1
# ./configure --prefix=/usr && make && make install

Аналогично скачаем и поставим libdnet для низкоуровневой работы с пакетами

# cd /usr/src
# wget http://libdnet.googlecode.com/files/libdnet-1.12.tgz
# tar xzf libdnet-1.12.tgz
# cd libdnet-1.12
# ./configure --prefix=/usr --enable-shared && make && make install

А так же daq (последнюю версию можно посмотреть на https://www.snort.org/downloads в разделе Sources)

# cd /usr/src
# wget https://www.snort.org/downloads/snort/daq-2.0.5.tar.gz
# tar xzf daq-2.0.5.tar.gz
# cd daq-2.0.5
# ./configure && make && make install

Обновляем кэш библиотек

После установки софта из исходников желательно бы обновить кэш подключенных библиотек:

# echo /usr/lib >> /etc/ld.so.conf
# echo /usr/local/lib >> /etc/ld.so.conf
# ldconfig

Качаем и ставим сам Snort

С офсайта выясняем, что последняя версия Снорта – snort-2.9.7.3.tar.gz (на момент 14.07.2015).

# cd /usr/src
# wget https://www.snort.org/downloads/snort/snort-2.9.7.3.tar.gz
# tar xzf snort-2.9.7.3.tar.gz
# cd  snort-2.9.7.3/
# ./configure --enable-sourcefire && make && make install
# mkdir /usr/local/etc/snort
# mkdir /usr/local/etc/rules
# mkdir /usr/local/lib/snort_dynamicrules
# mkdir /var/log/snort
# touch /usr/local/etc/snort/rules/white_list.rules
# touch /usr/local/etc/snort/rules/black_list.rules
# touch /usr/local/etc/snort/sid-msg.map
# groupadd snort
# useradd -g snort snort
# chown snort:snort /var/log/snort
# cp etc/*.conf* /usr/local/etc/snort/
# cp etc/*.map /usr/local/etc/snort/

Первоначальная настройка Snort

# vi /usr/local/etc/snort/snort.conf

Ищем строку ipvar HOME_NET any и меняем её на ipvar HOME_NET 192.168.1.0/24
Здесь указываем домашнюю сеть. У меня это 192.168.1.0/24, у вас может быть другая, указываете соответственно её.

Ищем строку ipvar EXTERNAL_NET any и меняем её на ipvar EXTERNAL_NET !$HOME_NET
То есть внешняя сеть – любая, не равная домашней.

Ищем строку var RULE_PATH ../rules и меняем параметр на var RULE_PATH ./rules (одна точка в пути, т.е. текущий директорий).

Аналогично и с var WHITE_LIST_PATH и с var BLACK_LIST_PATH.

Ищем строку “output unified2:” и меняем (укорачиваем) её до “output unified2: filename snort.log, limit 128

Далее, закомментируем все строки правил (include $RULE_PATH…), кроме первой (local.rules), это для теста. Мы создадим всего одно правило, которое проверим. А позднее будем добавлять только нужные нам, дабы не генерировать кучу не совсем нужных эвентов.

Snort работает как перехватчик пакетов, анализируя содержимое каждого на ряд критериев. Критериев этих великое множество (различные аномалии трафика), поэтому лог-файлы могут разрастаться очень быстро, если включена проверка по всем правилам.

rules
rules

Ну и теперь откроем на редактирование этот файл локальных правил:

# vi /usr/local/etc/snort/rules/local.rules

alert icmp any any -> $HOME_NET any (msg:"PINGUSHKI"; sid:10000001; rev:1;)

Сохраним файл и запустим Snort для теста с выводом предупреждений в консоль:

# /usr/local/bin/snort -A console -q -u snort -g snort -c /usr/local/etc/snort/snort.conf -i eth0

Теперь пинганём наш хост с любого другого узла:

Вот в консоль и посыпались сообщения
Вот в консоль и посыпались сообщения

Готово! Наш сенсор атак уже обнаруживает попытки пропинговать кого-то в нашей сети. Ну пока ещё это не очень удобная конфигурация. Мы можем установить классификатор для перегона логов в mysql базу.

Установка Barnyard2

# cd /usr/src
# wget https://github.com/firnsy/barnyard2/archive/master.tar.gz
# tar xzf master.tar.gz
# cd barnyard2-master
# autoreconf -fvi -I ./m4
# ./configure --with-mysql --with-mysql-libraries=/usr/lib/i386-linux-gnu && make && make install
# mv /usr/local/etc/barnyard2.conf /usr/local/etc/snort
# cp schemas/create_mysql /usr/src
# mkdir /var/log/barnyard2
# chown snort:snort /var/log/barnyard2

Дальше конфигурим

# vi /usr/local/etc/snort/barnyard2.conf

Меняем пути к конфигурационным файлам согласно тем, которые мы перенесли в каталог snort-а:

barnyard2
barnyard2

А так же ищем строку output alert_fast: stdout меняем просто на output alert_fast.

В конце файла добавим строку:

output database: log, mysql, user=snort password=snortpass dbname=snort host=localhost

Разумеется, пароль вы можете указать произвольный. Дальше надо будет эту базу данных создать.

Создаем базу данных

# mysql -uroot -p<пароль>

mysql> create database snort;
Query OK, 1 row affected (0.00 sec)

mysql> grant CREATE, INSERT, SELECT, DELETE, UPDATE on snort.* to 'snort'@'localhost';
Query OK, 0 rows affected (0.00 sec)

mysql> SET PASSWORD FOR 'snort'@'localhost'=PASSWORD('snortpass');
Query OK, 0 rows affected (0.00 sec)

mysql> use snort;
Database changed

mysql> source /usr/src/create_mysql
Query OK, 0 rows affected (0.05 sec)
Query OK, 1 row affected (0.02 sec)
Query OK, 0 rows affected (0.04 sec)
Query OK, 0 rows affected (0.03 sec)
Query OK, 0 rows affected (0.02 sec)
Query OK, 0 rows affected (0.05 sec)
Query OK, 0 rows affected (0.02 sec)
Query OK, 0 rows affected (0.02 sec)
Query OK, 0 rows affected (0.02 sec)
Query OK, 0 rows affected (0.02 sec)
Query OK, 0 rows affected (0.01 sec)
Query OK, 0 rows affected (0.01 sec)
Query OK, 0 rows affected (0.01 sec)
Query OK, 0 rows affected (0.01 sec)
Query OK, 0 rows affected (0.02 sec)
Query OK, 0 rows affected (0.01 sec)
Query OK, 1 row affected (0.02 sec)
Query OK, 1 row affected (0.01 sec)
Query OK, 1 row affected (0.00 sec)
Query OK, 0 rows affected (0.02 sec)
Query OK, 1 row affected (0.01 sec)
Query OK, 1 row affected (0.01 sec)

Готово!

mysql> quit;

Проверка связки Snort & Barnyard

# /usr/local/bin/snort -q -u snort -g snort -c /usr/local/etc/snort/snort.conf -i eth0 &
# /usr/local/bin/barnyard2 -c /usr/local/etc/snort/barnyard2.conf -d /var/log/snort -f snort.log -w /usr/local/etc/snort/bylog.waldo -C /usr/local/etc/snort/classification.config &

связка
связка

Пинганём аналогично предыдущему тесту. А потом завершим бэкграундную задачу:

# fg
# <Ctrl+C>

статистика
статистика

Видим ненулевую статистику по ICMP. Значит связка работает. Осталось прикрутить веб-интерфейс.

Ставим WEB-интерфейс

# cd /usr/src
# wget http://sourceforge.net/projects/secureideas/files/BASE/base-1.4.5/base-1.4.5.tar.gz
# tar xzf base-1.4.5.tar.gz
# cp -r base-1.4.5 /var/www/base
# chown -R www-data:www-data /var/www/base

Создаём конфиг:

# vi /etc/apache2/conf-enabled/base.conf

следующего содержания (временно)

Alias /base /var/www/base/
<Directory "/var/www/base/">
AllowOverride None
</Directory>

Настраиваем Apache2 на SSL

# a2enmod ssl
# cp /etc/apache2/sites-available/default-ssl /etc/apache2/sites-enabled

Далее, надо бы отключить показ замечаний:

# vi /etc/php5/apache2/php.ini
ищем строку error_reporting и устанавливаем значение в E_ALL & ~E_NOTICE для удобства отладки и сокрытия лишних сообщений.

Добавляем расширения к PHP:

# pear config-set preferred_state alpha && pear channel-update pear.php.net
# pear install --alldeps Image_Color2 Image_Canvas Image_Graph
# /etc/init.d/apache2 restart

Открываем в браузере URL: https://<IP сервера>/base

Веб-морда
Веб-морда

Начинаем конфигурировать.

На шаге 1 нужно будет указать путь до adodb, мы его запоминали вначале.

На шаге 2 нужно указать параметры соединения с сервером баз данных.

mysql
mysql

Далее, закроем паролем доступ к статистике:

auth
auth

На предложение создать базу отвечаем утвердительно и переходим на окно авторизации. Вводим данные из 3-го шага и …

Перед нами вполне удобный веб-интерфейс.

Web-интерфейс
Web-интерфейс

В перспективе ещё наладить автоматическое получение базы с правилами для поддержания актуальности нашего сенсора атак. Ну а пока хватит!

Регистрируемся на сайте

signin
signin

Процедура регистрации весьма тривиальна. Переходим в личный кабинет и видим Oinkcode

Код
Код

# cd /usr/src
# wget https://pulledpork.googlecode.com/files/pulledpork-0.7.0.tar.gz
# tar xzf pulledpork-0.7.0.tar.gz
# cd pulledpork-0.7.0
# cp pulledpork.pl /usr/local/bin
# cp etc/*.conf /usr/local/etc/snort

Пропишем наш oinkcode в конфигурационный файл

# vi /usr/local/etc/snort/pulledpork.conf

В строки 19, и 26 (я завуалировал фрагмент)

Меняем значение distro= в соответствии с нашей системой (строка 131), в данном случае Debian-6-0.

В 139 строке закомментируем использование Blacklist, а так же раскомментируем строки с 194 по 197.

enablesid=/usr/local/etc/snort/enablesid.conf
dropsid=/usr/local/etc/snort/dropsid.conf
disablesid=/usr/local/etc/snort/disablesid.conf
modifysid=/usr/local/etc/snort/modifysid.conf

oinkcode
oinkcode

Далее, открываем файл /usr/local/etc/snort/disablesid.conf и дописываем в конец

pcre:fwsam

Делаем скрипт pulledpork.pl исполняемым

# chmod +x /usr/local/bin/pulledpork.pl

И запускаем его на выполнение:

# /usr/local/bin/pulledpork.pl -c /usr/local/etc/snort/pulledpork.conf -T –l

Содержимое каталога правил
Содержимое каталога правил

… после обновления

После обновления
После обновления

Появился файл snort.rules!

Ну вот и всё. Теперь остаётся только убрать наше тестовое правило, почистить логи, создать скрипты запуска сервисов snort и barnyard2 в автозапуске и перезапустить сервисы.

Кстати, удалить символ комментария в редакторе vi достаточно просто.

:547,650s/#/

Строки с 547 по 650 символ # удаляется. Одной командой.

Скрипт запуска snort и barnyard2 в автозапуск:

Скрипт я позаимствовал с официального руководства:

Создаем файл

# vi /etc/init.d/snort

следующего содержания:

#! /bin/sh
#
### BEGIN INIT INFO
# Provides: snortbarn
# Required-Start: $remote_fs $syslog mysql
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# X-Interactive: true
# Short-Description: Start Snort and Barnyard
### END INIT INFO
. /lib/init/vars.sh
. /lib/lsb/init-functions
mysqld_get_param() {
/usr/sbin/mysqld --print-defaults | tr " " "\n" | grep -- "--$1" | tail -n 1 | cut -d= -f2
}
do_start()
{
log_daemon_msg "Starting Snort and Barnyard" ""
# Make sure mysql has finished starting
ps_alive=0
while [ $ps_alive -lt 1 ];
do
pidfile=`mysqld_get_param pid-file`
if [ -f "$pidfile" ] && ps `cat $pidfile` >/dev/null 2>&1; then ps_alive=1; fi
sleep 1
done
/sbin/ifconfig eth0 up
/usr/local/bin/snort -q -u snort -g snort -c /usr/local/etc/snort/snort.conf -i eth0 &
/usr/local/bin/barnyard2 -q -c /usr/local/etc/snort/barnyard2.conf -d /var/log/snort -f snort.log -w /usr/local/etc/snort/bylog.waldo -C /usr/local/etc/snort/classification.config 2> /dev/null &
log_end_msg 0
return 0
}
do_stop()
{
log_daemon_msg "Stopping Snort and Barnyard" ""
kill $(pidof snort) 2> /dev/null
kill $(pidof barnyard2) 2> /dev/null
log_end_msg 0
return 0
}
case "$1" in
start)
do_start
;;
stop)
do_stop
;;
restart)
do_stop
do_start
;;
*)
echo "Usage: snort-barn {start|stop|restart}" >&2
exit 3
;;
esac
exit 0

Всё просто, скрипт зависит от mysql службы, перед запуском проверяет, запущен ли сервис баз данных, если да, то поднимает интерфейс и запускает наши службы аналогично, как мы их проверяли до этого из командной строки.

Сохраняем, делаем его исполняемым:

# chmod +x /etc/init.d/snort

и устанавливаем как сервис:

# insserv -f -v snort

Готово!


Update. А оказывается, базовые правила в комплекте отсутствуют! Их нужно скачать с офсайта и распаковать в соответствующие каталоги.

Качаем базовые правила
Качаем базовые правила

Структура каталогов проста (rules, so_rules .. и т.д. Это мы уже видели в конфиг-файле и в каталоге /usr/local/etc/snort/ )

Скрин
Скрин

Проведём атаку как мы уже рассматривали в этой статье: https://litl-admin.ru/xaking/zachem-lomat-svoyu-sistemu-armitagemetasploit.html

А затем глянем логи. Кстати, текстовые логи сейчас в файле:

/var/log/barnyard2/alert

Скрин лога
Скрин лога

А в веб-интерфейсе:

Логи
Логи

 

Интересно? Поделись с другом
Litl-Admin.ru

Comments:

Comments: 2
  1. litladmin (author)

    Итак, я заметил одну неприятную вещь. Если, используя эксплоит, указывать LHOST (локальный хост), принадлежащий целевой подсети (даже сопадающий с атакуемой машиной) то Snort молчит. Вызвано это видимо тем, что он не фиксирует в логах атаки с HOME_NET. По крайней мере у меня дважды ничего не было.
    Здесь у хакера простор для творчества, можно производить попытки обойти IDS. А у админа – головная боль. Надо попробовать настроить Snort так, чтобы он фиксировал соединения даже из домашней сети в домашнюю.

Leave a Reply