Инструкция по Nmap. Обнаружение, сканирование.

d0ppl4r

Старшина
Сообщения
49
Реакции
33
1609042440690.png



В этой статье я постараюсь показать тебе основы и дать наиболее необходимые рецепты использования Nmap, а также объяснить как он работает.

Nmap – это бесплатная утилита с открытым исходным кодом, предназначенная для исследования и проверки защищенности сетевых объектов, причем она может работать как с сетями любых размеров так и с одиночными объектами. При этом возможности её огромны, начиная от обнаружения открытых портов и определения служб, вплоть до поиска файлов, баз данных, обнаружения уязвимостей, обхода средств защиты и много другого, но обо всём по порядку.

Скачать Nmap можно с официального сайта https://nmap.org/ там доступна самая последняя версия, либо установить из репозиториев:

sudo apt install nmap
Я не буду углубляться в теоретические глубины принципов работы Nmap, потому что тогда эта статья получится безразмерной, в глубины мы заглянем в других материалах (или уже заглянули, можешь глянуть статьи на сайте), но некоторые пояснения о том как Nmap получает те или иные результаты я постараюсь дать там где это, на мой взгляд, важно, а сейчас перейдем сразу к практике и примерам, потому что рассказать и показать предстоит довольно много.

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

Nmap 7.60 ( https://nmap.org )
Использование: nmap [Тип(ы) Сканирования] [Опции] {цель сканирования}
ОПРЕДЕЛЕНИЕ ЦЕЛИ СКАНИРОВАНИЯ:
Можно использовать сетевые имена, IP адреса, сети и т.д.
Пример: scanme.nmap.org, microsoft.com/24, 192.168.0.1; 10.0.0-255.1-254
-iL <имявходногофайла>: Использовать список хостов/сетей из файла
-iR <количествохостов>: Выбрать произвольные цели
--exclude <хост1[,хост2][,хост3],…>: Исключить хосты/сети
--excludefile <имяфайла>: Исключить список из файла
ОБНАРУЖЕНИЕ ХОСТОВ:
-sL: Сканирование с целью составления списка - просто составить список целей для сканирования
-sP: Пинг сканирование - просто определить, работает ли хост
-PN: Расценивать все хосты как работающие -- пропустить обнаружение хостов
-PS/PA/PU [списокпортов]: TCP SYN/ACK или UDP пингование заданных хостов
-PE/PP/PM: Пингование с использованием ICMP эхо запросов, запросов временной метки и сетевой маски
-PO [списокпротоколов]: Пингование с использованием IP протокола
-n/-R: Никогда не производить DNS разрешение/Всегда производить разрешение [по умолчанию: иногда]
--dns-servers <сервер1[,сервер2],…>: Задать собственные DNS сервера
--system-dns: Использовать системный DNS преобразователь
РАЗЛИЧНЫЕ ПРИЕМЫ СКАНИРОВАНИЯ:
-sS/sT/sA/sW/sM: TCP SYN/с использованием системного вызова Connect()/ACK/Window/Maimon сканирования
-sU: UDP сканирование
-sN/sF/sX: TCP Null, FIN и Xmas сканирования
--scanflags <флаги>: Задать собственные TCP флаги
-sI <зомбихост[:порт]>: "Ленивое" (Idle) сканирование
-sO: Сканирование IP протокола
-b <хост>: FTP bounce сканирование
--traceroute: Отслеживать путь к хосту
--reason: Выводить причину нахождения порта в определенном состоянии
ОПРЕДЕЛЕНИЕ ПОРТОВ И ПОРЯДКА СКАНИРОВАНИЯ:
-p <диапазонпортов>: Сканирование только определенных портов
Пример: -p22; -p1-65535; -p U:53,111,137,T:21-25,80,139,8080
-F: Быстрое сканирование - Сканирование ограниченного количества портов
-r: Сканировать порты последовательно - не использовать случайный порядок портов
--top-ports <количествопортов>: Сканировать <количествопортов> наиболее распространенных портов
--port-ratio <рейтинг>: Сканировать порты с рейтингом большим чем <рейтинг>
ОПРЕДЕЛЕНИЕ СЛУЖБ И ИХ ВЕРСИЙ:
-sV: Исследовать открытые порты для определения информации о службе/версии
--version-intensity <уровень>: Устанавливать от 0 (легкое) до 9 (пробовать все запросы)
--version-light: Ограничиться наиболее легкими запросами (интенсивность 2)
--version-all: Использовать каждый единичный запрос (интенсивность 9)
--version-trace: Выводить подробную информацию о процессе сканирования (для отладки) СКАНИРОВАНИЕ С ИСПОЛЬЗОВАНИЕМ СКРИПТОВ:
-sC: эквивалентно опции --script=default
--script=: это разделенный запятыми список директорий, файлов скриптов или категорий скриптов
--script-args=<имя1=значение1,[имя2=значение2,…]>: Передача аргументов скриптам
--script-trace: Выводить все полученные и отправленные данные
--script-updatedb: Обновить базу данных скриптов
ОПРЕДЕЛЕНИЕ ОС:
-О: Активировать функцию определения ОС
--osscan-limit: Использовать функцию определения ОС только для "перспективных" хостов
--osscan-guess: Угадать результаты определения ОС
ОПЦИИ УПРАВЛЕНИЯ ВРЕМЕНЕМ И ПРОИЗВОДИТЕЛЬНОСТЬЮ:
Опции, принимающие аргумент <время>, задаются в миллисекундах, пока вы не добавите 's' (секунды), 'm' (минуты),или 'h' (часы) к значению (напр. 30m).
-T[0-5]: Установить шаблон настроек управления временем (больше - быстрее)
--min-hostgroup/max-hostgroup <колхостов>: Установить размер групп для параллельного сканирования
--min-parallelism/max-parallelism <колхостов>: Регулирует распараллеливание запросов
--min-rtt-timeout/max-rtt-timeout/initial-rtt-timeout <время>: Регулирует время ожидания ответа на запрос
--max-retries <количествопопыток>: Задает максимальное количество повторных передач запроса
--host-timeout <время>: Прекращает сканирование медленных целей
--scan-delay/--max-scan-delay <время>: Регулирует задержку между запросами
--min-rate <число>: Посылать запросы с интенсивностью не меньше чем <число> в секунду
--max-rate <число>: Посылать запросы с интенсивностью не больше чем <число> в секунду
ОБХОД БРАНДМАУЭРОВ/IDS:
-f; --mtu <значение>: Фрагментировать пакеты (опционально с заданным значение MTU)
-D <фиктхост1,фиктхост2[,ME],…>: Маскировка сканирования с помощью фиктивных хостов
-S : Изменить исходный адрес
-e <интерфейс>: Использовать конкретный интерфейс
-g/--source-port <номерпорта>: Использовать заданный номер порта
--data-length <число>: Добавить произвольные данные к посылаемым пакетам
--ip-options <опции>: Посылать пакет с заданным ip опциями
--ttl <значение>: Установить IP поле time-to-live (время жизни)
--spoof-mac адрес/префикс/название производителя>: Задать собственный MAC адрес
--badsum: Посылать пакеты с фиктивными TCP/UDP контрольными суммами
ВЫВОД РЕЗУЛЬТАТОВ:
-oN/-oX/-oS/-oG <файл>: Выводить результаты нормального, XML, s|: Использовать сразу три основных формата вывода
-v: Увеличить уровень вербальности (задать дважды или более для увеличения эффекта)
-d[уровень]: Увеличить или установить уровень отладки (до 9)
--open: Показывать только открытые (или возможно открытые) порты
--packet-trace: Отслеживание принятых и переданных пакетов
--iflist: Вывести список интерфейсов и роутеров (для отладки)
--log-errors: Записывать ошибки/предупреждения в выходной файл нормального режима
--append-output: Добавлять в конец, а не перезаписывать выходные файлы
--resume <имяфайла>: Продолжить прерванное сканирование
--stylesheet <путь/URL>: Устанавливает XSL таблицу стилей для преобразования XML вывода в HTML
--webxml: Загружает таблицу стилей с Nmap.Org
--no-stylesheet: Убрать объявление XSL таблицы стилей из XML
РАЗЛИЧНЫЕ ОПЦИИ:
-6: Включить IPv6 сканирование
-A: Активировать функции определения ОС и версии, сканирование с использованием скриптов и трассировку
--datadir <имядиректории>: Определяет место расположения файлов Nmap
--send-eth/--send-ip: Использовать сырой уровень ethernet/IP
--privileged: Подразумевать, что у пользователя есть все привилегии
--unprivileged: Подразумевать, что у пользователя нет привилегий для использования сырых сокетов
-V: Вывести номер версии
-h: Вывести эту страницу помощи
ПРИМЕРЫ:
nmap -v -A scanme.nmap.org
nmap -v -sP 192.168.0.0/16 10.0.0.0/8
nmap -v -iR 10000 -PN -p 80
ДЛЯ СПРАВКИ ПО ДРУГИМ ОПЦИЯМ, ОПИСАНИЙ И ПРИМЕРОВ СМОТРИТЕ MAN СТРАНИЦУ

Логика использования утилиты довольно проста. Как видно из справки:

nmap [Тип(ы) Сканирования] [Опции] {цель сканирования}
запуская утилиту nmap мы сразу можем задать цель сканирования, с нужными нам настройками. Тут важно понимать, что всё что не является функционалом программы т.е. опциями и аргументами, nmap будет расценивать как цель, а значит мы можем вводить несколько объектов в качестве целей, а целями могут быть сетевые адреса, ip адреса, диапазоны ip адресов, сети, подсети и т.д.

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

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


В самом начале работы с какай-либо целью мы, как правило, знаем о ней очень мало, а значит нам нужно получить первичные данные, сократить либо расширить список интересующих целей (зависит от задачи) и определиться с дальнейшим направление движения. Для каждой конкретной задачи алгоритм действий может меняться и рецептов гарантирующих успех не существует, но есть базовый набор действий которые стоит знать прям хорошо, я постараюсь сосредоточится именно на таких и не залезать в дебри.

Начнём с того, что разберем основные команды из справки, это нужно чтобы научиться основам использования Nmap. В некоторых примерах мы будем использовать в качестве цели сканирования сайт scanme.nmap.org это специально созданный разработчиками Nmap сайт для тестирования возможностей программы.

Обнаружение хостов

Как, мы видим из справки Nmap первым пунктом идет обнаружение хостов. Само по себе это понятие довольно широкое, и состоит из первоначального обнаружения активных IP адресов, этот этап ещё принято называть пинг сканированием, тут нужно понимать что можно сканировать как, всем привычными, ICMP запросами, так и комбинируя их с TCP, UDP и ARP запросами. Обнаружив хост Nmap автоматически просканирует его порты если не задан параметр отменяющий это действие.

Опции Nmap для обнаружения хостов:

  • -sL
  • Сканирование с целью составления списка.
  • При выборе данной опции будет перечислен весь диапазона IP адресов в сети с присвоенными им именами (если такие есть). В конце списка будет отображено общее количество найденных IP. Если в качестве цели будет задано доменное имя то будет показан IP и его Reverse DNS.

  • -sP
  • Пинг сканирование.
  • Эта опция определяет активные хосты т.е. те которые отвечают на запросы и выводит их список. Если запустить эту опцию с правами root, то, также будут задействованы ARP запросы, благодаря чему мы узнаем mac-адреса работающих устройств в сети.

  • -Pn
  • Пропустить пинг сканирование.
  • При использовании этой опции Nmap будет считать, что все IP в исследуемой сети активны и будет сканировать весь диапазон IP адресов, в том числе все порты на каждом IP.
  • -PS / -PA / -PU
  • Это команды для получения списка портов, Разница только в пакетах, которые будут отправлены хосту: PS – это TCP SYN, PA – это TCP ACK. Принципиальной разницы на самом деле нет, но если есть вероятность, что соединение блокируется брандмауэр, лучше использовать TCP ACK. Ну, а PU (нужен root) – это UDP пингование – используется для получения ICMP пакета с ошибкой “порт недостежим”, все остальные ошибки, в том числе отсутствие ответа говорят о том что хост не работает.
  • В дополнение к указанным опциям можно указать какие именно типы ICMP пакетов использовать, делается это опциями -PE; -PP; -PM – это эхо запрос, запрос временной метки и запрос адресной маски соответственно, останавливаться отдельно на них не буду потому что такие запросы с большой долей вероятности будут заблокированы хостом или брандмауэром.

  • -PO
  • Команда для получения списка протоколов пингованием с использованием IP протокола (для запуска необходим root). В этом случае должны приходить ответы по протоколу указанному в запросе, это означает что протокол активен, если приходит ответ что хост не достижим, это даёт понят, что протокол не поддерживается.

  • -PR
  • Это ARP пингование. Наиболее оптимальный способ сканирования, позволяющий определить активные хосты, службы и порты ими использующиеся (для запуска необходим root).

  • –traceroute
  • Опция позволяющая выполнить трасировку т.е. отследить путь к хосту, она применяется вместе с любым видом сканирования и работает на основании данных полученных в результате него (для запуска необходим root)

Приёмы сканирования

Мы подошли к разделу посвященному приемам сканирования портов. Почти все указанные в этом разделе опции требуют для запуска root, это нужно учитывать. Также единовременно можно использовать только один метод (исключение UDP сканирование (-sU) его можно комбинировать с любым видом TCP сканирования.

  • -sS
  • TCP SYN сканирование. Это наиболее популярный и достаточно незаметный тип сканирования т.к. при его использовании TCP соединение никогда не устанавливается до конца. Работает это так: Nmap посылает SYN пакет, для хоста это выглядит как будто с ним хотят установить реальное соединение. Если приходит ответ SYN/ACK – значит порт открыт, а если RST – значит закрыт, если ответ не приходит или пришло ICMP-сообщение об ошибке – значит порт фильтруется.

  • -sU
  • UDP сканирование. Позволяет сканировать порты используемые UDP службами, может быть скомбинировано с TCP сканированием (например: -sS -sU). Работает путём отправки пустого UDP заголовка на соответствующие порты. Если приходит ошибка “порт недостижим”, то в зависимости от типа ошибки Nmap определяет – порт закрыт или фильтруется, если в ответ пришел UDP – пакет значит порт открыт, а если ответа нет – будет присвоен статус open|filtered, в этой ситуации чтобы уточнить данные можно использовать опцию определения версии (-sV). Работает UDP сканирование крайне медленно, потому что бы ускорить процесс, есть смысл задать список интересующих портов (например -p U:53)

  • -sA
  • TCP ACK сканирование которое используется для определения правил брандмауэров и фильтруемых ими портов.

  • -sO
  • Сканирование IP протокола, таким способом можно определить какие IP протоколы поддерживаются целью. При получении любого ответа по любому протоколу, такой порт помечается как открытый, если получена ICMP ошибка “протокол недостежим” он будет помечен как закрытый, а иногда фильтруемый, если ответ не пришел то – “открыт|фильтруется”.

Определение портов и порядка сканирования

Иногда возникает необходимость просканировать какой-то конкретный порт или диапазон портов, причём если сразу известно какие порты являются целью, лучше так и делать, это может серьёзно сократить время и оставит меньше следов. Если не указывать порты которые мы хотим сканировать, то Nmap, по-умолчанию, будет сканировать все порты до 1024 включительно и все порты указанные в файле */nmap/nmap-services для протокола который будет сканироваться.

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

-p

означающий, что мы хотим сканировать только определенные порты. Мы должны сначала указать тип сканирования, а потом порты которые хотим сканировать, также можно указать протокол TCP (опция T:) или UDP (опция U:) (если не указывать задействуются оба), при этом не забывай, что чтобы применялось UDP сканирование должна использоваться опция -sU, а для TCP сканирования использоваться опция -sS (или аналогичная), например:

sudo nmap -sS -sU -p 22,80,111,U:53,137 scanme.nmap.org


Примечание

Также есть чуть менее распространенные способы определения целевых портов, если мы укажем параметр -F, то будет просканировано 100 самых распространенных портов, а если -p-, то все 65535.

Определение служб, их версий и операционной системы

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

  • -sV
  • Определение версий. Обнаружив порт Nmap начинает посылать на него соответствующие запросы, что бы определить какая именно служба этот порт использует, для этого используется информация из базы данных nmap-service-probes (лежит в папке nmap), где содержаться запросы и и перечислены виды ответов на них, для распознавания соответствующих служб.

  • –version-intensity
  • Опция устанавливающая интенсивность, определяет какие запросы будут использоваться при сканировании. Можно установить значение от 1 до 9. Чем ниже значение, тем быстрее пройдет сканирование, чем выше – тем медленнее, но больше вероятность правильного определения службы. Если опция не указанна используется значение по умолчанию – 7, которого достаточно в большинстве случаев. Если есть желание использовать максимальную интенсивность, используй параметр –version-all, это гарантирует, что каждый единичный запрос будет направлен на каждый порт (и запасись терпением, это может занять какое-то время)
  • -O
  • Включить режим определения ОС. При включении этой опции Nmap посылает несколько TCP и UDP пакетов на хост, а полученные результаты сравниваются с данными из файла nmap-os-db (лежит в папке nmap) и если обнаруживает совпадения, показывает ответ для какой ОС и какой её версии типично такое поведение. По этим же совпадениям Nmap попытается определить тип устройства и его производителя

Примечание:

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