Сканирование портов и поиск сетевых уязвимостей с помощью nmap
Разведка - один из основных и наиболее важных этапов тестирования на проникновение. Она помогает нам получить информацию, которая может оказаться крайне важной для нас. Читая статьи с bugbounty, например, мы можем встретить упоминания о сканировании портов - чаще всего для этого используется nmap. Однако мало кто знает, что это лишь вершина айсберга возможностей, которые предлагает нам этот инструмент. В этой статье мы рассмотрим их немного подробнее.
Типы статусов портов
Прежде чем мы начнем, немного базовой теории, которую мы будем использовать при работе с nmap. При сканировании мы получим информацию о портах. Некоторые из них будут открыты (open), другие будут нефильтрованными, а третьи будут иметь оба состояния. Что это означает для нас?

  • открыт - приложение прослушивает TCP-соединения или UDP-пакеты на указанном порту,

  • закрыт - порт доступен, принимает и отвечает на пакеты nmap, но нет приложения, обслуживающего соединение,

  • отфильтрован - nmap не может определить, открыт ли порт. Причина - сетевая фильтрация с помощью брандмауэров сетевым администратором,

  • нефильтрованный - порт открыт, но nmap не может определить, закрыт он или открыт (для соединений). Это состояние порта можно определить только при сканировании ACK. При сканировании нефильтрованных портов следует использовать сканирование Windows, SYN или FIN,

  • open / filtered - состояние порта определяется, когда инструмент не может определить, открыт он или закрыт. Это происходит, когда порт не дает ответа,

  • closed / filtered - состояние, определяемое для портов, для которых nmap не знает, закрыт порт или отфильтрован.
Наиболее важные типы сканирования
Начнем с самого простого - сканирования операционной системы. Nmap посылает UDP и TCP пакеты и, основываясь на обратном ответе, анализирует и сопоставляет их с теми записями, которые хранятся в его базе данных. На основании этого делается оценка того, какая система, скорее всего, используется хостом.
Сканирование TCP SYN (-sS)
Это стандартное и наиболее часто используемое сканирование портов. SYN-сканирование характеризуется тем, что соединение никогда не открывается полностью, что делает его достаточно дискретным. Неполное открытие заключается в том, что после отправки SYN-пакета и получения ответа, дальнейший сегмент ACK не отправляется.


Состояние порта определяется полученным ответом. Если получен сегмент SYN-ACK, порт открыт. Если в ответ получен пакет RST - порт закрыт. Если ответа нет или получено сообщение об ошибке ICMP, порт получает статус filtered.
Приведенное выше сканирование показывает, что открытыми портами являются порты номер 80 и 443.
Сканирование TCP connect() (-sT)
Если у пользователя нет разрешения на отправку необработанных пакетов или сканирование сетей IPv6, по умолчанию отправляется запрос TCP connect(). Он преобразует низкоуровневые ссылки в высокоуровневые - те же, что используются веб-браузерами. Для сканирования сети этот метод следует избегать, поскольку nmap имеет меньше контроля над ним, чем над методом SYN. Кроме того, по сравнению с ним, при TCP connect() происходит полное соединение, что подразумевает большее время и оставляет больший след попыток соединения.
Сканирование UDP (-sU)
Поскольку сканирование портов с помощью UDP тяжелее и занимает больше времени, исследователи безопасности часто игнорируют его. Это ошибка. Сканирование UDP (с добавлением параметра -sU) включает в себя отправку nmap пустых UDP-пакетов на целевые порты. Если получен ответ в виде UDP-пакета, порт классифицируется как открытый. Если получено ICMP-сообщение (ошибка), порт получает статус закрытого или фильтрованного. Отсутствие ответа означает статус открытый/фильтрованный.
Сканирование TCP Null, FIN и Xmas (-sN, -sF, -sX)
Все три вида сканирования отличаются только флагами, установленными в пакете. Если ответа нет, это означает, что порт открыт. В случае закрытых портов в ответ мы получаем пакет RST/ACK. Эти сканирования работают только на системах с реализацией TCP/IP, соответствующей RFC 793. Кроме того, каждое из сканирований не работает ни на одной версии Windows. Какие флаги различаются между сканированиями Xmas, FIN и Null?

Xmas - передает пакет с установленными флагами FIN, URG и PSH,

FIN - передает пакет с установленными флагами FIN,

Null - передает пакет без установленных флагов.
Сканирование TCP ACK (-sA)
Сканирование TCP ACK отличается от предыдущих. Это связано с тем, что его целью является не определение статуса портов, а проверка того, фильтруются ли они stateful firewall. Как и при стандартном сканировании, отправляется пакет ACK. Если какой-либо из портов возвращает пакет RST, это означает для nmap, что порты не фильтруются.
Как вы можете видеть, порты не фильтруются.
Сканирование TCP Window (-sW)
Это сканирование включает в себя то же самое, что и сканирование TCP ACK. Единственное отличие заключается в том, что при получении пакетов RST проверяет поле TCP Window Size, чтобы определить, открыт порт или нет. Это связано с тем, что некоторые операционные системы возвращают добавочное значение в поле TCP Window Size, когда пакет отправляется обратно с открытого порта. Для закрытых портов это значение отрицательное.
Maimon TCP Scan (-sM)
Это сканирование из семейства Null, FIN и Xmas. Он отличается только тем, что использует флаги FIN/ACK. Для этой комбинации флагов пакет возврата RST должен быть сгенерирован независимо от того, открыт порт или закрыт. Случается, что некоторые системы на базе BSD (разновидность операционной системы Unix) пропускают ответы, если порт открыт.

Nmap также предоставляет возможность определять пользовательские флаги, сканировать IP-протоколы, Idle и многое другое. Однако это несколько более сложные сканирования, которые не используются на ежедневной основе. Мы отсылаем вас к документации инструмента [здесь] (https://nmap.org/man/pl/man-port-scanning-techniques.html).
Поиск уязвимостей с помощью скриптов nse
Мало кто знает, что nmap предназначен не только для разведывательной работы. Помимо прочего, он позволяет находить уязвимости на основе скриптов, подготовленных сообществом и разработчиками инструмента. В качестве примера можно привести [nmap-vulners](https://github.com/vulnersCom/nmap-vulners), [vulscan](https://github.com/scipag/vulscan) или уже готовые скрипты, которые устанавливаются вместе с nmap.

Перед началом сканирования упомянутые скрипты следует переместить (если вы не хотите использовать те, что установлены по умолчанию) в каталог scripts, который находится в месте установки nmap. Для системы kali целевой путь будет /usr/share/nmap/scripts. В базе имеется 604 скрипта, подробнее о которых можно прочитать [здесь](https://nmap.org/nsedoc/categories/vuln.html). Например, чтобы использовать скрипт vulners.nse, мы набираем:

В примере используется один скрипт. Чтобы запустить большее их количество, мы укажем последовательно несколько имен, разделенных только запятой. Также, если мы хотим проверить скрипты, начинающиеся с заданной фразы (например, "ftp"), мы используем команду:

Аналогично, если бы мы хотели запустить все доступные скрипты, мы бы заключили .nse в кавычки. Однако я не рекомендую этого делать - некоторые скрипты требуют для своей работы дополнительных аргументов или внешних API-ключей.