Nmap — эталон среди сканеров портов и один из важнейших инструментов пентестера. Но можешь ли ты сказать, что досконально изучил все его особенности и способы применения? Из этой статьи ты узнаешь, как использовать Nmap для сканирования хостов за файрволом, повысить производительность сканирования, искать дыры в настройках HTTP-сервера, организовать DoS-атаку и даже поднять веб-сервер.

WARNING

Вся информация предоставлена исключительно в ознакомительных целях. Ни редакция, ни автор не несут ответственности за любой возможный вред, причиненный материалами данной статьи.

 

Базовые возможности

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

$ nmap 192.168.0.1

Это действительно так, но стоит иметь в виду две особенности реализации Nmap. Первая: запущенный с правами обычного пользователя Nmap крайне неэффективен. Весь процесс сканирования при этом фактически сводится к попытке установить полноценное соединение с каждым из портов. В случае протокола TCP это значит, что Nmap пошлет на удаленную сторону пакет SYN; если запрошенный порт открыт, машина ответит пакетом SYN/ACK, после чего Nmap отправит пакет ACK и только потом закроет соединение с помощью пакета FIN.

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

Совсем по-другому Nmap ведет себя, когда запущен с правами root:

$ sudo nmap 192.168.0.1

В этом случае он полностью берет на себя формирование пакетов и управление соединением. Подключение к открытым портам будет выглядеть так: Nmap посылает SYN, машина отвечает SYN/ACK, Nmap посылает FIN, разрывая наполовину открытое соединение (это называется TCP SYN сканирование). В результате сервис, висящий на порте, не логирует попытку соединения, а Nmap способен обнаружить брандмауэр, который просто отбрасывает SYN-пакеты вместо того, чтобы отправить в ответ SYN/ACK (порт открыт) или FIN (порт закрыт), как это должна делать операционная система по умолчанию. Кроме того, этот способ сканирования намного более производительный.

Вторая особенность Nmap заключается в том, что на самом деле он сканирует не весь диапазон портов (65 536), а только 1000 портов типовых служб, определенных в файле /usr/share/nmap/nmap-services. Так что, если кто-то повесит сервис на нестандартный порт, которого просто нет в этом файле, Nmap его не увидит. Изменить подобное поведение можно при помощи такой команды:

$ sudo nmap -sS -sU -p 1-65535 192.168.0.1

Nmap будет использовать сканирование типа TCP SYN и UDP-сканирование для всего диапазона портов.

 

Определяем название и версию сервиса на порте

Одна из интересных особенностей Nmap в том, что он способен не только определить состояние порта (открыт, закрыт, фильтруется), но и идентифицировать имя демона/службы на этом порте, а в некоторых случаях даже его версию. Для этого Nmap может применять несколько разных техник, например подключиться к порту 80 и послать HTTP-запрос для идентификации имени и версии веб-сервера либо использовать информацию о том, как сервис отвечает на те или иные пакеты и запросы.

Все правила идентификации служб и их версий определены в файле <span class="nobr">/usr/share/nmap/nmap-service-probes, а заставит Nmap их применить флаг -sV:

$ sudo nmap -sV 192.168.0.1

Причем есть возможность даже усилить попытки Nmap определить службу с помощью флага --version-all:

$ sudo nmap -sV --version-all 192.168.0.1

Однако обычно это не повышает качество распознавания.

Nmap не смог определить версию HTTP-сервера, но узнал его имя
Nmap не смог определить версию HTTP-сервера, но узнал его имя
 

Определяем имя и версию ОС

Наверное, это одна из самых известных функций Nmap. Отправляя машине нестандартные пакеты и сопоставляя ее ответ (время ответа, значения полей TTL, MTU, ACK и многое другое) с «базой отпечатков ОС» (/usr/share/nmap/nmap-os-db), Nmap способен достаточно точно определить запущенную на машине ОС. Все, что нужно сделать, — это запустить Nmap с флагом -O:

$ sudo nmap -O 192.168.0.1

Однако далеко не всегда Nmap способен на 100% правильно угадать ОС. Если сделать это не получится, Nmap выведет на экран наиболее близкие к правильному варианты, заботливо снабдив их «процентом попадания»: 90%, 82%…

Более того, ты можешь пойти еще дальше и воспользоваться флагом -A, чтобы заставить Nmap попытаться определить версию ОС, версию служб и даже провести более детальный анализ служб с помощью скриптов NSE (о них позже):

$ sudo nmap -A 192.168.0.1
Предположения Nmap о версии ОС сканируемой машины
Предположения Nmap о версии ОС сканируемой машины
 

Повышаем скорость сканирования

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

Nmap поддерживает десяток флагов, позволяющих тонко контролировать такие параметры, как задержка между попытками подключения к порту или количество попыток подключения. Разобраться с ними с наскоку довольно тяжело, поэтому в Nmap есть набор преднастроенных шаблонов агрессивности сканирования. Всего их шесть (от 0 до 5), а сделать выбор можно с помощью опции -T:

$ sudo nmap -T3 192.168.0.1

В данном случае мы выбрали шаблон номер 3. Это дефолтовое значение, своеобразный компромисс между скоростью и точностью сканирования в медленных сетях. Однако в современных условиях, когда минимальная скорость проводного доступа в сеть уже перешагнула за 30 Мбит/с, лучшим выбором будет -T4 или даже -T5. Последний стоит применять только в стабильных сетях без провалов скорости.

Более низкие значения предназначены для обхода систем обнаружения вторжений. Например, -T0 отключает многопоточное сканирование и устанавливает задержку между пробами портов в пять минут; потратив весь день (ночь) на сканирование, ты можешь надеяться, что сама попытка сканирования будет не замечена (тем более что Nmap перебирает порты в случайном порядке). Шаблон -T1 — более быстрый режим с задержкой в 15 с, -T2 — 0,4 с, -T3 — 10 мс, -T4 — 5 мс.

Режим -T5 в полтора раза более производительный, чем дефолтовый
Режим -T5 в полтора раза более производительный, чем дефолтовый

Продолжение статьи доступно только подписчикам

Вариант 1. Оформи подписку на «Хакер», чтобы читать все статьи на сайте

Подписка позволит тебе в течение указанного срока читать ВСЕ платные материалы сайта, включая эту статью. Мы принимаем оплату банковскими картами, электронными деньгами и переводами со счетов мобильных операторов. Подробнее о подписке

Вариант 2. Купи одну статью

Заинтересовала статья, но нет возможности оплатить подписку? Тогда этот вариант для тебя! Обрати внимание: этот способ покупки доступен только для статей, опубликованных более двух месяцев назад.


9 комментариев

Подпишитесь на ][, чтобы участвовать в обсуждении

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

Check Also

Windows 10 против шифровальщиков. Как устроена защита в обновленной Windows 10

Этой осенью Windows 10 обновилась до версии 1709 с кодовым названием Fall Creators Update …