Jump to content
From ArchWiki
Состояние перевода: На этой странице представлен перевод статьи Nmap. Дата последней синхронизации: 10 декабря 2022. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.

С официального сайта:

  Nmap (“Network Mapper”) — инструмент с открытым исходным кодом для исследования сети и аудита безопасности. Он был разработан для быстрого сканирования больших сетей, хотя прекрасно работает и с отдельными хостами. Nmap использует raw IP-пакеты для определения, какие хосты доступны в сети, какие сервисы (имя и версия приложения) на них запущены, какие операционные системы (и версии ОС) на них установлены, какие типы пакетных фильтров/межсетевых экранов используются, и десятки других характеристик. Хотя Nmap обычно используется для аудита безопасности, многие системные и сетевые администраторы находят его полезным для выполнения рутинных задач, таких как инвентаризация сети, управление графиком обновления служб и мониторинг времени работы хостов или служб.

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

## Установка

Установите пакет nmap.

Также есть графический интерфейс zenmapAUR, но в этой статье рассматривается только использование командной строки.

## Использование

Смотрите nmap(1).

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

Совет: Чтобы вывести все пакеты, которые отправляет и получает Nmap, используйте опцию `--packet-trace`.

Есть несколько способов задать цель, которую Nmap должен будет просканировать. Самый простой способ — написать адрес или домен:

    $ nmap scanme.nmap.org
    $ nmap 74.207.244.221

#### Определение нескольких целей

С помощью CIDR-нотации можно задать диапазон адресов. Следующий пример будет сканировать все 256 IP-адресов, начинающихся на `10.1.1`:

    $ nmap 10.1.1.0/24

Примечание: Число `0` в данном примере ни на что не влияет: `nmap 10.1.1.0/24` и, к примеру, `nmap 10.1.1.134/24` означают одно и то же.

Можно задать диапазон через дефис. Пример сканирования `10.1.50.1`, `10.1.51.1` и `10.1.52.1`:

    $ nmap 10.1.50-52.1

Задать определённые значения через запятую:

    $ nmap 10.1.50,51,52,57,59.1

Всё вместе:

    $ nmap 10.1,2.50-52.1/30 10.1.1.1 10.1.1.2

### Сканирование с целью составления списка

Опция `-sL` (list scan) полезна для проверки, что вы задали правильные цели сканирования, перед выполнением реального сканирования:

    $ nmap -sL 10.1,2.50-52.1/30 10.1.1.1 10.1.1.2

Запуск с этой опцией просто выведет список всех прописанных адресов без отправки им каких-либо пакетов.

### Опции по умолчанию

Если вы укажете только IP-адрес или домен без дополнительных опций:

    $ nmap 74.207.244.221

Nmap сделает следующее:

1. Домен будет преобразован в IP-адрес или, наоборот, IP-адрес будет преобразован в домен с помощью reverse-DNS (для отключения добавьте опцию `-n`).
2. Выполнится пинг-сканирование с использованием TCP ACK:80 и ICMP. Это эквивалентно `-PA -PE` (для отключения добавьте опцию `-PN`).
3. Выполнится сканирование 1000 самых популярных портов. При запуске от имени root используется скрытное SYN-сканирование. При запуске от имени пользователя используется сканирование с помощью системного вызова `connect`.

## Пинг-сканирование

Пинг-сканирование (ping scan, обнаружение хостов) — это метод определения, работают ли указанные компьютеры. По умолчанию Nmap выполняет пинг-сканирование перед сканированием портов, чтобы не тратить время на хосты, которых даже нет в сети. Чтобы выполнить только пинг-сканирование, используйте опцию:

    $ nmap -sn 10.1.1.1/8

Nmap проверит доступность каждого указанного хоста и выведет список ответивших хостов.

Nmap использует разные типы пингования при запуске с правами пользователя или root и при сканировании своей или сторонней подсети:

| Внешний IP | Локальный IP
--- | --- | ---
Обычный пользователь | TCP SYN на портах 80 и 443 | TCP SYN на портах 80 и 443 и ARP
Суперпользователь | TCP SYN на портах 80 и 443 и IGMP | ARP

### Типы пинг-сканирования

