Когда я провожу внешний пентест, первое, что открываю в терминале - 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
Проверяем установку:
Bash:
nmap --version
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
Обнаружение хостов в сети
Перед сканированием портов нужно понять, какие машины вообще живы. Сканировать каждый 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
Требует 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
open|filtered. Ограничивайте скоуп через --top-ports или -p, иначе скан растянется на часы.Комбинируйте с TCP для полной картины:
Bash:
sudo nmap -sS -sU --top-ports 200 192.168.1.1
Интерпретация результатов Nmap: что означает каждый статус
Вот тут новички спотыкаются чаще всего. Nmap выделяет шесть состояний портов, и понимание разницы между ними - ключ к грамотной разведке.Запустим типичное сканирование:
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) | Файрвол дропает пакеты. Сервис может быть за ним |
| unfiltered | RST на 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
[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
Определение операционной системы
Bash:
sudo nmap -O 192.168.1.1
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
Nmap vs Masscan: сравнение и когда что использовать
| Параметр | Nmap | Masscan |
|---|---|---|
| Скорость | Тысячи портов в секунду | Миллионы пакетов в секунду |
| Точность | Высокая, верификация ответов | Возможны пропуски и ложные срабатывания |
| Определение версий | Да (-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
-iL и -p- подходит, если хотите перепроверить все порты.Шаг 4. Анализ результатов
Bash:
# Быстрый поиск по grepable-выводу
grep "open" detailed_scan.gnmap | grep "http"
# Все веб-сервера
grep "open" detailed_scan.gnmap | grep "445"
# SMB-сервисы - частый вектор атаки
-oX) для импорта в Metasploit:
Bash:
# В консоли Metasploit
db_import detailed_scan.xml
hosts
services
Тайминги и скорость: как не положить сеть
Nmap предлагает шаблоны тайминга от-T0 до -T5:| Шаблон | Название | Когда использовать |
|---|---|---|
-T0 | Paranoid | Обход IDS, один пакет в 5 минут |
-T1 | Sneaky | Обход IDS, чуть быстрее |
-T2 | Polite | Минимальная нагрузка на сеть |
-T3 | Normal | По умолчанию |
-T4 | Aggressive | Быстрый скан в хорошей сети |
-T5 | Insane | Максимальная скорость, возможны пропуски |
На внутреннем пентесте я почти всегда использую
-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) и посмотрите, сколько устройств торчит наружу с открытыми портами. Готов поспорить - удивитесь. И да - сканируйте только те сети, на которые у вас есть письменное разрешение.
Последнее редактирование модератором: