• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

Статья Поднимаем IDS SNORT для обнаружения хакера в сети

Всем доброго дня. На одной из страниц форума мне попадалось обсуждение темы: как обнаружить вторжение в корпоративную сеть. Я пообещал снять видео на эту тему, однако понял, что оно получится долгое и не интересное, поэтому решил написать статью. Возможно кто-то ее использует как мануал к действию.

Начнем с теории.

Изначально, после попадания в сеть, хакер начинает ее изучать. Это, в первую очередь, различные приемы сканирования, а значит генерация большого объема трафика, который в штатном режиме не используется в больших количествах. Вот именно по трафику и можно вычислить несанкционированный доступ. Для этого применяются 2 вида программного или аппаратного обеспечения: IPS и IDS.

IDS ( ) или система обнаружения вторжений представляет собой программный или аппаратный комплекс, который устанавливается в сети и анализирует трафик на предмет «нежелательного». Существует огромное количество разновидностей данной системы, однако по функционалу они слабо различаются: есть IDS, которые анализируют только трафик, либо есть дополнительные функции, которые могут отслеживать изменения на серверах и компьютерах. Чисто сетевые IDS называются NIDS. При выявлении подозрительного трафика все записывается в лог, и создается событие, по которому можно обнаружить взломщика.

IPS ( ) или система предотвращения атак – это аналогичная система, но с дополнительными функциями. Например, если система «видит» подозрительный трафик, она, к примеру, блокирует порт коммутации c источником.

С теорией более и менее разобрались, можно приступить к практике.

Поднимаем SNORT.

Мой выбор пал на опенсорсный продукт SNORT. Это довольно простая IDS с множеством дополнительных скриптов и приложений. Ну и если учесть тот факт, что ее поддерживает компания с громким названием CISCO, то ей можно доверить данную задачу.
В качестве операционной системы для SNORT-сервера выступает Ubuntu16.04.1

Первым делом настраиваем сетевой интерфейс на статический ip-адес. Я тут эту процедуру описывать не буду. В конце файла добавляем пару строк:

Код:
post-up ethtool -K eth0 gro off
post-up ethtool -K eth0 lro off

Перезагружен и настраиваем сетевой интерфейс

sudo ifconfig enp0s3 down && sudo ifconfig enp0s3 up

Далее создадим папку, в которую будем складывать исходники и скачиваем и устанавливаем систему сбора данных DAQ:

Код:
mkdir snort
cd snort
wget https://snort.org/downloads/snort/daq-2.0.6.tar.gz
tar -xvzf daq-2.0.6.tar.gz
cd daq-2.0.6
./configure
make
sudo make install



Далее ставим сам SNORT:

Код:
 cd ~/snort_src
wget https://www.snort.org/downloads/snort/snort-2.9.12.tar.gz
tar -xvzf snort-2.9.12.tar.gz
cd snort-2.9.12
./configure --enable-sourcefire --disable-open-appid
make
sudo make install
sudo ldconfig
sudo ln -s /usr/local/bin/snort /usr/sbin/snort

Создаем отдельного пользователя для нашей IDS:

Код:
 sudo groupadd snort
sudo useradd snort -r -s /sbin/nologin -c SNORT_IDS -g snort

Теперь необходимо раздать соответствующие права, создать папки и распихать конфигурационные файлы:

Код:
 sudo mkdir /etc/snort
sudo mkdir /etc/snort/rules
sudo mkdir /etc/snort/rules/iplists
sudo mkdir /etc/snort/preproc_rules
sudo mkdir /usr/local/lib/snort_dynamicrules
sudo mkdir /etc/snort/so_rules
sudo touch /etc/snort/rules/iplists/black_list.rules
sudo touch /etc/snort/rules/iplists/white_list.rules
sudo touch /etc/snort/rules/local.rules
sudo touch /etc/snort/sid-msg.map
sudo mkdir /var/log/snort
sudo mkdir /var/log/snort/archived_logs
sudo chmod -R 5775 /etc/snort
sudo chmod -R 5775 /var/log/snort
sudo chmod -R 5775 /var/log/snort/archived_logs
sudo chmod -R 5775 /etc/snort/so_rules
sudo chmod -R 5775 /usr/local/lib/snort_dynamicrules
sudo chown -R snort:snort /etc/snort
sudo chown -R snort:snort /var/log/snort
sudo chown -R snort:snort /usr/local/lib/snort_dynamicrules
cd ~/snort/snort-2.9.12/etc/
sudo cp *.conf* /etc/snort
sudo cp *.map /etc/snort
sudo cp *.dtd /etc/snort
cd ~/snort/snort-2.9.12/src/dynamic-preprocessors/build/usr/local/lib/snort_dynamicpreprocessor/
sudo cp * /usr/local/lib/snort_dynamicpreprocessor/