Опция | Тип
--- | ---
`-Pn` | Отключение пинг-сканирования
`-PS` | TCP SYN (по умолчанию на порту 80)
`-PA` | TCP ACK (по умолчанию на порту 80)
`-PU` | UDP
`-PY` | SCTP INIT
`-PE` | ICMP Echo
`-PP` | ICMP timestamp
`-PM` | ICMP address mask
`-PO` | Other IP protocol
`-PR` | ARP сканирование

`-Pn` полезен, когда сканируемый хост защищён межсетевым экраном, который блокирует доступ к TCP-портам 80 и 443 и IGMP-запросы, но может принимать подключения на других менее распространённых портах.

## Сканирование портов

Порт может быть в трёх основных состояниях:

- открыт (`open`) — на хосте есть программа, которая слушает этот порт и успешно ответила на запрос
- закрыт (`closed`) — хост ответил, что этот порт никто не слушает
- фильтруется (`filtered`) — хост вообще не ответил. Это может означать, что запрос был заблокирован межсетевым экраном

В дополнение к ним существует ещё 3 состояния, в которых Nmap может классифицировать порт. Они используются, когда Nmap не может достоверно определить состояние, но подозревает два из трех возможных состояний:

- `open|closed` (`unfiltered`) — порт открыт или закрыт (при ACK-сканировании)
- `closed|filtered`) — порт закрыт или фильтруется (при сканировании IP ID idle типа)
- `open|filtered` — порт открыт или фильтруется (например, при UDP-сканировании)

По умолчанию Nmap сканирует 1000 самых популярных портов, указанных в файле `/usr/share/nmap/nmap-services`. Можно задать сканирование другого количества популярных портов:

    $ nmap --top-ports 1000 10.1.1.1

Чтобы задать свои номера портов, используйте опцию `-p`:

    $ nmap -p -25,135-137 10.1.1.1

Определение портов с дефисами и запятыми работает так же, как и #Определение цели сканирования. Кроме того, можно указать все порты до/после заданного, пропуская начальный/конечный порт при использовании дефиса. Например, для сканирования всех возможных 65535 портов (кроме порта 0):

    $ nmap -p -

### Типы сканирования

Опция | Тип
--- | ---
`-sP` | Только пинг-сканирование
`-sS` | TCP SYN (скрытное) (По умолчанию при запуске суперпользователем)
`-sT` | TCP с системным вызовом connect (По умолчанию при запуске обычным пользователем)
`-sA` | TCP ACK
`-sF` | TCP FIN
`-sX` | TCP FIN, SYN, ACK
`-sW` | TCP window
`-sM` | TCP сканирование Мэймона (Maimon)
`-sU` | UDP-сканирование
`-sI` | «Ленивое» idle сканирование
`-b` | FTP bounce сканирование
`-sO` | Сканирование других IP-протоколов

## Методы борьбы со сканированием

### Модуль PSD для iptables

PSD — модуль расширения для iptables. Он также применяется в некоторых коммерческих маршрутизаторах, использующих Linux.

У него есть 4 параметра:

- `--psd-weight-threshold порог`, по умолчанию: `21`

  Общий вес последних TCP/UDP-пакетов, пришедших с одного хоста, но на разные порты, при достижении которого хост станет считаться сканером портов.

- `--psd-delay-threshold задержка`, по умолчанию: `300` (3 секунды)

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

- `--psd-lo-ports-weight вес`, по умолчанию: `3`

  Вес пакетов с привилегированным (<1024) портом назначения.

- `--psd-hi-ports-weight вес`, по умолчанию: `1`

  Вес пакетов с непривилегированным (>=1024) портом назначения.

Принцип действия PSD простой. Если запросы с одного IP набрали суммарный вес, превышающий заданный порог в течение заданной задержки, то IP классифицируется как сканер портов. В математическом выражении:

    lo_ports_weight * REQUESTS_LOW + hi_ports_weight * REQUESTS_HIGH >= threshold

где

    REQUESTS_LOW = число запросов к привилегированным (от 0 до 1023) портам в течение заданной задержки
    REQUESTS_HI = число запросов к непривилегированным (от 1024 до 65535) портам в течение заданной задержки

Примеры при использовании параметров по умолчанию:

- Если хост обратился как минимум к 7 привилегированным портам в течение 3 секунд, он считается сканером портов.
- Если хост обратился как минимум к 21 непривилегированным портам в течение 3 секунд, он считается сканером портов.
- Если хост обратился к 4 привилегированным и к 9 непривилегированным портам в течение 3 секунд, он считается сканером портов, потому что `4*3 + 9*1 >= 21`.

### Избегание обнаружения

Простейший способ обойти PSD — просто сканировать медленно. Для параметров PSD по умолчанию достаточно добавить такую опцию:

    $ nmap --scan-delay 3.1 192.168.56.1

Ещё одним интересным фактом о PSD является то, что он не определяет запрос как сканирование порта, если установлены флаги `ack` или `rst` (смотрите функцию `is_portscan` в xt_psd.c).

Также, если вы сканируете порт хоста, а на нём запущена служба HTTP(S), nmap по умолчанию будет использовать User-Agent `Mozilla/5.0 (compatible; Nmap Scripting Engine; https://nmap.org/book/nse.html)`. Таким образом, ваши действия будут легко обнаружены, особенно если администратор или робот следят за появлением такого User-Agent в журналах сервера. К счастью, nmap позволяет нам легко изменить эту строку: просто добавьте опцию `-script-args http.useragent="какой угодно user agent"`. Источник

## Советы и рекомендации

### Ограничение скорости сканирования

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

Чтобы отправлять пакеты не чаще, чем каждые 3,333 секунды:

    $ nmap --max-rate 0.3 192.168.56.1

Чтобы отправлять пакеты раз в 3,1 секунды:

    $ nmap --scan-delay 3.1 192.168.56.1

Есть и другие опции, которые подробно описаны в nmap(1).

### Считывание целей из файла

Если нужно просканировать большое количество несмежных адресов, то прописывать их все в командной строке обычно неудобно. По этой причине Nmap поддерживает чтение целей из файла с помощью опции `-iL` (input from a list file):

    addresses.txt

    10.1.1.1 10.1.1.2 10.1.1-10.3
    10.3.1.3 10.3.1.50 10.3.2.55
    10.1.1.100
    ...

    $ nmap -iL addresses.txt

Адреса нужно разделять пробельными символами.

Также можно считывать список из стандартного ввода (`-` означает стандартный ввод во многих консольных инструментах):

    $ echo "10.1.1.1 10.1.1.2 10.1.1-10.3" | nmap -iL -

### Исключение целей из сканирования

    $ nmap 10.1.1.1-10 --exclude 10.1.1.5,7

Или считывание из файла:

    $ nmap 10.1.1.1-10 --excludefile excludeaddr.txt

### Подмена

Подмена исходящего IP-адреса:

    $ nmap -S 192.168.56.35 -e vboxnet0 192.168.56.11

Подмена MAC-адреса:

    $ nmap --spoof-mac 01:02:03:04:05:06 192.168.56.11

Подмена исходящего порта:

    $ nmap --source-port 22 192.168.56.11

### Ускорение сканирования

По умолчанию nmap выполняет DNS/reverse-DNS запросы. Чтобы отключить это, используйте опцию `-n`:

    $ nmap -n 192.168.56.0/24

Это ускоряет сканирование примерно в 2 раза.

### Сканирование порта 0

По умолчанию порт с номером 0 не сканируется, даже если указать опцию `-p -`. Чтобы просканировать и его тоже, явно задайте диапазон с его использованием. Например, чтобы просканировать абсолютно все порты:

    $ nmap -p 0-65535

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

### Форматы вывода файлов

Помимо вывода в терминал, Nmap умеет записывать результаты сканирования в файл:

- `-oN файл`

  Обычный вывод, аналогичен выводу в терминал

- `-oX файл`

  XML-вывод с очень подробной информацией, удобен для обработки программами

- `-oG файл`

  Вывод, удобный для работы с grep, объявлен устаревшим

- `-oA имя`

  Всё сразу. Создаст файлы с именами `имя.nmap`, `имя.xml` и `имя.gnmap`

Например, чтобы записать вывод в терминал, в файл и в XML-файл:

    $ nmap -oN output.txt -oX output.xml scanme.nmap.org

## Смотрите также

- Wikipedia:ru:nmap
- Официальный сайт
- Nmap Network Scanning book

Categories:

- Networking (Русский)
- Security (Русский)