Программа nmap относится к числу сканеров портов и сканеров безопасности систем.
Программа позволяет администраторам сканировать отдельные хосты и целые сети, определяя поддерживаемые типы сервиса и другие параметры. Nmap поддерживает множество методов сканирования - UDP, TCP connect(), TCP SYN (half open), ftp proxy (bounce attack), Reverse-ident, ICMP (ping sweep), FIN, ACK sweep, Xmas Tree, SYN sweep, IP Protocol, Null scan. Более подробное описание этих методов приводится ниже. Кроме обычного сканирования программа nmap может определять тип операционной системы удаленного хоста, выполнять скрытое сканирование, параллельное сканирование, детектирование фильтров, прямое сканирование RPC (без portmapper), сканирование с использованием фрагментов и др.

По результатам работы программа nmap генерирует отчет, содержащий сведения об интересных портах просканированных хостов, если таковые были обнаружены. Для “хорошо известных” портов nmap всегда указывает имя сервиса, номер порта, его состояние и протокол. Состояние порта может быть open (открыт), filtered (фильтруется) или unfiltered (не фильтруется). Порт считается открытым если хост принимает адресованные в этот порт соединения. К фильтруемым относятся порты, которые активны, но доступ к ним заблокирован межсетевым экраном, пакетным фильтром или иными системами контроля трафика, которые не позволили программе nmap организовать соединение с портом. К нефильтруемым портам относятся те, которые программа nmap определила как закрытые, не встретив при этом брандмауэра или иного средства предотвращения доступа к портам. Это состояние является обычным для большинства портов, поэтому они указываются в отчете лишь в тех случаях, когда большинство просканированных портов оказались фильтруемыми.

В зависимости от заданных опций nmap может также определять ряд характеристик удаленного хоста – операционную систему, порядковые номера TCP, имена пользователей, которые работают с программами, привязанными к портам, доменное имя DNS и другие параметры.

Синтаксис
nmap [<тип сканирования>] [<опции>] <хост или сеть #1 ... [#N]>

Опции

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

При сканировании Stealth FIN в качестве зондов передаются пакеты с флагом FIN, метод Stealth Xmas tree использует пакеты с флагами FIN, URG и PUSH, а сканирование Stealth Null основано на передаче пробных пакетов без флагов.

Эти методы не позволяют сканировать большинство систем Windows, поскольку компания Microsoft, по своему обыкновению, проигнорировала стандарт и реализовала протокол как получилось. Существуют и другие системы, в которых реакция на сканирование не соответствует стандарту. Системы Cisco, BSDI, HP/UX, MVS и IRIX передают пакет RST при сканировании открытых портов, хотя в соответствии со стандартом должны просто отбрасывать пакеты.

Вы можете видеть сравнить результаты сканирования одного хоста с использованием методов TCP SYN (рисунок 1) и Stealth FIN (рисунок 2).


Рисунок 2 Результат сканирования Stealth FIN

Ping-сканирование (-sP)</B>
Иногда бывает достаточно информации о наличии в сети активных хостов. Nmap может выполнять такую проверку путем переда&shy;чи пакетов ICMP echo request по всем IP-адресам указанной сети. Получение отклика от хоста будет говорить о его активности. Однако, некоторые сайты блокируют пакеты ICMP echo request. В таких случаях nmap может передавать пакеты TCP ACK в указанный порт (по умолчанию 80). Получение в ответ пакета RST будет говорить об активности хоста. Третий вариант состоит в передаче пакетов SYN и ожидании отклика RST или SYN/ACK. Для пользователей, не имеющих привилегий root, применяется метод connect().

По умолчанию для пользователя root программа nmap будет сканировать с помощью методов ICMP и ACK (параллельно). С помощью опции -P вы можете выбрать метод проверки.

Отметим, что ping является стандартным способом проверки доступности хостов и обычно на такое сканирование никто не реагирует как на злой умысел.
Определение версии (-sV)
После определения портов TCP и UDP с помощью одного из методов сканирования система детектирования версий взаимодействует с открытыми портами, пытаясь определить реально работающие порты. Для выбора подходящего метода проверки используется информация из файла nmap-service-probes. Nmap пытается определить связанный с портом протокол (FTP, SSH, telnet, HTTP и т. п.), имя приложения (ISC Bind, Apache httpd, Solaris telnetd и т. п.), номер версии и другие доступные сведения. При компиляции Nmap с поддержкой OpenSSL программа будет пытаться организовать соединение с серверами SSL для определения возможности использования шифрованных соединений. При обнаружении служб RPC используется модуль Nmap RPC grinder для детектирования программы RPC и номера версии этой программы. Добавочная опция --version_trace обеспечит вывод отла&shy;дочной информации в процессе детектирования версии для удаленного хоста.

Сканирование UDP (-sU)
Этот метод применяется для детектирования открытых портов UDP. Метод основан на передаче пустых пакетов UDP проверяе&shy;мому хосту. Получение в ответ пакета ICMP port unreachable будет говорить о том, что порт закрыт, а отсутствие такого отклика позволяет предположить наличие открытого порта. Однако зачастую пакеты ICMP unreachable фильтруются межсетевыми экранами, поэтому достоверной при таком сканировании можно считать только информацию о закрытых портах. В некоторых случаях Internet-провайдеры блокируют некоторые “опасные” порты (например 31337 - back orifice и 139 - Windows NetBIOS), что может создать иллюзию открытости таких портов. Не впадайте в панику, если вы обнаружили нечто подобное при сканировании своей системы извне.

Иногда приходится слышать, что сканирование портов UDP не имеет никакого смысла. Автор nmap в качестве контраргумента приводит ситуацию с уязвимостью Solaris rpcbind. Этот сервис можно связать с недокументированным портом UDP, имеющим номер более 32770. Найти такой порт без сканирования UDP достаточно сложно.

IP-сканирование (-sO)
Этот метод используется для определения поддерживаемых хостом протоколов IP. Метод основан на передаче raw-пакетов IP без дополнительных протокольных заголовков, адресованных всем протоколам проверяемого хоста. Получение отклика ICMP protocol unreachable говорит, что соответствующий протокол не поддерживается хостом, а отсутствие такого сообщения позволяет предположить наличие протокола.

Используемый этим методом вариант передачи пакетов похож на сканирование UDP и ему присущи те же ограничения, связан&shy;ные с ограничением темпа генерации сообщений ICMP. Однако поле номера протоколов IP имеет размер 8 битов, поэтому проверяется лишь 256 протоколов и это не должно занять много времени.

Метод скрытого сканирования Idlescan (-sI)
-sI <хост[:порт]>
Этот метод позволяет полностью замести следы сканирования портов TCP и проверяемый хост не будет даже получать пакетов с IP-адресом сканирующей машины. Вместо передачи пакетов со сканирующего хоста используется подставной хост, доступный через Internet. Системы IDS будут показывать сканирование с указанного параметром подставного хоста и не смогут получить адрес вашего компьютера.
Для описания сути метода обозначим используемый для сканирования хост буквой A, промежуточный хост буквой Z, а проверяемый – T.

Хост A может осуществлять мониторинг хоста Z по значениям поля ID в заголовке передаваемых этим хостом пакетов IP. Дело в том, что большинство реализаций протокола IP просто увеличивают значение поля ID в заголовке пакетов IP на 1 для каждого следующего пакета. В этом легко убедиться с помощью описанной в Приложении программы hping2. Таким образом по значению поля ID в заголовке IP полученных от хоста откликов можно определить количество пакетов, переданных этим хостом в интервале между генерацией откликов.

Вспомним, что при получении пакета SYN для открытого порта хост передает в ответ пакет SYN ACK. Если же порт закрыт, в ответ на SYN передается пакет RST ACK. При получении неожиданного пакета SYN ACK хост передает в ответ пакет RST, а при получении неожиданного пакета RST просто отбрасывает такой пакет.

