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

Обычно к Snort Inline относятся как к инструменту, разработанному сугубо для Linux и для интеграции с пакетом iptables. Однако, используя divert-socket можно заворачивать трафик и от ipfw, перенаправляя его для анализа на процесс, который слушает на заворачиваемом порту. 

Snort, а именно он будет слушать порт, будет обрабатыват пакеты в соответствии с

настроенными сигнатурами. В зависимости от совпадения, Snort либо разрешит прохождение

трафика, либо молча сбросит соединение или же закроет соединение с помощью TCP reset.

Действие по блокировке устанавливается в каждой сигнатуре.

В нашем примере рассматриваются две машины с FreeBSD 8.2, работающие в одной локальной сети.

Обе работают внутри VirtualBox, одна как IPS, а другая как атакующая система .Обе виртуальные машины должны содержать минимальный набор пакетов для i386, включая дерево портов (см. FREEBSD-INSTALL для инструкций по такой установке). Стандартное ядро FreeBSD 8.2 имеет поддержку divert-sockets, однако этот модуль должен быть явно разрешен.

Листинг 1

Необходимая настройка в файле /boot/loader. conf для включения divert sockets

echo ‘ipdivert load=»YES»‘ >> /boot/loader.conf

Листинг 2

Установите нужные порты и загрузите Snort с поддержкой DAQ. Это позволит вам собрать

программу с функцией заворачивания пакетов от ipfw. В описываемых шагах используется ключ

компиляции -DBATCH и подразумеваются стандартные настройки для каждого порта.

cd /usr/ports/ftp/wget make -DBATCH install clean rehash

cd /usr/ports/textproc/flex make -DBATCH install clean cd /usr/ports/devel/pcre

make -DBATCH install clean

cd /usr/ports/net/libdnet/

make -DBATCH install clean

mkdir /usr/src/snort && cd /usr/src/snort

wget snort-current/daq-0.6-2.tar.gz -O daq-0.6.2.tar.gz tar xzf

daq-0.6.2.tar.gz cd daq-0.6.2

./configure

make

make install

wget snort.org/dl/snort-current/snort-2.9.2.tar.gz -O snort-2.9.2.tar.gz cd

snort-2.9.2

./configure —enable-ipv6 —enable-gre —enable-mpls —enable-targetbased

—enable-decoder-prepocessor-rules —enable-ppm —enable-perfprofiling —enable-zlib

—enable-active-response —enable-normalizer —enable-reload —enable-react

—enable-flexresp3

make

make install

mkdir -p /usr/local/etc/snort

