Виды сканирования Nmap
Max Alexeev (@wi_max)
Nmap – хорошо известная утилита, позволяющая провести сканирование цели, иначе говоря, определить состояние портов, сервисы, работающие на хосте, их версии, операционную систему, более того, встроенный NSE (nmap scripting engine) позволяет использовать базу готовых скриптов, а также дополнять ее своими.
Информации о данном сканере достаточно, присутствует документация на русском языке. Тем не менее, считаю полезным сделать краткую выжимку о самых интересных возможностях сканирования, а также предоставить теоретический базис, который может помочь как при проведении практических тестирований, так и при ответе на вопросы собеседований. Поехали!
Сегодня хотелось бы рассказать о том, какие типы сканирования различают и как их интерпретировать, однако перед тем как начать, необходимо понимать, какие бывают состояния портов.
Состояния портов
Nmap различает 6 состояний портов, каждое из которых может быть получено при сканировании тем или иным способом.
Открыт: приложение принимает запросы на TCP соединение или UDP пакеты на этот порт.
Закрыт: Закрытый порт доступен (он принимает и отвечает на запросы Nmap), но не используется каким-либо приложением. Они могут быть полезны для установления, что по заданному IP адресу есть работающий хост (определение хостов, ping сканирование), или для определения ОС
Фильтруется: Nmap не может определить, открыт ли порт, т.к. фильтрация пакетов не позволяет достичь запросам Nmap этого порта. Фильтрация может осуществляться выделенным брандмауэром, правилами роутера или брандмауэром на целевой машине. Эти порты бесполезны для атакующих, т.к. предоставляют очень мало информации.
Не фильтруется: Это состояние означает, что порт доступен, но Nmap не может определить открыт он или закрыт.
Открыт|фильтруется: Nmap характеризует порт таким состоянием, когда не может определить октрыт порт или фильтруется. Это состояние возникает при таких типах сканирования, при которых открытые порты не отвечают. Отсутствие ответа также может означать, что пакетный фильтр не пропустил запрос или ответ не был получен. Поэтому Nmap не может определить наверняка открыт порт или фильтруется.
Виды сканирования
Необходимо иметь в виду:
1. В любой момент времени вы можете использовать только один метод; исключение составляет UDP сканирование (-sU), которое может быть скомбинировано с любым типом TCP сканирования.
2. Общий вид задания опций сканирования –s<C>, где <C> это символ из названия типа сканирования, обычно первый (кроме FTP bounce).
3. По умолчанию осуществляется SYN сканирование.
4. Почти для всех типов сканирования необходимы привилегии суперпользователя.
Чтобы каждому было понятно, что происходит "под капотом", рекомендую ознакомиться с базовыми вещами по установлению TCP соединения, структуре TCP пакета и разнице между 0и UDP.
-sS (TCP SYN): как уже было отмечено, используется по умолчанию. Данный тип сканирования позволяет быстро сканировать множество портов. Относительно незаметен т.к. соединение не устанавливается до конца. Работает следующим образом: посылает SYN пакет на интересующий порт. Получение в ответе SYN/ACK указывает на то, что порт открыт, RST – закрыт. Если ответа не получено после нескольких перезапросов или получена ICMP ошибка недостижимости (destination unreachable) – порт фильтруется.
-sT (TCP connect): используется по умолчанию, если не доступно TCP SYN. Существенное отличие от TCP SYN в том, что соединение устанавливается до конца, а значит попадет в логи сервера. Крайне заметный тип сканирования.
-sU (UDP): работает медленнее TCP-сканирования, также может быть скомбинировано с одним из видов TCP-сканирования. Работает следующим образом: посылает на целевой порт пустой UDP пакет (заголовок). Если в ответ получен UDP-пакет – порт открыт. Получение ICMP ошибки означает, что порт закрыт или фильтруется (в зависимости от кода ошибки). Если после нескольких попыток ответа не было получено, то порт открыт|фильтруется. Как уже было отмечено, работает очень медленно так как в случае отсутствия ответа необходимо совершать повторный запрос на случай, если пакеты были утеряны. Также хосты ограничивают лимит ICMP ошибок о недостижимости (например, 1 в секунду).
-sN; -sF; -sX (TCP NULL, FIN, Xmas): данные типы сканирования работают по одной схеме, только устанавливаются разные флаги в пакетах запросов. Null – не устанавливает флаги. FIN – только TCP FIN бит. Xmas – FIN, PSH, URG. Не позволяет точно определить открыт порт или фильтруется. Получение RST пакета означает, что порт закрыт. ICMP ошибка – порт фильтруется. В случае, если ответа не получено, то порт открыт|фильтруется. Данный метод позволяет обойти некоторые брандмауэры и роутеры с функцией пакетной фильтрации. Стоит отметить, что конфигурации некоторых систем посылают в ответ RST независимо от состояния порта.
-sA (TCP ACK): позволяет определить наличие фильтрации портов на хосте. В случае, когда фильтры не установлены независимо от того, открыт порт или закрыт, будет получен пакет RST, состояние порта - не фильтруется. Если ответа не получено или ICMP ошибка – порт фильтруется.
-sW (TCP Window): метод очень схож с TCP ACK сканированием, за исключением того, что анализирует поле TCP Window в RST пакете. Если значение поля положительное – порт открыт, если нулевое – закрыт. Метод не всегда точен, следует внимательно подходить к его использованию.
--scanflags: позволяет задать в ручном режиме флаги, используемые при TCP сканировании.
-b <FTP хост> (FTP bounce сканирование): использует FTP сервер в качестве прокси. Позволяет подключившись к FTP серверу отправлять файлы на различные порты интересующего нас хоста. Сообщения об ошибке покажет открыт порт или закрыт. Является хорошим способом обхода брандмауэров, однако данная функция почти всегда отключена из соображений безопасности.
Разумеется, это не исчерпывающий список возможностей по части сканирования, для уточнения деталей стоит обратиться к документации.