• Твой профиль заполнен на 0%. Заполни за 1 минуту, чтобы тебя нашли единомышленники и работодатели. Заполнить →
Одноплатный компьютер с открытыми контактами на тёмном антистатическом коврике. Экран отображает зелёный текст, янтарный светодиод светится рядом, в боке мерцают огни серверов.


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

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

Зачем пентестеру сканирование портов​

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

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

На практике: запускаете одну команду и получаете полную картину атакуемой поверхности. Без этого этапа пентест превращается в стрельбу вслепую.

Установка Nmap и Masscan​

Nmap на разных платформах​

На Kali Linux Nmap предустановлен. Для остальных дистрибутивов:
Bash:
# Ubuntu/Debian
sudo apt update && sudo apt install nmap

# Fedora/RHEL
sudo dnf install nmap

# Arch Linux
sudo pacman -S nmap

# macOS через Homebrew
brew install nmap
На Windows скачайте установщик с nmap.org/download.html. Но я рекомендую WSL2 - полноценный Linux внутри Windows, и Nmap там работает без ограничений.

Проверяем установку:
Bash:
nmap --version
Момент, о котором не пишут в большинстве руководств: пакетные менеджеры часто отстают от релизов на месяцы. Как отмечается в руководстве HackerTarget, сборка из исходников даёт актуальные отпечатки ОС, обновлённые NSE-скрипты и улучшения производительности. Если вам критична точность fingerprinting - собирайте из исходников:
Bash:
wget https://nmap.org/dist/nmap-7.95.tar.bz2
bzip2 -cd nmap-7.95.tar.bz2 | tar xvf -
cd nmap-7.95/
./configure && make && sudo make install

Установка Masscan​

Bash:
sudo apt install masscan
# или из исходников:
git clone https://github.com/robertdavidgraham/masscan
cd masscan && make
Masscan - отдельный зверь, способный просканировать всё адресное пространство IPv4 менее чем за 6 минут. Но о нём подробнее ниже.

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

Перед сканированием портов нужно понять, какие машины вообще живы. Сканировать каждый IP в подсети /16 (65 536 адресов) по всем портам - это часы работы впустую. Поэтому первый шаг - ping sweep.
Bash:
sudo nmap -sn 192.168.1.0/24
Флаг -sn отключает сканирование портов и выполняет только обнаружение хостов. При запуске с root-привилегиями для целей в локальной сети используется ARP-сканирование - быстрее и надёжнее, и перечисленные ниже пробы не отправляются. Для нелокальных целей отправляются ICMP Echo Request, TCP SYN на порт 443, TCP ACK на порт 80 и ICMP Timestamp Request. Без root-привилегий для любых целей (включая локальные) используется TCP connect() на порты 80 и 443 - ARP-сканирование недоступно без raw sockets.

Пример вывода:
Код:
Starting Nmap 7.95 ( https://nmap.org ) at 2025-01-15 14:23 MSK
Nmap scan report for router.local (192.168.1.1)
Host is up (0.0012s latency).
MAC Address: A4:91:B1:2C:5D:8E (TP-Link Technologies)

Nmap scan report for 192.168.1.15
Host is up (0.045s latency).
MAC Address: B8:27:EB:A3:F2:1C (Raspberry Pi Foundation)

Nmap done: 256 IP addresses (3 hosts up) scanned in 3.29 seconds
Что здесь читается:
  • Latency - низкая (0.0012s) означает проводное подключение, высокая (0.045s) - Wi-Fi или удалённый хост
  • MAC Address и вендор - уже на этом этапе видно, что 192.168.1.15 - Raspberry Pi. В пентесте IoT-устройства часто оказываются самым слабым звеном
  • 3 hosts up из 256 - типичная картина. Даже в сетях /8 (16 миллионов адресов) может работать всего несколько тысяч машин
Если хосты прячутся за файрволом и не отвечают на стандартные пробы, комбинируйте методы:
Bash:
# TCP SYN на нестандартные порты + ICMP
sudo nmap -sn -PS22,80,443,8080 -PE 10.0.0.0/24
Для полного игнорирования этапа обнаружения (когда вы точно знаете, что хост жив):
Bash:
sudo nmap -Pn 192.168.1.1
Флаг -Pn заставляет Nmap сканировать порты без предварительной проверки доступности. Используйте его для целей за строгими файрволами, но помните - если хост действительно недоступен, вы просто потратите время на ожидание таймаутов.

Основные команды Nmap и примеры сканирования портов​

SYN-скан - рабочая лошадка пентестера​

SYN-скан (-sS) - метод по умолчанию и самый используемый. Он отправляет пакет с флагом SYN, анализирует ответ и не завершает TCP-рукопожатие:
  • Пришёл SYN-ACK - порт открыт. Nmap сразу шлёт RST, обрывая соединение
  • Пришёл RST - порт закрыт
  • Нет ответа после нескольких попыток или ICMP unreachable (type 3, codes 1,2,3,9,10,13) - порт фильтруется
Bash:
sudo nmap -sS 192.168.1.1
Почему именно SYN-скан? Он быстрый, относительно тихий (не оставляет записей в логах большинства приложений, которые логируют только установленные соединения, но может быть зафиксирован на уровне файрвола, IDS/IPS и серверов с TCP-level логированием) и работает с тысячами портов в секунду. Но - современные IDS вроде Suricata прекрасно его детектят. Не стоит считать его «невидимым».

Требует root, потому что работает с сырыми пакетами.

TCP Connect-скан - когда нет root​

Если root-доступа нет, Nmap автоматически переключается на -sT:
Bash:
nmap -sT 192.168.1.1
Этот метод использует системный вызов connect() и выполняет полное трёхстороннее рукопожатие. Медленнее, шумнее (каждое соединение логируется) и легче обнаруживается. Но работает без привилегий - иногда это единственный вариант.

UDP-скан - забытый, но критичный​

UDP-сервисы часто пропускают при сканировании, а зря. DNS (53), SNMP (161), TFTP (69) - всё это UDP, и через них ломают сети регулярно.
Bash:
sudo nmap -sU --top-ports 100 192.168.1.1
UDP-скан медленный по природе: протокол не подразумевает подтверждений, и Nmap вынужден ждать ICMP Port Unreachable для каждого закрытого порта. Если ICMP-ответа нет - порт помечается как open|filtered. Ограничивайте скоуп через --top-ports или -p, иначе скан растянется на часы.

Комбинируйте с TCP для полной картины:
Bash:
sudo nmap -sS -sU --top-ports 200 192.168.1.1

Интерпретация результатов Nmap: что означает каждый статус​

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

1776280578662.webp


Запустим типичное сканирование:
Bash:
sudo nmap -sS -sV -p- 192.168.1.1
Пример вывода:
Код:
PORT     STATE    SERVICE     VERSION
22/tcp   open     ssh         OpenSSH 8.2p1 (protocol 2.0)
80/tcp   open     http        Apache httpd 2.4.41
443/tcp  open     https       Apache httpd 2.4.41 (SSL/TLS)
3306/tcp filtered mysql
8080/tcp closed   http-proxy
Разбираем построчно:

СостояниеЧто видит NmapЧто это значит на практике
openПолучен SYN-ACKСервис слушает, можно взаимодействовать. Прямой путь к атаке
closedПолучен RSTПорт доступен, но сервис не запущен. Хост жив, файрвола нет
filteredНет ответа после ретрансмиссий или ICMP unreachable (type 3, codes 1,2,3,9,10,13)Файрвол дропает пакеты. Сервис может быть за ним
unfilteredRST на ACK-пробуПорт доступен, но открыт он или закрыт - непонятно (только ACK-скан)
open/filteredНет ответа на UDP/FIN/NULLЛибо открыт, либо фильтруется - без дополнительного скана не разобрать
closed/filteredСпецифичный ответВстречается только при Idle-скане

На что обращать внимание в реальном пентесте:
  • filtered на 3306 (MySQL) - за файрволом прячется база данных. Найдёте SSRF или RCE на веб-сервере - можно попробовать достучаться изнутри
  • closed на 8080 - сейчас пусто, но админы часто поднимают тестовые сервисы на этом порту. Стоит проверить позже
  • OpenSSH 8.2p1 - конкретная версия. Можно искать известные CVE

Fingerprinting сервисов и OS detection Nmap​

Одно дело знать, что порт 80 открыт. Другое - знать, что там Apache 2.4.41 на Ubuntu. Для этого и существуют флаги определения версий и ОС.

Определение версий сервисов​

Bash:
sudo nmap -sV 192.168.1.1
Nmap подключается к открытым портам и отправляет серию зондирующих запросов, сравнивая ответы с базой [URL='https://nmap.org/book/vscan-fileformat.html']nmap-service-probes[/URL]. Интенсивность регулируется:
Bash:
# Быстро, но менее точно
sudo nmap -sV --version-intensity 0 192.168.1.1

# Максимально точно (по умолчанию)
sudo nmap -sV --version-intensity 9 192.168.1.1
Как отмечает Netlas в своём справочнике по Nmap, при значении 0 используются только самые вероятные пробы, а значение 9 задействует все доступные - максимально точно, но шумно и медленно.

Определение операционной системы​

Bash:
sudo nmap -O 192.168.1.1
OS Detection анализирует тонкие различия в TCP/IP-стеке: значения TTL, размеры TCP-окна, порядок TCP-опций, поведение при фрагментации. Эти «отпечатки» сравниваются с базой nmap-os-db.

Для лучших результатов нужны и открытые, и закрытые порты на цели - чем разнообразнее ответы, тем точнее определение. Если уверенности мало, добавьте --osscan-guess:
Bash:
sudo nmap -O --osscan-guess 192.168.1.1

Комбо-команда для полной разведки​

В реальном пентесте я обычно запускаю вот так:
Bash:
sudo nmap -sS -sV -sC -O -T4 -p- 192.168.1.1 -oA full_scan
Разбор каждого флага:
  • -sS - SYN-скан
  • -sV - определение версий сервисов
  • -sC - запуск дефолтных NSE-скриптов (аналог --script default)
  • -O - определение ОС
  • -T4 - агрессивный тайминг (быстрее стандартного, подходит для хороших каналов)
  • -p- - все 65535 портов
  • -oA full_scan - сохранение во всех форматах (txt, xml, grepable)
Флаг -A заменяет комбинацию -sV -sC -O и добавляет traceroute. Удобное сокращение:
Bash:
sudo nmap -A -T4 192.168.1.1

Masscan - сканирование сети на максимальной скорости​

Когда нужно просканировать подсеть /16 или даже /8, Nmap становится слишком медленным. Masscan решает именно эту задачу - он заточен под скорость и способен обработать всё пространство IPv4 за считанные минуты.

Базовое использование:
Bash:
sudo masscan 10.0.0.0/16 -p 80,443,22,8080 --rate 10000
Здесь --rate 10000 - количество пакетов в секунду. На хорошем канале можно поднять до 100000, но будьте осторожны: на одном пентесте я выставил rate 50000 в клиентской сети и положил их пограничный роутер. С тех пор всегда начинаю с консервативных значений. Потренировавшись «на кошках», будете чувствовать, где можно прибавить.

Пример вывода:
Код:
Discovered open port 80/tcp on 10.0.15.23
Discovered open port 443/tcp on 10.0.15.23
Discovered open port 22/tcp on 10.0.22.107
Discovered open port 8080/tcp on 10.0.31.5
Masscan не определяет версии, не запускает скрипты, не fingerprint'ит ОС. Он просто говорит: «На этом IP открыт этот порт». Быстро и грубо.

Nmap vs Masscan: сравнение и когда что использовать​

ПараметрNmapMasscan
СкоростьТысячи портов в секундуМиллионы пакетов в секунду
ТочностьВысокая, верификация ответовВозможны пропуски и ложные срабатывания
Определение версийДа (-sV)Нет
OS detectionДа (-O)Нет
NSE-скриптыДа (сотни скриптов)Нет
UDP-сканДаДа, но без глубокой интерпретации (для DNS/SNMP шлёт специфичные пробы, для остальных - пустые UDP-пакеты)
Требования к rootДля SYN-сканаВсегда
Лучший сценарийГлубокий анализ конкретных хостовБыстрый обзор больших подсетей

Ключевой момент: результаты Masscan могут расходиться с Nmap. Masscan использует собственный TCP/IP-стек (не системный), и на высоких скоростях теряет пакеты. Если Masscan показывает порт открытым - перепроверяйте Nmap'ом. Если Masscan порт не нашёл - это не гарантия, что он закрыт.

Практический воркфлоу: Masscan + Nmap в связке​

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

Шаг 1. Быстрый проход Masscan​

Bash:
sudo masscan 10.0.0.0/16 -p 1-65535 --rate 10000 -oL masscan_results.txt
Флаг -oL сохраняет результаты в list-формате. На подсеть /16 по всем портам - 15-30 минут вместо суток на Nmap.

Шаг 2. Парсинг результатов​

Bash:
# Извлекаем уникальные IP из вывода Masscan
grep '^open' masscan_results.txt | awk '{print $4}' | sort -u > live_hosts.txt

# Агрегируем порты по IP для точечного скана Nmap
grep '^open' masscan_results.txt | awk '{ports[$4]=ports[$4] ? ports[$4]","$3 : $3} END {for(ip in ports) print "-p " ports[ip] " " ip}' > targets_with_ports.txt

Шаг 3. Глубокое сканирование Nmap по найденным целям​

Bash:
# Вариант A: скан только найденных портов (быстрее и точнее)
while read line; do sudo nmap -sS -sV -sC -O -T4 $line -oA detailed_scan_$(echo $line | awk '{print $NF}'); done < targets_with_ports.txt

# Вариант B: скан всех портов по списку хостов
# sudo nmap -sS -sV -sC -O -T4 -p- -iL live_hosts.txt -oA detailed_scan
В варианте A мы передаём Nmap конкретные порты для каждого IP - он сканирует только то, что Masscan уже нашёл, и это на порядок быстрее полного скана. Вариант B с -iL и -p- подходит, если хотите перепроверить все порты.

Шаг 4. Анализ результатов​

Bash:
# Быстрый поиск по grepable-выводу
grep "open" detailed_scan.gnmap | grep "http"
# Все веб-сервера

grep "open" detailed_scan.gnmap | grep "445"
# SMB-сервисы - частый вектор атаки
Сохраняйте результаты в XML (-oX) для импорта в Metasploit:
Bash:
# В консоли Metasploit
db_import detailed_scan.xml
hosts
services

Тайминги и скорость: как не положить сеть​

Nmap предлагает шаблоны тайминга от -T0 до -T5:

ШаблонНазваниеКогда использовать
-T0ParanoidОбход IDS, один пакет в 5 минут
-T1SneakyОбход IDS, чуть быстрее
-T2PoliteМинимальная нагрузка на сеть
-T3NormalПо умолчанию
-T4AggressiveБыстрый скан в хорошей сети
-T5InsaneМаксимальная скорость, возможны пропуски

На внутреннем пентесте я почти всегда использую -T4. На внешнем, если нужно оставаться незамеченным, - -T2 или -T1. А -T5 - только для CTF, где точность не критична.

Типичные ошибки при сканировании портов​

Забыли про -p-. По умолчанию Nmap сканирует только 1000 наиболее популярных портов. Сервис на порту 8443 или 9090 вы просто не увидите. Всегда сканируйте все 65535 портов хотя бы на этапе первичной разведки.

Игнорируют UDP. TCP-скан покрывает только половину картины. SNMP на UDP/161 с community string «public» - прямой путь к дампу всей конфигурации сетевого оборудования. Как то раз я на одном проекте так стянул полную конфигурацию Cisco - админ просто забыл сменить дефолтную строку.

Запускают Nmap без root. Без привилегий вместо быстрого SYN-скана вы получите медленный и шумный connect-скан. Nmap даже предупредит: «You requested a SYN stealth scan but did not provide sudo - using TCP connect scan instead».

Не сохраняют результаты. Всегда используйте -oA prefix для сохранения во всех форматах. Через неделю вы не вспомните, какие порты были открыты на 10.0.22.107. Проверено.

Путают filtered и closed. Closed - порт доступен, но никто не слушает. Filtered - файрвол дропает ваши пакеты. Filtered порт может скрывать критически важный сервис, к которому можно добраться через другой вектор (SSRF, пивот через скомпрометированный хост).

NSE-скрипты: расширяем разведку сети​

Nmap Scripting Engine - серьёзное дополнение к базовому сканированию. Скрипты сгруппированы по категориям: safe, default, discovery, vuln, brute и другие.

Несколько практичных примеров:
Bash:
# Перечисление директорий и файлов на веб-сервере
sudo nmap -p 80,443 --script http-enum 192.168.1.1

# Проверка на SQL-инъекции
sudo nmap -p 80 --script http-sql-injection 192.168.1.1

# Перебор поддоменов через DNS
sudo nmap --script dns-brute example.com

# Все дефолтные скрипты (безопасные)
sudo nmap -sC 192.168.1.1
Флаг -sC эквивалентен --script=default и запускает скрипты из категории default. Большинство из них также помечены как safe, но -sC - это именно категория default, а не объединение safe и default. Для тех кто в танке: safe и default - два разных тега, и они пересекаются, но не совпадают.

Заключение​

Сканирование сети Nmap для начинающих - это не про заучивание флагов. Каждый пакет рассказывает свою историю: SYN-ACK говорит «я здесь, я слушаю», RST говорит «порт свободен», а тишина - «между нами файрвол».

Начните с простого: sudo nmap -sS -sV -p- target. Научитесь читать вывод - вот прямо построчно, как мы разбирали выше. Потом добавьте Masscan для скорости, NSE-скрипты для глубины, и соберите конвейер. Сохраняйте каждый скан. Перепроверяйте результаты.

Попробуйте просканировать свою домашнюю сеть (192.168.1.0/24) и посмотрите, сколько устройств торчит наружу с открытыми портами. Готов поспорить - удивитесь. И да - сканируйте только те сети, на которые у вас есть письменное разрешение.
 
Последнее редактирование модератором:
Мы в соцсетях:

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab

Похожие темы

🚀 Первый раз на Codeby?
Гайд для новичков: что делать в первые 15 минут, ключевые разделы, правила
Начать здесь →
🔴 Свежие CVE, 0-day и инциденты
То, о чём ChatGPT ещё не знает — обсуждаем в реальном времени
Threat Intel →
💼 Вакансии и заказы в ИБ
Pentest, SOC, DevSecOps, bug bounty — работа и проекты от проверенных компаний
Карьера в ИБ →

HackerLab