На основании сказанного легко построить модель скрытого сканирования.
Хост A генерирует серию запросов ICMP, позволяющую контролировать рост значений поля ID в заголовке IP полученных от Z откликов.
Хост A генерирует пакет SYN, адресованный в интересующий порт хоста T, используя в качестве адреса отправителя IP-адрес хоста Z.
Хост T при получении пакета SYN шлет хосту Z пакет SYN ACK, если проверяемый порт открыт и RST ACK, если этот порт закрыт.
Хост Z получает от хоста T неожиданный пакет SYN ACK или RST ASK.
при получении SYN ACK хост Z передает отклик RST, вследствие чего увеличивается значение поля ID;
при получении пакета RST ASK хост Z просто отбрасывает такой пакет и увеличения ID не происходит.
Хост A, анализируя значения поля ID в заголовках откликов ICMP от хоста Z, может фиксировать передачу хостом Z пакета в интервале между откликами. Исходя из предположения об отсутствии собственной активности хоста Z, это позволяет говорить о передаче отклика на пакет SYN ACK от хоста T и наличии у последнего открытого порта
Как видите, метод очень прост и при грамотной реализации метода позволяет с высокой степенью достоверности скрытно определять состояние портов проверяемого хоста без риска быть замеченным.

Поскольку состояние хоста Z во время сканирования играет достаточно важную роль, разумно будет сначала убедиться в том, что этот хост действительно подходит для наших целей. Сделать это можно, например, с помощью команды hping -r . Если вывод этой команды будет подобен приведенному на рисунке (содержит id=+1 в течение достаточно продолжительного времени), этот хост вполне подходит для использования в качестве подставного.
bash-2.05b# hping -r
HPING (eth0 ): NO FLAGS are set, 40 headers + 0 data bytes
len=46 ip= ttl=64 DF id=3064 sport=0 flags=RA seq=0 win=0 rtt=0.6 ms
len=46 ip= ttl=64 DF id=+1 sport=0 flags=RA seq=1 win=0 rtt=0.3 ms
len=46 ip= ttl=64 DF id=+1 sport=0 flags=RA seq=2 win=0 rtt=0.4 ms
len=46 ip= ttl=64 DF id=+1 sport=0 flags=RA seq=3 win=0 rtt=0.3 ms
len=46 ip= ttl=64 DF id=+1 sport=0 flags=RA seq=4 win=0 rtt=0.3 ms
len=46 ip= ttl=64 DF id=+1 sport=0 flags=RA seq=5 win=0 rtt=0.3 ms
len=46 ip= ttl=64 DF id=+1 sport=0 flags=RA seq=6 win=0 rtt=0.3 ms
len=46 ip= ttl=64 DF id=+1 sport=0 flags=RA seq=7 win=0 rtt=0.3 ms
len=46 ip= ttl=64 DF id=+1 sport=0 flags=RA seq=8 win=0 rtt=0.3 ms
len=46 ip= ttl=64 DF id=+1 sport=0 flags=RA seq=9 win=0 rtt=0.3 ms
len=46 ip= ttl=64 DF id=+1 sport=0 flags=RA seq=10 win=0 rtt=0.3 ms
len=46 ip= ttl=64 DF id=+1 sport=0 flags=RA seq=11 win=0 rtt=0.4 ms
len=46 ip= ttl=64 DF id=+1 sport=0 flags=RA seq=12 win=0 rtt=0.3 ms
len=46 ip= ttl=64 DF id=+1 sport=0 flags=RA seq=13 win=0 rtt=0.3 ms
len=46 ip= ttl=64 DF id=+1 sport=0 flags=RA seq=14 win=0 rtt=0.3 ms
len=46 ip= ttl=64 DF id=+1 sport=0 flags=RA seq=15 win=0 rtt=0.3 ms
len=46 ip= ttl=64 DF id=+1 sport=0 flags=RA seq=16 win=0 rtt=0.3 ms

Программа nmap может корректно работать только с хостами, увеличивающими значение ID в каждом пакете на 1. Проверка показывает, что даже при стабильном значении id=+1 программа просто не работает.

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

ACK-сканирование (-sA)
Этот метод обычно используется для получения данных о политике межсетевого экрана. В частности, с помощью этого метода можно определить, учитывает брандмауэр состояние соединений (stateful inspection) или является простым пакетным фильтром, который блокирует входящие пакеты SYN.

В этом режиме программа передает пакеты ACK с кажущимися случайными номерами подтверждений и порядковыми номерами в сканируемые порты. При получении отклика RST порт считается нефильтруемым. Если же отклика просто не приходит или возвращается сообщение ICMP unreachable, порт считается фильтруемым. Программа nmap обычно не выводит сведений о нефильтруемых портах, поэтому отсутствие какого-либо списка портов в результате сканирования говорит о том, что ни один из проверенных портов не фильтруется.
В этом режиме список открытых портов обычно не выводится программой.

Window-сканирование (-sW)
Этот метод основан на определении размера окна TCP и похож на ACK-сканирование, но отличается от него тем, что наряду с детектированием состояния портов filtered/unfiltered он иногда может детектировать порты в состоянии open (вследствие получения аномальных размеров окна TCP, возвращаемых некоторыми ОС, включая BeOS, BSDI, Cray, Tru64 UNIX, DG/UX, OpenVMS, Digital UNIX, FreeBSD, HP-UX, OS/2, IRIX, MacOS, NetBSD, OpenBSD, OpenStep, QNX, Rhapsody, SunOS 4.X, Ultrix, VAX, VxWorks).

Сканирование RPC (-sR)
Этот метод используется в сочетании с другими методами сканирования, поддерживаемыми программой nmap и служит для проверки всех обнаруженных при сканировании открытых портов TCP/UDP на предмет поддержки функций RPC. Проверка осуществляется путем передачи в порт команды NULL с помощью SunRPC. Для поддерживающих RPC портов предпринимается попытка идентификации связанной с портом программы и номера ее версии. Таким образом можно определить порты и функции RPC даже в тех случаях когда порт sunrpc (111, portmapper) закрыт с помощью межсетевого экрана или иными средствами. В режиме сканирования RPC не работают приманки (decoy), описанные на стр. 7.
Сканирование по списку (-sL)
В этом режиме просто выводится список адресов IP или имен хостов, заданных другими параметрами командной строки без реального сканирования этих хостов.

Сканирование FTP bounce attack (-b)
-b <промежуточный сервер FTP>
Этот метод основан на возможности опосредованной передачи файлов по протоколу FTP (RFC 959). Этот протокол имеет странную по сегодняшним меркам особенность, позволяющую пользователю хоста A подключиться к серверу FTP на другом хосте и запросить у этого сервера передачу файла любому хосту Internet. Как было отмечено еще в 1995 году, протокол FTP можно использовать для неконтролируемой рассылки электронной почты и новостных сообщений, заполнения чужих дисков ненужными файлами, попыток обхода межсетевых экранов и иных анонимных пакостей.

Программа nmap использует эту особенность протокола для сканирования портов TCP с использованием промежуточных серверов FTP. Сканер соединяется с сервером FTP, находящимся за брандмауэром, который закрывает сканируемый хост, и сканирует с его помощью закрытые межсетевым экраном порты (например, порт 139). Если сервер FTP имеет открытый для записи каталог, можно организовать передачу в порты сканируемого хоста любых данных, позволяющих найти в системе открытые порты.

Выбор цели сканирования

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

Nmap поддерживает широкие возможности задания цели сканирования. Например, для проверки сети класса B 192.168.*.* вы можете указать цель как 192.168.*.*, 192.168.0-255.0-255, 192.168.0.0/16 и даже 192.168.1-50,51-255.1,2,3,4,5-255. Не забывайте, что многие командные процессоры при наличии в параметре символов * или / требуют использования двойных кавычек (“”).