cp /usr/src/snort/snort-2.9.2/etc/*.conf* /usr/local/etc/snort/

cp /usr/src/snort/snort-2.9.2/etc/*.map /usr/local/etc/snort/

mkdir -p /usr/local/lib/snort dynamicrules/

mkdir -p /usr/local/etc/snort

mkdir -p /usr/local/etc/snort/rules

mkdir -p /usr/local/etc/snort/so rules

mkdir -p /usr/local/etc/snort/preproc rules

mkdir -p /var/log/snort

mkdir -p /var/log/barnyard2

touch /usr/local/etc/snort/rules/local.rules

sed -i «s/ipvar HOME NET any/ipvar HOME NET [192.168.1.21/32]/»

/usr/local/etc/snort/snort.conf

sed -i ‘s/ipvar EXTERNAL NET any/ipvar EXTERNAL NET [!$HOME NET]/’

/usr/local/etc/snort/snort.conf

sed -i ‘s/var RULE PATH ../rules/var RULE PATH rules/’

/usr/local/etc/snort/snort.conf

sed -i ‘s/var SO RULE PATH ../so rules/var SO RULE PATH so rules/’

/usr/local/etc/snort/snort.conf

sed -i ‘s/var PREPROC RULE PATH ../preproc rules/var PREPROC RULE PATH

preproc rules/’ /usr/local/etc/snort/

snort.conf

sed -i ‘/Ainclude $RULE PATH/.*.rules$/d’

/usr/local/etc/snort/snort.conf

echo «output alert_syslog: LOG_DAEMON LOG_ALERT» >> /usr/local/etc/snort/snort.conf echo

‘include $RULE PATH/local.rules’ >> /usr/local/etc/snort/snort.conf

Листинг 3 — Устанавливаем apache22 из дерева портов.

cd /usr/ports/www/apache22/ make -DBATCH install clean

Чтобы показать, как Snort блокирует атаки, нам потребуется установить Apache для эмуляции

сетевого сервиса, который будут атаковать. 

Листинг 4 — Создаем файл /etc/rc.firewall-ips

(Обратите внимание, что для пропускания

трафика вставлены правила для ICMP, TCP/80 и UDP/53, если же сам трафик, конечно, не

заблокирован Snort)

В Листинге 5 создается нужный исполняемый скрипт для Snort, который помещается в

/usr/local/etc/rc.d. Таким образом, используя настройки из /etc/rc.conf.local, Snort и

apache22 будут автоматически запускаться при каждом старте.

cat << EOF > /etc/rc.firewall-ips; ipfw -q flush

ipfw -q add 01100 divert 8000 ip4 from any to any ipfw -q add 01200 allow tcp from any to me

22 in via em0

ipfw -q add 01300 allow tcp from any to me 80 in via em0

ipfw -q add 01400 allow udp from any to me 53 in via em0

ipfw -q add 01500 allow icmp from any to any ipfw -q add 01600 allow ip4 from any to any EOF

В Листинге 6 приводятся необходимые строки, которые нужно добавить в файл /etc/rc.conf —

именно этим механизмом будут загружаться правила для файрвола во время загрузки виртуальной

машины с FreeBSD-IPS.

Нужно иметь ввиду одну важную деталь при использовании divert sockets совместно с ip-fW файрволом. Если Snort не будет запущен и, соответственно, некому будет обрабатывать входящие пакеты, то весь трафик будет пропущен, т.к. на divert-порт информация приходит, но ничего не перенаправляется на следующее правило в очереди ipfw как включить нужную строчку в конфигурационный файл /boot/loader.conf для организации заворачивания пакетов на машине FreeBSD-IPS.

В Листинге 2 приводятся необходимые шаги для построения Snort, включая небольшие изменения в

стандартную конфигурацию.

Плагин вывода alert_sys-log используется для демонстрации

способностей IPS. В реальной системе вместо него должен использоваться плагин barnyard2 для

обработки вывода unified2, что генерируется самим Snort.

В нормальных условиях, в Snort-сигнатуре присутствует параметр «alert», с помощью которого генерируется сигнал, но действия по предотвращению не производятся. Чтобы заблокировать пакет, нужно использовать параметр «block» или «drop». В Листинге 7 приводится пример создания сигнатуры HTTP, при нахождении которой в сетевом трафике, он будет заблокирован.

Перезагрузив виртуальный контейнер с Free-BSD-IPS, мы получим автостарт Apache, Snort и

работающий совместно со Snort файрвол ipfw.

Листинг 5 — Создаем исполняемый скрипт snort и добавляем необходимую информацию об apache22

и Snort в файл /etc/rc.conf.local.

cat << EOF > /usr/local/etc/rc.d/snort; #!/bin/sh

# $FreeBSD$ #

# PROVIDE: snort

# REQUIRE: LOGIN

# KEYWORD: shutdown

#

# Add the following lines to /etc/rc.conf.local or /etc/

rc.conf

# to enable this service:

#

# snort_enable (bool): Set to NO by default.

# Set it to YES to enable snort.

# snort config (path): Set to /usr/local/etc/snort/

snort.conf

# by default.

#

. /etc/rc.subr

name=»snort» rcvar=${name} enable

command=/usr/local/bin/${name}

load rc config $name

: ${snort_enable=»NO»}

: ${snort config=»/usr/local/etc/snort/snort.conf»}

command args=»—pid-path /var/run —create-pidfile

—daq=ipfw -Q -D -k none -c $snort config»

run rc command EOF

chmod 555 /usr/local/etc/rc.d/snort;

echo ‘accf http load=»YES»‘ >> /boot/loader.conf echo ‘apache22 enable=»YES»‘ >>

/etc/rc.conf.local echo ‘snort enable=»YES»‘ >> /etc/rc.conf.local

Листинг 6 — Добавляем нужные настройки в файл /etc/rc.conf, и обеспечиваем таким образом

автоматический старт ipfw.

echo ‘firewall enable=»YES»‘ >> /etc/rc.conf echo ‘firewall

script=»/etc/rc.firewall-ips»‘ >> /etc/ rc.conf

L

isting 7 — Создаем сигнатуру для блокировки запроса на получение файла /etc/passwd

cat << EOF >> /usr/local/etc/snort/rules/local.rules;

# This signature looks for an attempt to retrieve the

# /etc/passwd file with a web request.

# По этой сигнатуре проверяется весь веб-трафик на

наличие запроса

# доступа к /etc/passwd

block tcp $EXTERNAL_NET any -> $HOME_NET $HTTP_

PORTS (msg:»HTTP FreeBSD-ATTACKER /etc/passwd attempt»;

flow:established,to server; content:»/etc/passwd»; http uri; nocase;

classtype:attempted-admin;

sid:2200001; rev:1;)

EOF

Листинг 8 — В командной строке приводится поведение атакующей системы FreeBSD-Attacker

FreeBSD-Attacker# printf «GET / HTTP/1.1
Host:

192.168.1.21
User-Agent: Netcat
nContent-type: text/html

» |

nc -vvnn 192.168.1.21 80

Connection to 192.168.1.21 80 port [tcp/*] succeeded!

HTTP/1.1 200 OK

Date: Sat, 17 Dec 2011 06:20:26 GMT

Server: Apache/2.2.17 (FreeBSD) mod_ssl/2.2.17

OpenSSL/0.9.8q DAV/2

Last-Modified: Sat, 20 Nov 2004 20:16:24 GMT ETag: «ba199-2c-3e9564c23b600»

Accept-Ranges: bytes

Content-Length: 44

Content-Type: text/html

<html><body><h1>It works!</h1></body></html>FreeBSD-Attacker#

FreeBSD-Attacker# printf «GET /etc/passwd HTTP/1.1
\r

nHost: 192.168.1.21
User-Agent:

Netcat
Content-type: text/html
\r

n
» | nc -vvnn 192.168.1.21 80

Connection to 192.168.1.21 80 port [tcp/*] succeeded!

Листинг 9 — Сообщение о блокированной атаке от системы Snort и сохраненной в

/var/log/messages

Dec 17 01:20:49 FreeBSD-IPS snort[838]: [1:2200001:1] HTTP FreeBSD-ATTACKER /etc/passwd

attempt [Classification: Attempted Admi-nistrator Privilege Gain] [Priority: 1] {TCP}

192.168.1.22:17123 -> 192.168.1.21:80

Теперь атакующая система FreeBSD-Attacker может попробовать запустить ping-пакеты на

IPS-сенсор. Чтобы продемонстрировать работу IPS, на атакующей машине мы будем выводить

сообщения с помощью команд printf и netcat, которые и сформируют HTTP-запрос для посылки на

сервер Apache.

В Листинге 8 приведен правильный HTTP-запрос, за которым следует попытка

получить нужный файл.

Первый запрос был отправлен веб-серверу Apache и от него был получен ответ HTTP 200 OK. Во

втором запросе в адресное поле включена строка /etc/passwd. Этот запрос Snort заблокировал,

но пропустил на обработку серверу Apache.

В Листинге 9 приводится сообщение из

/var/log/messages, т.к. Snort был настроен на использование syslog для сохранения

лог-данных.

Сложные конфигурации могут учитывать частные сети, располагающиеся за экраном FreeBSD-IPS, защищающим таким образом эти сетевые сегменты от атак. В сегодняшнем примере мы использовали только одну сигнатуру, чтобы продемонстрировать функционал по блокировке атаки. Можно найти свободно-распространяемые в сети образцы правил, такие как Emerging Threats, а также зарегистрированные правила с сайт Source-fire, которые вы можете задействовать для защиты собственной системы или сети от вредоносных атак.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *