*SNORT представляет собой систему IDS (Intrusion Detection System) с открытым исходным кодом, которая позволяет обнаружить любую подозрительную сетевую активность, сравнивая встроенные правила обнаружения вредоносного траффика с данными, проходящими по локальной сети организации. Фактически, так работает любой антивирус, но сходство на этом заканчивается, потому что предназначение у этих систем совершенно разное, очень важно правильно понимать цели и задачи систем IDS и не путать их с другими средствами защиты.* --- Система IDS предназначена для того, чтобы блокировать действия злоумышленника на стадии изучения вашей сети: * обнаружить подозрительную сетевую активность, * выявить известные инструменты для анализа и взлома сетей, используемые злоумышленником * при возможности воспрепятствовать противоправной деятельности. Обычно эта задача не выполняется другими средствами, например, брандмауэром, который лишь ставит барьер на входе в локальную сеть. Антивирус отлавливает известные вирусные сигнатуры, но контроль за траффиком внутри локальной сети никак не осуществляется, а в большинстве организаций он вообще отсутствует. Представьте, что одна из рабочих станций в локальной сети заражена новым, ранее неизвестным трояном. В этом случае, антивирусная программа не сможет его отследить и обезвредить, так как соответствующая сигнатура просто отсутствует в ее памяти. В то же время, все трояны нацелены на выполнение одной задачи – перехватить конфиденциальную информацию и отправить ее вирусописателю, а отправку конфиденциальной информации можно просто пресечь с помощью IDS SNORT. Сканирование сетевых ресурсов с целью выявления слабых мест сети также не пресекается ни антивирусом, ни брандмауэром, хотя это и важно, так как разведка никогда не проводится просто так, часто за этим следует нападение.Snort – это система обнаружения вторжений (IDS) и система предотвращения вторжений (IPS). Это открытый исходный код. # Настройка и установка Snort * Рекомендуемый минимум 4 Гб ОЗУ и многоядерный процессор (минимум 2 ядра для работы с ОС) * Инструкции предполагают, что это будет установлено на Ubuntu Server 20.04 (будет аналогично на других версиях и дистрибутивах, в которых в качестве основы был использован Debian) * Ваше сетевой подключение может быть разным, не обязательно, что это будет eth0. Пишите под себя все, что у вас есть. Иногда мы используем ens160 в примерах. Для начала, обновите информацию об репозитории и при необходимости обновите систему, команды изображены на скринах: `sudo apt update -y` ![](https://i.imgur.com/eOCIWmG.png) `sudo apt upgrade -y` ![](https://i.imgur.com/QpVS5AY.png) Так же нужно установить некоторые необходимые компоненты, оно также изображено на скрине: `sudo apt install -y build-essential automake libpcap-dev libpcre3-dev libdumbnet-dev bison flex zlib1g-dev liblzma-dev openssl libssl-dev libnghttp2-dev` ![](https://i.imgur.com/pmqgiPU.png) Установим некоторые рекомендуемые пакеты: `sudo apt install -y openssh-server ethtool` ![](https://i.imgur.com/E6NUhYj.png) # DAQ – Data acquisition library Нам нужно скачать, построить и установить библиотеку сбора данных (DAQ). Скачать файл можно двумя способами: скачать вручную из интернета или же скачивание через терминал. Рассмотрим оба варианта. 1. Скачивание через браузер ![](https://i.imgur.com/T05hyNm.png) Нажимаем на браузер, в поиске вбиваем такую ссылку ![](https://i.imgur.com/hQhYkYj.png) Если встретили вот такую картину, то надо подключать VPN. ![](https://i.imgur.com/74MTexx.png) # VPN Lantern известен многим, как VPN-сервис, позволяющий обходить блокировки. Также он является бесплатным и можно установить на Windows, Mac, iOS Android и Ubuntu. 1.1 Заходим на официальный сайт программы – https://getlantern.org/ruRU/index.html и сразу скачиваем файл. ![](https://i.imgur.com/AbegF7w.png) 1.2 Зайдем в папку в который загрузился DEB файл и выполняем следующую команду, которая на скрине: `sudo dpkg –i lantern-installer-64-bit.deb` ![](https://i.imgur.com/UCBkTTO.png) 1.3 По окончанию процесса появится такой ярлык в списке программ. ![](https://i.imgur.com/PS0U7kX.png) 1.4 После первого запуска при работе сеанса – появляется такой значок с выпадающем меню. Теперь можно графически подключаться и отключаться. ![](https://i.imgur.com/EVcbab6.png) Теперь возвращаемся к первоначальной теме, с подключенным VPN снова пытаемся зайти на официальный сайт. Как можно заметить – свинья приоткрыла дверь. ![](https://i.imgur.com/rnhu6Zf.png) Нужно зарегистрироваться на их сайте, для допуска скачивания разных файлов. Скачиваем то, что нужно, пока что нам нужен файл daq. 2. Скачивание через терминал Можно вот такой командой но, как можно заметить доступ на скачивание не дают. Все-таки нужен полноценный VPN. ![](https://i.imgur.com/YjcdH3f.png) Продолжим дальше. Теперь нам нужно зайти в папку загрузки и разархивировать скаченный файл, команды показаны на скрине: ``` cd Downloads ls tar -zxvf daq-2.0.7.tar.gz ``` ![](https://i.imgur.com/YAj1KNs.png) В DAQ осталось только построить и установить, для этого нам нужно зайти в еще одну папку, которая была распакована и выполнить несколько команд, которые будут на скрине: ``` cd daq-2.0.7 ./configure && make && sudo make install ``` ![](https://i.imgur.com/pcbwnJj.png) # Установка SNORT Установим конкретную протестированную версию LuaJIT, которая отличается от той, что есть в репозитории. Для этого будем скачивать его через терминал, разархивируем его, зайдем в папку и опять будем собирать, как в DAQ. Все команды изображены на скриншотах: ``` cd Downloads wget http://luajit.org/download/LuaJIT-2.0.2.tar.gz tar xvfz LuaJIT-2.0.2.tar.gz cd LuaJIT-2.0.2/ make sudo make install ``` ![](https://i.imgur.com/6zv7hd8.png) ![](https://i.imgur.com/iBzKsko.png) ![](https://i.imgur.com/LTSrqs4.png) ![](https://i.imgur.com/AAFc7Sa.png) Загрузка, сборка и установка Snort. Так же захотим на официальный сайт и скачиваем уже файл снорт. ![](https://i.imgur.com/NwpOBAw.png) Все также захотим в файл загрузки, разархивируем и собираем. Все команды указаны на скринах: ``` cd Downloads tar xvzf snort-2.9.16.tar.gz cd snort-2.9.16 ./configure --enable-sourcefire && make && sudo make install ``` ![](https://i.imgur.com/MKe2Hnx.png) ![](https://i.imgur.com/KAvtkUu.png) По окончанию запустите ldconfig для обновления разделяемых библиотек: `sudo ldconfig` ![](https://i.imgur.com/Yyg6Lmp.png) Создайте ссылку, если хотите. Исходный двоичный файл был на пути по умолчанию, поэтому вам это может не понадобиться. Команда показана на скрине: `sudo ln -s /usr/local/bin/snort /usr/sbin/snort` ![](https://i.imgur.com/rQ1Ww1y.png) Проверяем, живой снорт или нет, если он живой то ват отреагирует терминал: `snort -V` ![](https://i.imgur.com/xSueKTZ.png) Если честно то, при неправильной сборке – он тоже запускается но, ниже будет приписка, что он не будет работать так как сборка неверно была собрана и тогда надо будет заново пересобрать. # Правила и конфигурация Snort Существует три типа правил, которые вы можете скачать для snort: * правила сообщества; * зарегистрированные правила (нужна учетная запись, такая же, как у подписчика, но не выпущена так быстро); * правила для абонентов (необходимо заплатить). Oinlcode – если вы зарегистрируете учетную запись, вам будет предоставлен код, называем Oinkcode. Это уникально для каждого пользователя и позволит вам загружать зарегистрированные правила или правила подписчиков, если вы заплатили за них. PulledPork – это инструмент может помочь вам поддерживать ваши правила в актуальном состоянии. Создадим отдельного пользователя и группу для snort. `sudo groupadd snort sudo useradd snort -r -s /sbin/nologin -c SNORTIDS -g snort` ![](https://i.imgur.com/3usEjsN.png) Создадим ожидаемые файлы и каталоги: ``` sudo mkdir /etc/snort sudo mkdir /etc/snort/rules sudo mkdir /etc/snort/rules/iplists sudo mkdir /etc/snort/preprocrules sudo mkdir /etc/snort/sorules sudo mkdir /usr/local/lib/snortdynamicrules sudo mkdir /var/log/snort sudo mkdir /var/log/snort/archivedlogs sudo touch /etc/snort/rules/whitelist.rules sudo touch /etc/snort/rules/blacklist.rules sudo touch /etc/snort/rules/local.rules sudo touch /etc/snort/sid-msg.map ``` ![](https://i.imgur.com/Ncz1yZ8.png) Настройте разрешения: ``` sudo chmod -R 5775 /etc/snort/ sudo chmod -R 5775 /var/log/snort/ sudo chmod -R 5775 /usr/local/lib/snortdynamicrules ``` ![](https://i.imgur.com/3t6Tu4M.png) Смените владельца на пользователя Snort: ``` sudo chown -R snort:snort /etc/snort sudo chown -R snort:snort /var/log/snort sudo chown -R snort:snort /usr/local/lib/snortdynamicrules ``` ![](https://i.imgur.com/Pp2ei3d.png) ``` cd snort Downloads cd snort-2.9.19/etc sudo cp .conf /etc/snort sudo cp .map /etc/snort sudo cp .dtd /etc/snort cd .. ``` ![](https://i.imgur.com/LQtCfyI.png) ``` cd /src/dynamic-preprocessors/build/usr/local/lib/snortdynamicpreprocessor/ sudo cp -avr /usr/local/lib/snortdynamicpreprocessor/ ``` ![](https://i.imgur.com/9fMdhIi.png) Заходим на официальный сайт и скачиваем community-rules.tar.gz и разархивруем. ![](https://i.imgur.com/RkR5k0l.png) `sudo tar -xvzf community-rules.tar.gz -C /etc/snort/rules` ![](https://i.imgur.com/xu4vikz.png) Отредактируйте файл snort.conf, через редактор nano, команда показана ниже, на скрине: `sudo nano /etc/ snort/snort.conf` ![](https://i.imgur.com/6ahzryr.png) ``` var RULEPATH /etc/snort/rules var SORULEPATH /etc/snort/sorules var PREPROCRULEPATH /etc/snort/preprocrules var WHITELISTPATH /etc/snort/rules var BLACKLISTPATH /etc/snort/ include $RULEPATH/local.rules ``` Как было: ![](https://i.imgur.com/2R3Su8J.png) ![](https://i.imgur.com/NZyjtxh.png) После редакции: ![](https://i.imgur.com/WvmjdKZ.png) ![](https://i.imgur.com/X3evxWv.png) Протестировать конфигурацию snort: `snort -T -i eth0 -c /etc/snort/snort.conf` ![](https://i.imgur.com/sddY50b.png) Как вы заметили, появилась ошибка. Попробуем ее исправить. Один из вариантов, который можно попробовать – это комментировать пути к правилам, которые вызывают проблемы. Комментирование строки, содержащей app-detect.rules, приведет к тому, что при запуске snort ошибка изменится и будет ссылаться на другой путь правила. Вы можете прокомментировать все это вручную, добавив перед ним «#» или использовать следующую строку кода: `sed -i "s/include \$RULE\PATH/#include \$RULE\PATH/" /etc/snort/snort.conf` ![](https://i.imgur.com/BHjDLa7.png) Проверяем снова как и до этого: ![](https://i.imgur.com/6xKothT.png) Как можно заметить, задач выполнено больше и другая уже ошибка. Продолжаем исправлять. Насчет данной ошибки пишут, что файлы белого и черного списка требуются процессором репутации. Установка Snort по умолчанию не создает файлы списка, но их создание зависит от вас. Ошибку легко исправить и при написании инструкции была допущена. Просто напишите в терминале еще раз команду, которая на скрине: ![](https://i.imgur.com/Dax75rj.png) Делаем снова проверку и итоговый результат будет таким: ![](https://i.imgur.com/v8RJqvJ.png) ![](https://i.imgur.com/hKcA6Hk.png) # Написание правил Snort Правила для Snort делятся на два вида: * бесконтекстные (обычные) – применяются для каждого пакета отдельно, без связи с другими пакетами; * контекстные (правила препроцессоров) – применяются к той или иной совокупности (последовательности) пакетов. Правила Snort состоят из заголовка (Rule Header) и опций (Rule Options). Заголовок содержит описание действия, протокол передачи данных, IP-адреса, сетевые маски и порты источника и назначения. После заголовка правила следует необязательная часть правила – его опции, они включают определение дополнительных критериев выполнения правила и определение дополнительных реагирующих действий. Они используются для организации более жесткой и направленной фильтрации траффика. Весь набор опций заключается в круглые скобки, сами опции отделяются друг от друг с помощью точки с запятой « ; » (последняя опция в списке тоже должна заканчиваться этим символом). Ключевые слова (keywords) опций отделяются от своих аргументов (values) двоеточием « : » . Структура правил Snort в общем случае выглядит следующим образом: | Заголовок | Заголовок | Заголовок | Заголовок | Заголовок | Заголовок | Заголовок | Опции | Опции | Опции | Опции | | -------- | -------- | --- | --- | --- | --- | --- | --- | --- | --- | -------- | | Действие | Протокол | IP-адреса отправителей | Порты отправителей |Оператор направлений | IP-адреса получателей | Порты получателей | [Мета данные] | [Данные в полезной нагрузке] | [Данные в заголовке] | [Действие после обнаружения] | Синтаксис записи правил Snort: <Действие> <Протокол> <IP-адреса отправителей> <Порты отправителей> <Оператор направления> <IP-адреса получателей> <Порты получателей> (ключ1 : значение1; ключ2 : значение2; ... ключN : значениеN;) **Заголовок правила** Допустимые параметры для каждого поля заголовка правил Snort: **Действия правила** | Действие | Описание | | -------- | ----------------------------------------------------------------------------------------------------------- | | dynamic | остаётся пассивным, пока не активируется динамическим правилом, затем действует как log | | activate | генерирует предупреждение, затем включает указанное динамическое пр | | pass | игнорирует пакеты | | log | просто протоколирует пакеты без предупреждений | | alert | генерирует предупреждение, используя указанное предупреждение, и передаёт информацию системе журналирования | В режиме inline к предыдущим действиям добавляются дополнительные действия: | Действие | Описание | | -------- | -------- | | drop |блокирует (отбрасывает) пакет и передаёт информацию системе журналирования | | sdrop |блокирует (отбрасывает) пакет и не использует систему журналирования | | reject | блокирует (отбрасывает) пакет, передаёт информацию системе журналирования, а затем посылает сегмент сброса TCP (TCP RST), если протокол TCP, или сообщение ICMP-порт недоступен, если протокол UDP | Также можно создать свои собственные типы правил и связать один или несколько выходных модулей с ними. Можно затем использовать созданные типы правил в качестве действий в правилах Snort. В примере ниже создаётся тип правила, который будет регистрировать только tcpdump: ``` ruletype suspicious { type log output logtcpdump: suspicious.log } ``` А в этом примере создаётся тип правила, регистрирующей и tcpdump, и syslog: ``` ruletype redalert { type alert output alertsyslog: LOGAUTH LOGALERT output logtcpdump: suspicious.log } ``` **Протоколы** Обозначает протокол передачи данных. На данный момент Snort умеет анализировать на предмет подозрительного содержания/поведения 4 типа протоколов: TCP, UDP, ICMP, IP, соответственно, возможны 4 значения: tcp, udp, icmp или ip, что означает любой IP-протокол. В будущем, возможно, этот список пополнят и другие протоколы, к примеру, ARP, IGRP, GRE, OSPF, RIP, IPX и другие. **IP-адресация** Поскольку Snort не имеет встроенного механизма получения IP адреса, используя доменное имя, то нужно указывать конкретный IP адрес или же диапазон IP адресов. В этом параметре можно использовать маски. Адреса задаются в формате: IP/mask, где IP – IP-адрес сети или узла, mask – маска сети, которая задаётся как десятичное число, которое равняется числу единиц в двоичной маске. Например, для сетей класса C /24 (число 24 эквивалентное шестнадцатеричной маске FF.FF.FF.0), для сетей класса B - /16, также можно использовать маску /32 и другие. Здесь может применяться и отрицание (инвертирование), обозначаемое символом “!” (Например: !127.0.0.1). Если вместо IP адреса указать ключевое слово any, то это будет подразумевать абсолютно все хосты. Для указания списка можно использовать перечисление IP адресов через “,” содержащихся в квадратных скобках. (Например: [212.116.1.1,10.10.1.0/24]). В качестве IP-адреса можно использовать переменные HOMENET, EXTERNALNET и другие. **Порты** После IP адреса указывается номер порта, с которого отсылаются данные и на который приходят. Можно указать диапазон портов: 1:1024 (все порты в диапазоне от 1 до 1024 включая 1 и 1024). Часто используется оператор отрицания “!” (Например: !123:321 исключает все порты в диапазоне от 123 до 321). Если опущен один из параметров диапазона, например “:321” или “123:”, то пропускаемый параметр принимает крайнее значение общего количества портов, то есть 0 или 65535. **Операторы направления** Оператор направления служит для обозначения направления траффика, для которого применяется правило, и обозначается “->” (знаком минуса и закрывающей угловой скобкой). IP-адрес и номер порта слева от оператора определяют источник траффика, а справа от него - назначение. Существует также оператор так называемой “двунаправленности” и обозначается “<>” (двумя угловыми скобками). Этот оператор говорит Snort рассматривать указанные пары адресов и портов в обе стороны, вне зависимости от того, кто является источником, а кто – получателем. Это удобно в тех случаях, когда нужно сохранить траффик от обеих сторон, например, в Telnet или POP3 сессиях. Важно отметить, что оператор “<-“ не существует. **Опции правила** Все опции можно разделить на четыре большие категории: * general (meta-data) - данные опции предоставляют информацию о правиле, но никак не влияют на обнаружение; * payload - данные опции позволяют искать информацию внутри полезной нагрузки (данных пользователя) пакетов и могут быть взаимосвязаны; * non-payload - данные опции позволяют искать информацию внутри служебной (управляющей) информации о пакете (заголовке); * post-detection - данные опции являются определёнными триггерами, указывающими задачи, которые необходимо осуществить после срабатывание правила. **General (meta-data)** * msg Указывает сообщение, текстовое описание сигнала тревоги (для экранирования используется символ “"), которое будет выведено или же записано, используя систему журналирования. Синтаксис: msg:"<message text>"; Примеры: * reference Указывает ссылки на online системы идентификации атак. Значениями этого поля могут быть ссылки на ресурсы bugtraq, cve, nessus, arachnids, mcafee и другие url. Идентификация осуществляется по SID номерам. Поддерживаемые системы: * bugtraq: http://www.securityfocus.com/bid/ * cve: http://cve.mitre.org/cgi-bin/cvename.cgi?name= * nessus: http://cgi.nessus.org/plugins/dump.php3?id= * arachnids: (в данный момент не работает) http://www.whitehats.com/info/IDS * mcafee: http://vil.nai.com/vil/content/v * osvdb: http://osvdb.org/show/osvdb/ * msb: http://technet.microsoft.com/en-us/security/bulletin/ * url: http:// Синтаксис: reference:<id system>, <id>; [reference:<id system>, <id>;] Примеры: alert tcp any any -> any 7070 (msg:"IDS411/dos-realaudio"; \ flags:AP; content:"|fff4 fffd 06|"; reference:arachnids,IDS411;) alert tcp any any -> any 21 (msg:"IDS287/ftp-wuftp260-venglin-linux"; \ flags:AP; content:"|31c031db 31c9b046 cd80 31c031db|"; \ reference:arachnids,IDS287; reference:bugtraq,1387; \ reference:cve,CAN-2000-1574;) * gid Ключевое слово gid (generator id) используется для идентификации того, какая часть Snort генерирует событие, когда срабатывает конкретное правило. Например, gid равный 1 ассоциируется с подсистемой правил, а различные gid свыше 100 предназначены для определённых препроцессоров и декодеров. Опция gid является необязательной, и если она не определена в правиле, то по умолчанию она устанавливается равной 1, и правило будет являться частью общей подсистемы правил. Чтобы избежать потенциальных конфликтов с gid, определёнными в Snort, рекомендуется использовать значения начиная с 1000000. Для общих правил не рекомендуется использовать ключевое слово gid. Данная опция должна быть использована с опцией sid. Файл “etc/gen-msg.map” содержит больше информации о gid препроцессоров и декодеров. Синтаксис: gid:<generator id>; Примеры: alert tcp any any -> any 80 (content:"BOB"; gid:1000001; sid:1; rev:1;) * sid Ключевое слово sid (Snort id или иногда упоминается как signature id) используется для уникальной идентификации правил Snort. По значению его аргумента можно легко идентифицировать правило. Данное ключевое слово должно использоваться вместе с ключевым словом rev. Файл “sid-msg.map” содержит соответствие предупреждающих сообщений и идентификаторов правил Snort. Значения аргумента: ``` < 100 зарезервировано разработчиками 100 - 999.999 использованы в правилах, уже включенных в дистрибутив Snort = 1.000.000 можно использовать для собственных правил ``` Синтаксис: sid:<snort rules id>; Примеры: alert tcp any any -> any 80 (content:"BOB"; sid:1000983; rev:1;) * rev Указывает значение версии правила. С помощью REV интерпретатор правил Snort определяет версию написанного правила. Этот параметр используется в паре с SID. Синтаксис: rev:<revision integer>; Примеры: alert tcp any any -> any 80 (content:"BOB"; sid:1000983; rev:1;) * classtype Используется для присвоения категории атаки, к которой необходимо отнести правило, являющееся частью более общего класса атак. Snort предоставляет набор классов, которые используются предоставляемыми правилами по умолчанию. Классификация атак позволяет лучше организовать события, производимые Snort. Классификация атак представлена в файле “classification.conf”. В файле используется следующий синтаксис для каждой записи: config classification: <имя класса>,<описание класса>,<приоритет по умолчанию> Приоритет 1 (high) является наиболее высоким, а 4 (very low) - самым низким. Также классификация типов атак представлена в таблице: | Тип класса | Описание | Приоритет | | ------------------------------ | ------------------------------------------------------------------------------------------------------ | --------- | | attempted-admin | Попытка получения прав администратора | high | | attempted-user | Попытка получения прав пользователя | high | | inappropriate-content | Обнаружено неприемлемое (несоответствующее) содержание | high | | policy-violation | Потенциальное нарушение корпоративной конфиденциальности | high | | shellcode-detect | Обнаружен исполняемый код | high | | successful-admin | Успешное получение прав администратора (повышение привилегий) | high | | successful-user | Успешное получение прав пользователя (повышение привилегий) | high | | trojan-acivity | Обнаружена активность сетевой троянской программы | high | | unsuccessful-user | Неудачная попытка получения прав пользователя | high | | web-application-attack | Атака на Web-приложение | high | | attempted-dos | Предпринята попытка атаки отказ в обслуживании (DoS) | medium | | attempted-recon | Попытка утечки информации (разведка) | medium | | bad-unknown | Потенциально нежелательный траффик | medium | | default-login-attempt | Попытка входа с помощью стандартного логина/пароля | medium | | denial-of-service | Обнаружена атака отказ в обслуживании (DoS) | medium | | misc-attack | Прочие атаки | medium | | non-standard-protocol | Обнаружено использование нестандартного протокола или нестандартное событие | medium | | rpc-portmap-decode | Decode of an RPC Query (Декодирован удалённый вызов процедуры (RPC)) (Обнаружен запрос RPC) | medium | | successful-dos | Успешная DOS-атака | medium | | successful-recon-largescale | Крупномасштабная утечка информации | medium | | successful-recon-limited | Утечка информации | medium | | suspicious-filename-detect | Обнаружено подозрительное имя файла | medium | | suspicious-login | Обнаружена попытка входа с подозрительным логином | medium | | system-call-detect | Обнаружено обращение к ядру системы (system call) (Обнаружен системный вызов) | medium | | unusual-client-port-connection | Клиент использует нестандартный порт | medium | | web-application-activity | Доступ к потенциально уязвимому Web-приложению | medium | | icmp-event | Общее событие ICMP | low | | misc-activity | Прочая активность | low | | network-scan | Обнаружена попытка сканирования сети | low | | not-suspicious | Не являющийся подозрительным траффик | low | | protocol-command-decode | Generic Protocol Command Decode (Обнаружена попытка шифрования) (Обнаружена обычная команда протокола) | low | | string-detect | Обнаружена подозрительная строка | low | | unknown | Неизвестный траффик | low | | tcp-connection | Обнаружено TCP соединение |very low | Синтаксис: classtype:<class name>; Примеры: alert tcp any any -> any 25 (msg:"SMTP expn root"; flags:A+; content:"expn root"; nocase; classtype:attempted-recon;) > Предупреждения: > Опция classtype может иметь только те значения для классификации, которые определены в snort.conf с помощью config classification. Snort предоставляет стандартный набор классификации в файле classification.config, который используется в поставляемых наборах правил. * priority Задаёт правилам уровень важности. Возможно использовать параметр priority вместе с classtype, при этом изменится уровень приоритета параметра classtype. Синтаксис: priority:<priority integer>; Примеры: alert tcp any any -> any 80 (msg:"WEB-MISC phf attempt"; flags:A+; content:"/cgi-bin/phf"; priority:10;) alert tcp any any -> any 80 (msg:"EXPLOIT ntpdx overflow"; dsize:>128; classtype:attempted-admin; priority:10;) * metadata Позволяет автору правил включать дополнительную информацию о правиле, как правило, в формате “ключ-значение”. Ключи и значения тега metadata перечислены в таблице ниже: | Ключ | Описание | Формат значения | | ------- | --------------------------------------------------------------------------------------- | --------------- | | engine | Указывает правило библиотеки общего пользования (Indicate a Shared Library Rule) | 'shared' | | soid | GID и SID правила библиотеки общего пользования (Shared Library Rule Generator and SID) | sid | | service | Идентификатор сервиса на основе цели (Target-Based Service Identifier) | 'http' | Отличные от указанных в таблице ключи Snort фактически игнорирует, поэтому они могут быть записаны в свободной форме в формате “ключ-значение”. Несколько ключей подряд разделяются запятыми, а ключи и значения отделяются между собой пробелом. Синтаксис: metadata:key1 value1; metadata:key1 value1, key2 value2; Примеры: alert tcp any any -> any 80 (msg:"Shared Library Rule Example"; metadata:engine shared; metadata:soid 3|12345;) alert tcp any any -> any 80 (msg:"Shared Library Rule Example"; metadata:engine shared, soid 3|12345;) alert tcp any any -> any 80 (msg:"HTTP Service Rule Example"; metadata:service http;) **Payload** * content Позволяет устанавливать условие в правила, которые ищут определённое содержание (контент) в полезной нагрузке пакетов. Условия могут содержать как двоичные данные, так и текстовые. Двоичные данные должны быть заключены между вертикальными чертами “|” в виде байт-кода. Байт-код представляет двоичные данные в виде шестнадцатеричных чисел. В одном правиле может быть указано несколько content-условий. “!” - модификатор отрицания. Если правилу предшествует модификатор отрицания, то правило срабатывает на пакетах, которые не содержат заданный контент. Ключевое слово content имеет ряд модификаторов, которые изменяют поведение ранее указанного content. Список модификаторов: * nocase * rawbytes * depth * offset * distance * within * httpclientbody * httpclientbody * httpcookie * httprawcookie * httpheader * httprawheader * httpmethod * httpuri * httprawuri * httpstatcode * httpstatmsg * fastpattern Синтаксис: content:[!]"<content string>"; ~~После теории~~ – попробуем написать свои правила в snort. Для этого откроем файл и будем делать запись: `sudo nano /etc/snort/rules/local.rules` ![](https://i.imgur.com/ySsITCd.png) ``` alert tcp any any -> $HOMENET 21 (msg:"FTP connection attempt"; GID:1; sid:10000001; rev:001;) alert icmp any any -> $HOMENET any (msg:"ICMP test detected"; GID:1; sid:10000002; rev:001; classtype:icmp-event;) alert tcp any any -> $HOMENET 80 (msg:"TELNET connection attempt"; GID:1; sid:10000003; rev:001;) ``` ![](https://i.imgur.com/fflqlts.png) Проверяем конфигурацию snort еще раз: `snort -T -i eth0 -c /etc/snort/snort.conf` ![](https://i.imgur.com/QjUi9J5.png) ![](https://i.imgur.com/DvPJuMP.png) Запускаем Snort в режиме сетевых идентификаторов с терминала и попросите его вывести любое предупреждение на консоль (после запуска snort – зайдите просто интернет, немного полазайте и можно выходить): ``` sudo snort -A console -q -u snort -g snort -c /etc/snort/snort.conf -i ens33 ``` ![](https://i.imgur.com/5WNg8ZC.png) Если у вас появилась такая ошибка, то у вас не верно указан сетевой порт: ![](https://i.imgur.com/aTnzhDo.png) Для того чтобы узнать какой у вас порт, достаточно вести одну команду и посмотреть где используется ip: `ip a` ![](https://i.imgur.com/wxqFjvx.png) В моем случае это второй. # Атаки на Snort Воспроизведем атаки на машину, чтоб проверить работоспособность Snort. На атакующей машине подключаем Snort. `sudo snort -A console -q -u snort -g snort -c /etc/snort/snort.conf -i ens33` ![](https://i.imgur.com/vQ6M49C.png) Откройте терминал виртуальной машины Kali Linux и установите инструмент dsniff. По умолчанию в Kali Linux используется пароль kali. Выполните команду `sudo -i`, чтобы стать пользователем root. Вам также потребуется обновить менеджер пакетов apt-get, выполнив команду `apt-get update`. ``` sudo -i apt-get update apt-get install dsniff ``` ![](https://i.imgur.com/8Gq2DbC.png) ![](https://i.imgur.com/5bZmAk5.png) Утилита dsniff содержит несколько полезных инструментов для перехвата сетевого трафика, в том числе инструмент arpspoof, который позволяет выполнять ARP-спуфинг. Запустите инструмент netdiscover, используя следующую команду: `sudo netdiscover` ![](https://i.imgur.com/D4XtlxZ.png) Реакция Snort на прослушивание сети. ![](https://i.imgur.com/Fo4va4Z.png) Теперь вам нужно разрешить машине Kali Linux пересылать пакеты от имени других машин, включив пересылку IP-пакетов. Убедитесь в том, что являетесь пользователем root в машине Kali Linux, а затем включите пересылку IP-пакетов, установив соответствующий флаг: `echo 1 > /proc/sys/net/ipv4/ipforward` ![](https://i.imgur.com/XL5KuFm.png) Вы можете сгенерировать несколько поддельных ответов ARP, выполнив команду: `arpspoof -i eth0 -t <IP-адресжертвы> <IP-адресмаршрутизатора>` ![](https://i.imgur.com/F8ixRl7.png) Для перехвата входящего интернет-трафика от имени жертвы вам также необходимо заставить маршрутизатор поверить в то, что ею являетесь вы. Откройте новое окно терминала и выполните следующую команду. Обратите внимание на то, что <IP-адресмаршрутизатора> и <IP-адресжертвы> поменялись местами. Это связано с тем, чтотеперь вы генерируете пакеты, чтобы обмануть маршрутизатор, выдав себя за жертву: `arpspoof -i eth0 -t <IP-адресмаршрутизатора> <IP-адресжертвы>` ![](https://i.imgur.com/LaLHnRB.png) Теперь, когда вы обманули компьютер жертвы и маршрутизатор, проверим перехваченные пакеты и извлечем из них URL. Это позволит нам создать список сайтов, которые посещает жертва. Извлеките URL, выполнив следующую команду в новом окне терминала: `urlsnarf -i eth0` ![](https://i.imgur.com/1nYvtut.png) Как можно заметить, Snort отреагировал только на то, что открыли браузер но, не заметир ARP-спуфинг. Значит Snort не корректно работает. ![](https://i.imgur.com/KhCXrTG.png) Потому что, что? Правильно, до этого мы внесли толь 3 правила в файл local.rules ![](https://i.imgur.com/tEZtQhQ.png) Чтоб вручную не сидеть и не писать правила, мы просто возьмем уже готовые правила и запишем их в файл. Не забываем включать VPN и переходим на ссылку https://www.snort.org/downloads/community/community-rules.tar.gz . Файл автоматически скачается, заходим в папку Downloads, с помощью команды `cd Downloads`. ![](https://i.imgur.com/rgwNnMi.png) Разархивируем нужный нам файл. `sudo tar –xzvf community-rules.tar.gz` Откроем файл по имени community.rules sudo nano community-rules/community.rules Откроется такой файл и как можно заметить , они закомментированы, поэтому мы их скопируем и перенесем в файл local.rules. Воспроизведем копирование содержимого одного файла в другой. Но, перед этим зайдем полностью под root, иначе он не допускает такое копирование. sudo su cat community.rules>/etc/snort/rules/local.rules Проверяем содержимое файла local.rules sudo nano /etc/snort/rules/local.rules Как можно заметить, копирование произошло успешно и некоторые правила даже разкомментированы. Попробуем провести повторную атаку ARP-спуфинг и посмотрим на реакцию Snort. Как можно заметить, команда на Kali linux не работает так же как и до этого но, и Snort тоже ничего не показывает. Следовательно, работает правило, которое блокирует ARP-спуфинг.