Так как заведовать правилами будет заведовать специальный скрипт PulledPork, нам необходимо отключить возможность скачивания правил самим Snort при запуске. Для этого комментируем все строки с 457-й по 651-ю в файле /etc/snort/snort.conf:

sudo sed -i 's/include \$RULE\_PATH/#include \$RULE\_PATH/' /etc/snort/snort.conf
Следующим шагом вносим поправки в тот же самый конфигурационный файл:

Строка 45: указываем нашу сеть.
Строка 104: меняем на var RULE_PATH /etc/snort/rules.
Строка 105: меняем на var SO_RULE_PATH /etc/snort/so_rules.
Строка 106: меняем на var PREPROC_RULE_PATH /etc/snort/preproc_rules.
Строка 113: меняем на var WHITE_LIST_PATH /etc/snort/rules/iplists.
Строка 114: меняем на var BLACK_LIST_PATH /etc/snort/rules/iplists.
Строка 546: необходимо раскомментировать include $RULE_PATH/local.rules для возможности использовать свои правила.
Строка 521: ниже нее необходимо добавить строку output unified2: filename snort.u2, limit 128.
Строка 548: необходимо добавить строку include $RULE_PATH/snort.rules.



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

sudo snort -T -c /etc/snort/snort.conf -i enp0s3

Если консоль покажет «Snort successfully validated the configuration! Snort exiting», то все в порядке, и можно переходить к сующему шагу.

Следующим шагом установим Barnyard2. Он нужен для снятия нагрузки с сервера. Обращу внимание, что для работы нужен будет mysql, который будет параллельно установлен. Так вот он попросит ввести пароль root. Обязательно запиши его, долго смотри, запомни, бумажку сожги, а пепел, желательно, над рекой с высокого моста :=)

Код:
 sudo apt-get install -y mysql-server libmysqlclient-dev mysql-client autoconf libtool
cd ~/snort_src
wget https://github.com/firnsy/barnyard2/archive/master.tar.gz -O barnyard2-Master.tar.gz
tar zxvf barnyard2-Master.tar.gz
cd barnyard2-master
autoreconf -fvi -I ./m4
sudo ln -s /usr/include/dumbnet.h /usr/include/dnet.h
sudo ldconfig
./configure --with-mysql --with-mysql-libraries=/usr/lib/i386-linux-gnu
make
sudo make install

Следующей командой можно проверить работоспособность сея программного обеспечения:

Код:
 /usr/local/bin/barnyard2 –V

Теперь снова придется копировать файлы, создавать папки и раздавать права:

Код:
 sudo cp ~/snort/barnyard2-master/etc/barnyard2.conf /etc/snort/
sudo mkdir /var/log/barnyard2
sudo chown snort.snort /var/log/barnyard2
sudo touch /var/log/snort/barnyard2.waldo
sudo chown snort.snort /var/log/snort/barnyard2.waldo

Следующим шагом нам придется задействовать в работе MySQL:

Код:
 mysql -u root -p
mysql> create database snort;
mysql> use snort;
mysql> source ~/snort/barnyard2-master/schemas/create_mysql
mysql> CREATE USER 'snort'@'localhost' IDENTIFIED BY 'snortpass';
mysql> grant create, insert, select, delete, update on snort.* to 'snort'@'localhost';
mysql> exit

Добавляем в конец файла /etc/snort/barnyard2.conf строку output database: log, mysql, user=snort password=snortpass dbname=snort host=localhost sensor name=sensor01. И снова манипуляция с правами:

Код:
 sudo chmod o-r /etc/snort/barnyard2.conf

Отлично! Пришло время самопроверки. Добавляем в файл /etc/snort/rules/local.rules следующую строку:

Код:
 alert icmp any any -> $HOME_NET any (msg:"ICMP test detected"; GID:1; sid:10000001; rev:001; classtype:icmp-event;

Это наше первое правило для проверки отслеживания ICMP-пакетов (ping). В файл /etc/snort/sid-msg.map необходимо дописать еще две строчки:

Код:
 `#v2`
1 || 10000001 || 001 || icmp-event || 0 || ICMP Test detected || url,tools.ietf.org/html/rfc792

Следующей командой мы запустим нашу NIDS в режиме демона. В общем-то он так и будет работать всегда.

Код:
 sudo /usr/local/bin/snort -q -u snort -g snort -c /etc/snort/snort.conf -i enp0s3 –D

Теперь запустим Barnyard2:

Код:
 sudo barnyard2 -c /etc/snort/barnyard2.conf -d /var/log/snort -f snort.u2 -w /var/log/snort/barnyard2.waldo -g snort -u snort

Пингуем наш SNORT-сервер, и, если получены оповещения (алармы), то все в порядке, и можно продолжить.

Пришло время разобраться с правилами для SNORT. Изначально их надо бы загружать самому, но зачем, если есть специальный скрипт (PulledPork), который может это все выполнить за нас? Давай поставим:

Код:
 sudo apt-get install -y libcrypt-ssleay-perl liblwp-useragent-determined-perl
cd ~/snort
wget https://github.com/shirkdog/pulledpork/archive/master.tar.gz -O pulledpork-master.tar.gz
tar xzvf pulledpork-master.tar.gz
cd pulledpork-master/
sudo cp pulledpork.pl /usr/local/bin
sudo chmod +x /usr/local/bin/pulledpork.pl
sudo cp etc/*.conf /etc/snort

На этом моменте необходимо зайти на официальный сайт SNORT. Регистрируемся, и в личном кабинете находим свой onilkode. Когда эта информация будет «на руках», переходим в файл /etc/snort/pulledpork.conf и вносим следующие правки:

Код:
 Строка 19: вводим свой oinkcode (rule_url=https://www.snort.org/reg-rules/|snortrules-snapshot.tar.gz).
Строка 29: необходимо раскомментировать rule_url=https://rules.emergingthreats.net/|emerging.rules.tar.gz|open-nogpl.
Строка 74: меняем путь к правилам на rule_path=/etc/snort/rules/snort.rules.
Строка 89: меняем путь к нашим правилам на local_rules=/etc/snort/rules/local.rules.
Строка 92: приводим к виду sid_msg=/etc/snort/sid-msg.ma.
Строка 96: выставляем вторую версию (sid_msg_version=2).
Строка 119: указываем путь к конфигу Snort (config_path=/etc/snort/snort.conf).
Строка 133: указываем дистрибутив (distro=Ubuntu-16-04).
Строка 141: меняем путь к black_list на /etc/snort/rules/iplists/black_list.rules.
Строка 150: приводим к виду IPRVersion=/etc/snort/rules/iplists.

Запускаем его, и ждем пока скачаются правила:

Код:
 sudo /usr/local/bin/pulledpork.pl -c /etc/snort/pulledpork.conf –l

PulledPork сам будет проверять наличие новых правил и добавлять новые, надо только добавить его запуск в планировщик:

Код:
 sudo crontab -e
03 02 * * * /usr/local/bin/pulledpork.pl -c /etc/snort/pulledpork.conf –l

Остался последний шаг. Для удобства просмотра оповещений есть масса интерфейсов. Я выбрал BASE, поэтому приступим к его установке:

Код:
 sudo add-apt-repository ppa:ondrej/php
sudo apt-get update
sudo apt-get install -y apache2 libapache2-mod-php5.6 php5.6-mysql php5.6-cli php5.6 php5.6-common php5.6-gd php5.6-cli php-pear php5.6-xml
sudo pear install -f --alldeps Image_Graph
cd ~/snort
wget https://sourceforge.net/projects/adodb/files/adodb-php5-only/adodb-520-for-php5/adodb-5.20.8.tar.gz
tar -xvzf adodb-5.20.8.tar.gz
sudo mv adodb5 /var/adodb
sudo chmod -R 755 /var/adodb
cd ~/snort
wget http://sourceforge.net/projects/secureideas/files/BASE/base-1.4.5/base-1.4.5.tar.gz
tar xzvf base-1.4.5.tar.gz
sudo mv base-1.4.5 /var/www/html/base/
cd /var/www/html/base
sudo cp base_conf.php.dist base_conf.php

Теперь приводим некоторые строки в файле /var/www/html/base/base_conf.php к виду, как показано ниже:

Код:
 $BASE_urlpath   = '/base';
$DBlib_path     = '/var/adodb/';
$alert_dbname   = 'snort';
$alert_host     = 'localhost';
$alert_port     = '';
$alert_user     = 'snort';
$alert_password = 'snortpass';

Естественно, необходимо изменить права, чтобы никто не увидел пароль в файле:

Код:
 sudo chown -R www-data:www-data /var/www/html/base
sudo chown -R www-data:www-data /var/www/html/base

Перезапускаем Apache. Открываем браузер и идем по адресу (айпишник указывай свой) . Нажимаем кнопку Create BASE AG в правом верхнем углу. В случае успеха будут созданы базовые таблицы, роли и все, что необходимо для дальнейшей работы.

На этом установка данного детища закончена. Поставить его лучше сразу за сетевым оборудованием, которое смотрит за NAT, чтобы SNOTR мог анализировать весь трафик, поступающий с интернета. Так же несколько сенсоров можно распределить по сети. «Из коробки» это ПО мало полезно, поэтому советую изучить правила, так как большинство из стандартных необходимо будет закомментировать, иначе будет куча ложных срабатываний. Но при правильном использовании и настройке руками из плеч - это довольно мощный инструмент, тем более бесплатный.

Это моя первая статья данного формата, поэтому критику принимаю в полной мере. Всем спасибо
19.png
 

HakJob

Green Team
17.04.2018
248
167
BIT
0
вопрос задавал я ))

Я правильно понимаю, что данная технолония применима как для серверов копр сетей так и для VDS?
 

8bit

The Codeby Youtube
Green Team
09.04.2018
19
122
BIT
0
вопрос задавал я ))

Я правильно понимаю, что данная технолония применима как для серверов копр сетей так и для VDS?
Обычно это применяется в корпоративных сетях, однако, если между VDS есть VPN, или что-то в этом духе, то можно ее туда воткнуть:=)
 

AkSs

New member
12.08.2018
1
0
BIT
0
А как в SNORT или в Suricata правильно написать правило для декодирования base64 в пришедшем пакете? И можно ли писать свои обработчики для правил?
Допустим есть следующий smtp-пакет, внизу как видно есть блок base64. Нужно декодить, найти там строку ";echo " и выдать alert
)PiaIaEo @@CA?A?ILu#E¬ ,Oajd
S·IIuVyContent-Type: multipart/mixed; boundary="===============1435613147286379484=="
MIME-Version: 1.0
Subject: harakiri
From: harakiri@exploit.db
To: root@haraka.test

--===============1435613147286379484==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit

harakiri
--===============1435613147286379484==
Content-Type: application/octet-stream; Name="harakiri.zip"
MIME-Version: 1.0
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="harakiri.zip"

UEsDBBQAAAAIAOysO04A0nYabAEAAI0BAAA8AAAAYSI7bWtkaXIgL2hvbWUvaWJrcy9ib3MzX25l
dy9oYXJha2FfdGVzdF9leHBsb2l0O2VjaG8gImEuemlwC/BmZhFhYGDgYHizxtpPfFmDujAjAwM7
MwMDD1A0I7EoMTuzKFOvpKJkauDpvGYDgT2/td0eTfIwVZHJENn6fVV8wMpXicx8Zae8Nyz58P3p
xA9cQVenSqwvT7uenBOZcXhT1R792ISw3YnuPV18raYzL110Pu6V29C56O+RpP3LJCddvPp4yu6d
E2f+mntVbe3hueJxYp/zDNbq7um5fXNK5bYvn37EX9v7Z25vvsleRpZ/0k7LhJZLyW9d7/uV5fph
a1XVp6Z37v6TDDrlF1RqY9e5f0Fw30mXbfOPMa9fpePF6xzsd79FhXdKreaFV1xT40P7pofv+HbQ
LuFzckTzjJPXN3pJRIa0qTH+zFl3ROuGWXDrBLdDKs+/cJydI+p+nHP2vk9X5F5/OW6R/3fS1MAn
b/bObefNZo0PFtLaoHbsZohWRlBwzlH9AG9GJhEG3MEHAw2MDGiBGeDNygYSYwRCKyBtC1YBAFBL
AQIUABQAAAAIAOysO04A0nYabAEAAI0BAAA8AAAAAAAAAAAAAACAAQAAAABhIjtta2RpciAvaG9t
ZS9pYmtzL2JvczNfbmV3L2hhcmFrYV90ZXN0X2V4cGxvaXQ7ZWNobyAiYS56aXBQSwUGAAAAAAEA
AQBqAAAAxgEAAAAA
--===============1435613147286379484==--
.

То, что я нарыл в документации и на разных англоязычных форумах это:
Код:
alert tcp any any -> any 25 (msg: "Detected"; base64_decode:relative; base64_data; content: ";echo ";)
Но сколько я не старался, я не смог заставить это шайтан-правило заработать))
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!