За пять лет пентестов я ни разу не видел, чтобы эксплойт сработал «вслепую». Каждая успешная атака начинается с разведки: ты должен знать, что торчит в сети, на каком порту, какой версии - и только потом выбирать вектор. Сетевая разведка и сканирование портов - фундамент любого пентеста. Не освоил эту фазу - дальше можно не идти.
Здесь я разберу весь цикл сетевой разведки: от обнаружения живых хостов до определения версий сервисов и обхода IDS. Не абстрактно, а с конкретными командами, разбором каждого флага и объяснением того, что в этот момент происходит на уровне пакетов. Покажу, как связать masscan и nmap в единую цепочку и получить полную карту сети.
Что происходит при сетевой разведке и зачем она нужна
Техники сетевой разведки - первое, что выполняет пентестер (или атакующий) при работе с целевой инфраструктурой. В терминологии MITRE ATT&CK сюда попадают сразу несколько техник:
- Network Service Discovery (T1046, Discovery) - обнаружение сервисов на открытых портах
- Remote System Discovery (T1018, Discovery) - определение живых хостов в сети
- Vulnerability Scanning (T1595.002, Reconnaissance) - поиск уязвимостей через активное зондирование
Когда ты пишешь в отчёте «обнаружен открытый порт 3389», заказчик пожмёт плечами. А вот «Network Service Discovery (T1046) выявил RDP-сервис на нестандартном порту 33389 без ограничения по источникам» - это уже конкретная находка с привязкой к фреймворку, которую понимает и SOC, и CISO.
Весь процесс разведки выстраивается в три этапа:
- Обнаружение хостов - кто вообще живой в сети
- Сканирование портов - какие двери открыты
- Fingerprinting - что за ними стоит, какой версии, какой ОС
Каждый этап - свои инструменты и техники. Разберём последовательно.
Обнаружение хостов в сети: ping sweep, ARP и другие методы
Прежде чем сканировать порты, нужно понять, какие хосты вообще отвечают. Гонять всю подсеть /24 по всем 65535 портам без предварительной разведки - часы впустую.
ICMP ping sweep
Самый простой способ - отправить ICMP Echo Request каждому адресу в диапазоне:
Bash:
Код:
nmap -sn
192.168
.1.0/24 -oG ping_sweep.gnmap
Флаг
говорит nmap: «только обнаружение хостов, порты не трогай». Nmap по умолчанию шлёт не только ICMP echo, но и TCP SYN на порт 443, TCP ACK на порт 80 и ICMP timestamp request - комбинация повышает шансы обнаружить хост, даже если один из протоколов заблокирован.
Проблема: многие хосты не отвечают на ICMP. Корпоративные файрволы часто режут пинги. Если ping sweep показал 5 хостов из ожидаемых 50 - это не значит, что сеть пустая. Скорее наоборот.
ARP-сканирование в локальной сети
Если ты находишься в том же L2-сегменте, что и цели (типичная ситуация на внутреннем пентесте), ARP-запросы работают надёжнее всего:
Bash:
Код:
nmap -sn -PR
192.168
.1.0/24
Флаг
переключает nmap на ARP-запросы. Почему это надёжнее? ARP - протокол канального уровня, без него невозможна сетевая связность. Заблокировать ARP в локалке нельзя без потери коммуникации. Каждый живой хост обязан ответить - деваться ему некуда.
Кастомные пробы для обхода фильтрации
Когда ICMP заблокирован, а ты не в локальном сегменте, помогают TCP-пробы на конкретные порты. Из официальной документации nmap: для обнаружения хостов можно комбинировать несколько типов проб:
Bash:
Код:
# TCP SYN на популярные порты + ICMP
nmap -sn -PS22,80,443,3389 -PE
10.0
.0.0/24
шлёт TCP SYN на указанные порты. Если хост ответит SYN-ACK или RST - он живой.
добавляет ICMP echo на случай, если TCP-порты закрыты, но ICMP разрешён.
Извлекаем список живых хостов для следующего этапа:
Bash:
Код:
grep
"Up"
ping_sweep.gnmap
|
awk
'{print $2}'
>
live_hosts.txt
Техники сканирования портов: что происходит на уровне пакетов
Определение открытых портов - ядро сетевой разведки. Nmap поддерживает больше десяти техник сканирования, но на практике 90% задач решаются тремя: SYN, Connect и UDP. Остальные - для специфических сценариев: анализ файрволов или обход IDS.
Stealth сканирование SYN (-sS)
SYN-скан - дефолтная и самая популярная техника nmap. Именно её инструмент использует, когда запущен от root без дополнительных флагов:
Bash:
Код:
sudo
nmap -sS -p-
192.168
.1.100 -oA syn_scan
Что происходит в сети:
- Nmap шлёт TCP-пакет с флагом SYN на целевой порт
- Если порт открыт - цель отвечает SYN-ACK. Nmap немедленно отправляет RST, обрывая соединение
- Если порт закрыт - цель отвечает RST
- Если нет ответа или приходит ICMP unreachable - порт помечается как filtered
Почему «stealth»? TCP-хендшейк не завершается. Многие приложения логируют только установленные соединения (после ACK), а SYN-скан до этого шага не доходит. Но не обольщайся: современные IDS (Snort, Suricata) прекрасно видят SYN-сканы по паттерну множественных SYN-пакетов без завершения хендшейка. Stealth - это скорее историческое название.
Флаг
критически важен - он сканирует все 65535 портов. Без него nmap проверяет только top-1000. На моей практике забытые сервисы регулярно обнаруживаются на нестандартных портах: RDP на 33389, веб-интерфейсы на 8443, 9090, базы данных на 13306. Пропустишь порт - пропустишь вектор атаки.
TCP Connect сканирование (-sT)
Connect-скан использует системный вызов
для установки полного TCP-соединения:
Bash:
Код:
nmap -sT -p-
192.168
.1.100 -oA connect_scan
Разница с SYN-сканом:
ПараметрSYN-скан (-sS)Connect-скан (-sT)Требует rootДаНетЗавершает хендшейкНетДаСкоростьБыст рееМедленнееВидимость в логахТолько IDSIDS и логи приложенийТочностьВысокая Высокая
Когда использовать Connect-скан? Когда нет root-прав - тут без вариантов. Или когда сеть использует stateful firewall, который отслеживает SYN без ACK и блокирует такие пакеты - тогда полное соединение может пройти, а половинчатое нет. На практике это редкость, но я встречал такие конфигурации в банковских сетях.
UDP-сканирование (-sU)
UDP-сканирование - головная боль начинающих пентестеров. Но игнорировать его нельзя: DNS (53), SNMP (161/162), DHCP (67/68) - критичные сервисы, которые работают по UDP. Как сказано в документации nmap: «exploitable UDP services are quite common and attackers certainly don't ignore the whole protocol».
Bash:
Код:
sudo
nmap -sU --top-ports
100
192.168
.1.100 -oA udp_scan
Почему UDP-скан такой медленный и капризный:
- UDP не имеет хендшейка. Отправил пакет - и сидишь ждёшь
- Если порт закрыт - цель отвечает ICMP Port Unreachable
- Если порт открыт - обычно тишина (нет ответа вообще)
- Nmap помечает отсутствие ответа как
- порт может быть как открытым, так и отфильтрованным файрволом
И ещё одна радость: Linux и Solaris ограничивают скорость отправки ICMP Port Unreachable (по умолчанию - один в секунду). Это значит, что сканирование 65535 UDP-портов на Linux-хосте может занять более 18 часов. Именно поэтому для UDP я использую
вместо полного перебора.
Совет из практики: комбинируй UDP и TCP в одном запуске:
Bash:
Код:
sudo
nmap -sS -sU --top-ports
200
-iL live_hosts.txt -oA combined_scan
ACK-сканирование для анализа файрволов (-sA)
ACK-скан не ищет открытые порты - он определяет правила файрвола:
Bash:
Код:
sudo
nmap -sA -p
80,443
,8080
192.168
.1.1
Nmap шлёт пакеты только с флагом ACK. Это не начало соединения, поэтому:
- Если приходит RST - порт не фильтруется (пакет прошёл через файрвол)
- Если ответа нет или приходит ICMP unreachable - порт фильтруется
Зачем? На внешнем пентесте перед активным сканированием полезно понять, какие порты файрвол вообще пропускает. Экономит время и снижает шум.
Masscan - быстрое сканирование портов на больших сетях
Когда нужно просканировать подсеть /16 (65536 адресов), nmap будет работать часы. Masscan решает задачу на порядки быстрее - за минуты при сканировании ограниченного набора портов или высоком rate (100K+), хотя полное сканирование всех 65535 портов на /16 при умеренном rate займёт дни. По данным автора - Роберта Грэхема - masscan способен отправлять до 10 миллионов пакетов в секунду на 10GbE-адаптере.
Но есть принципиальная разница: masscan - это «радар», nmap - «бинокль с тепловизором». Masscan быстро находит, где торчат открытые порты. Nmap детально исследует каждый найденный.
Базовый запуск с безопасным rate
Bash:
Код:
sudo
masscan -p1-65535
10.0
.0.0/16 --rate
=
5000
\
-oG masscan_results.gnmap
Разбор флагов:
- - все TCP-порты. Masscan не знает никаких «top-1000»
- - 5000 пакетов в секунду. Для корпоративной LAN - приемлемо. Для продакшн-среды с чувствительным оборудованием снижай до 1000
- - grepable-формат, удобный для парсинга и передачи в nmap
Классическая ошибка джуниора: запуск masscan без rate-лимита на клиентской сети. На моём первом пентесте стажёр запустил masscan с rate 50000 на /16 подсеть - сетевое оборудование начало терять пакеты, SOC позвонил через минуту. Rate всегда согласовывай с условиями engagement.
Передача результатов masscan в nmap
Masscan - грубый инструмент с ложноположительными результатами (асинхронная отправка и приём пакетов, без ожидания ответа на каждый). Всегда верифицируй находки:
Bash:
Код:
# Извлекаем уникальные IP из результатов masscan
grep
"Host:"
masscan_results.gnmap
\
|
awk
'{print $2}'
|
sort
-u
>
masscan_hosts.txt
# Глубокое сканирование найденных хостов через nmap
# Здесь используется -p- для полной верификации всех портов,
# а не только найденных masscan (у которого бывают false negatives).
# Для экономии времени можно извлечь порты из masscan и передать через -p.
sudo
nmap -sS -sV -sC -O
\
-iL masscan_hosts.txt
\
-oA detailed_scan
\
--max-retries
2
\
--host-timeout 30m
Эта двухэтапная схема - «masscan для охвата, nmap для глубины» - стандартная методология пентеста сканирования портов на больших инфраструктурах. Лично я другой связки для крупных сетей не использую.
Fingerprinting сервисов и определение ОС через nmap
Найти открытый порт - полдела. Нужно понять, что за ним стоит. Сканирование сервисов и версий - этап, который превращает список портов в список потенциальных векторов атаки.
Version Detection (-sV)
Bash:
Код:
sudo
nmap -sV --version-intensity
7
-p
22,80
,443,3306,8080
192.168
.1.100
Как работает
: nmap подключается к открытому порту и шлёт набор проб (probes) из базы
. Ответы сравниваются с известными паттернами. Параметр
управляет количеством проб:
- - минимум проб, максимум скорости
- (по умолчанию) - все пробы, максимум точности
На практике я ставлю
Код:
--version-intensity 5-7
- баланс между скоростью и точностью. Полная интенсивность нужна только для хостов, где стандартные пробы дали
или неопределённый результат.
Banner grabbing через netcat
Когда nmap показывает порт как
(сервис принял соединение, но не ответил на пробы), проверяю руками:
Bash:
Код:
# HTTP banner
echo
-e
"HEAD / HTTP/1.0\r\n\r\n"
|
nc
-w
5
192.168
.1.100
8080
# SSH banner - часто отдаёт версию сразу при подключении
nc
-w
5
192.168
.1.100
22
# SMTP banner
nc
-w
5
192.168
.1.100
25
SSH обычно сразу возвращает строку вида
Код:
SSH-2.0-OpenSSH_8.9p1 Ubuntu-3ubuntu0.6
. Одна строка - и ты знаешь: OpenSSH 8.9, Ubuntu. Можно искать CVE под эту версию. Просто, как два байта переслать.
OS Fingerprinting (-O)
Bash:
Код:
sudo
nmap -O --osscan-guess
192.168
.1.100
Nmap анализирует поведение TCP/IP стека цели: значения TTL, TCP Window Size, TCP Options, ICMP-ответы, фрагментацию. Каждая ОС реализует стек чуть по-своему - nmap сравнивает ответы с базой
.
Флаг
заставляет nmap выдать наиболее вероятную ОС даже при низкой уверенности. Полезно, когда файрвол искажает часть ответов.
Для надёжного fingerprinting нужны и открытые, и закрытые порты на цели - nmap использует разницу в ответах для сопоставления с базой.
NSE-скрипты: поиск уязвимостей через nmap
Nmap Scripting Engine превращает сканер портов в инструмент для Vulnerability Scanning (T1595.002, Reconnaissance):
Bash:
Код:
# Общий скан на известные уязвимости
nmap -sV --script vuln -p
445
192.168
.1.0/24
# Проверка EternalBlue (MS17-010)
nmap -p
445
--script smb-vuln-ms17-010
192.168
.1.0/24
# Проверка MS12-020 (CVE-2012-0002) - RCE в RDP
nmap -p
3389
--script rdp-vuln-ms12-020
192.168
.1.100
# Аудит SSL/TLS конфигурации
nmap -p
443
--script ssl-enum-ciphers
192.168
.1.100
CVE-2012-0002 (CVSS v2: 9.3, HIGH - верхняя из трёх категорий severity в CVSS v2: Low 0.0–3.9, Medium 4.0–6.9, High 7.0–10.0; CVSS v3 не присвоен) - уязвимость в реализации Remote Desktop Protocol в Microsoft Windows XP SP2/SP3, Windows Server 2003 SP2, Windows Vista SP2, Windows Server 2008 SP2/R2/R2 SP1 и Windows 7 Gold/SP1. Некорректная обработка RDP-пакетов в памяти позволяет удалённому атакующему выполнить произвольный код через специально сформированные RDP-пакеты, вызывающие доступ к неинициализированному или удалённому объекту. Классификация: CWE-94 (официальная классификация NVD). Описание CVE упоминает доступ к неинициализированному или удалённому объекту в памяти, что, по мнению ряда исследователей, ближе к CWE-416 (Use After Free) / CWE-824 (Access of Uninitialized Pointer), однако NVD официально классифицирует уязвимость как CWE-94.
В стандартной поставке nmap (на момент написания) нет официального NSE-скрипта для BlueKeep (CVE-2019-0708). Доступны community-скрипты (например, от Ekultek на GitHub). Альтернативы: rdpscan (Robert Graham) или модуль Metasploit
Код:
auxiliary/scanner/rdp/cve_2019_0708_bluekeep
. CVE-2019-0708 - уязвимость удалённого выполнения кода в Remote Desktop Services с CVSS 9.8 (CRITICAL). Вектор: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H - атака по сети, низкая сложность, не нужны ни привилегии, ни действие пользователя. Классификация: CWE-416 (Use After Free). Затрагивает Windows XP, Windows Server 2003, Windows 7, Windows Server 2008 и Windows Server 2008 R2. Помимо десктопных и серверных ОС Microsoft, уязвимость затрагивает ряд промышленных и медицинских систем (например, Siemens Axiom Multix M), использующих встроенные версии Windows с RDP. Microsoft выпустила внеплановые патчи даже для снятых с поддержки XP и Server 2003 - что уже само по себе говорит о серьёзности дыры.
Обход систем обнаружения: stealth-техники сканирования
На реальном пентесте тебя мониторит SOC. Вот техники, которые снижают вероятность обнаружения (но не гарантируют невидимость - держи это в голове):
Управление скоростью (-T)
Nmap поддерживает шесть профилей тайминга:
ПрофильНазваниеЗадержка между пробамиКогда применять-T0Paranoid5 минутОбход IDS при внешнем пентесте-T1Sneaky15 секундСкрытное сканирование-T2Polite0.4 секундыЧувствительные сети-T3NormalПо умолчаниюСтандартные задачи-T4AggressiveМинимальнаяБыстрое сканирование в LAN-T5InsaneБез задержекТестовые среды
На внутреннем пентесте обычно хватает
или
. Для внешней разведки с требованием скрытности -
или
. Лично я на внешних проектах почти всегда начинаю с
- лучше подождать лишний час, чем получить звонок от SOC на второй минуте.
Фрагментация пакетов
Bash:
Код:
sudo
nmap -sS -f --mtu
16
-p
80,443
192.168
.1.100
Флаг
разбивает IP-пакеты на фрагменты.
задаёт размер фрагмента (должен быть кратен 8). Некоторые stateless файрволы не умеют собирать фрагментированные пакеты и пропускают их без анализа. Современные stateful файрволы это видят, но в устаревших инфраструктурах (а таких до сих пор полно) - работает.
Decoy-сканирование
Bash:
Код:
sudo
nmap -sS -D RND:10 -p-
192.168
.1.100
подмешивает к твоему сканированию 10 поддельных IP-адресов. В логах цели будет 11 «сканеров» вместо одного. Но случайные decoy-адреса (RND) часто неэффективны - IDS может отфильтровать их по отсутствию обратного трафика или принадлежности к нерелевантным диапазонам. Для реальной эффективности лучше указывать IP живых хостов в той же подсети:
Код:
-D 10.0.0.5,10.0.0.12,10.0.0.33,ME
.
Рандомизация порядка портов
Bash:
Код:
sudo
nmap -sS --randomize-hosts -p- -iL live_hosts.txt
По умолчанию nmap сканирует хосты в определённом порядке.
перемешивает порядок обхода. Порты nmap рандомизирует по умолчанию (можно контролировать через
или
для последовательного перебора).
Полный цикл сетевой разведки: пошаговый сценарий
Вот как я выстраиваю пентест сканирование портов на реальном проекте. Делай раз, делай два, делай три.
Шаг 1: подготовка рабочей директории
Bash:
Код:
ENGAGEMENT
=
"pentest_$(date +%Y%m%d)"
mkdir
-p /tmp/
${ENGAGEMENT}
/
{
scans,pcaps,loot
}
Шаг 2: быстрый охват через masscan
Bash:
Код:
sudo
masscan -p1-65535
10.10
.0.0/16 --rate
=
3000
\
-oG /tmp/
${ENGAGEMENT}
/scans/masscan_full.gnmap
При rate=3000 и полном диапазоне портов на /16 сканирование займёт дни (65536 хостов × 65535 портов / 3000 пакетов/сек ≈ 16+ дней). Для быстрого охвата ограничьте набор портов (
) или увеличьте rate. Получаем грубую карту открытых портов.
Шаг 3: извлечение живых хостов
Bash:
Код:
grep
"Host:"
/tmp/
${ENGAGEMENT}
/scans/masscan_full.gnmap
\
|
awk
'{print $2}'
|
sort
-u
\
>
/tmp/
${ENGAGEMENT}
/scans/live_hosts.txt
echo
"Найдено хостов: $(wc -l >
/tmp/
${ENGAGEMENT}
/scans/live_hosts.txt
sort
-u -o /tmp/
${ENGAGEMENT}
/scans/live_hosts.txt
\
/tmp/
${ENGAGEMENT}
/scans/live_hosts.txt
Шаг 5: глубокое nmap сканирование сети
Bash:
Код:
sudo
nmap -sS -sV -sC -O
\
-p-
\
-iL /tmp/
${ENGAGEMENT}
/scans/live_hosts.txt
\
-oA /tmp/
${ENGAGEMENT}
/scans/full_scan
\
--max-retries
2
\
--host-timeout 30m
\
-T4
Разбор:
(SYN-скан) +
(определение версий) +
(скрипты по умолчанию) +
(OS fingerprinting) +
(все порты) +
(агрессивный тайминг для LAN).
Шаг 6: точечный поиск уязвимостей
Bash:
Код:
# SMB-уязвимости на всех хостах с портом 445
sudo
nmap -p
445
--script smb-vuln-ms17-010,smb-vuln-ms08-067
\
-iL /tmp/
${ENGAGEMENT}
/scans/live_hosts.txt
\
-oA /tmp/
${ENGAGEMENT}
/scans/smb_vulns
# SSL/TLS аудит на всех HTTPS
sudo
nmap -p
443,8443
--script ssl-enum-ciphers
\
-iL /tmp/
${ENGAGEMENT}
/scans/live_hosts.txt
\
-oA /tmp/
${ENGAGEMENT}
/scans/ssl_audit
Шаг 7: ручная верификация нестандартных портов
Bash:
Код:
# Порт 9090 показал tcpwrapped - проверяем руками
echo
-e
"GET / HTTP/1.0\r\n\r\n"
|
nc
-w
5
10.10
.5.42
9090
# Записываем трафик во время ручных проверок
sudo
tcpdump -i eth0 -w /tmp/
${ENGAGEMENT}
/pcaps/manual.pcap
\
host
10.10
.5.42
&
Шаг 8: UDP-сканирование приоритетных целей
Bash:
Код:
sudo
nmap -sU --top-ports
50
\
-iL /tmp/
${ENGAGEMENT}
/scans/live_hosts.txt
\
-oA /tmp/
${ENGAGEMENT}
/scans/udp_scan
\
--max-retries
1
UDP-скан запускаю последним и только по top-50 портам - иначе время ожидания взорвётся на больших сетях.
Сводная таблица инструментов сетевой разведки
ИнструментЗадачаСкоростьТ очностьТребует rootmasscanБыстрый охват больших сетейОчень высокаяСредняяДаnmap -sSSYN-сканирование портовВысокаяВысокаяДаnmap -sTConnect-сканированиеСредняяВысока яНетnmap -sVFingerprinting сервисов nmapНизкаяОчень высокаяНетnmap -OOS fingerprintingНизкаяВысокаяДаnmap --scriptNSE-скрипты (vuln, enum)Зависит от скриптаВысокаяЗависит от скриптаnetcatBanner grabbing, ручная проверкаРучнаяТочнаяНетtcpd umpАнализ трафика при сканированииПассивныйТочн аяДа
Логика связки:
masscan (быстро находим, где что-то торчит) →
nmap -sS (верифицируем открытые порты) →
nmap -sV -sC (определяем сервисы и версии) →
nmap --script vuln (ищем уязвимости) →
netcat (ручная доверификация сомнительных портов).
Типичные ошибки начинающих
Сканирование только top-1000 портов. Без
nmap проверяет 1000 наиболее популярных портов. Сервис на порту 8888, 31337 или 50000 будет пропущен. Я находил RDP на 33389, Jenkins на 8888, незащищённые REST API на 50080 - всё за пределами top-1000. Для тех кто в танке - это значит, что без
вы тупо не видите треть поверхности атаки.
Доверие результатам masscan без верификации. Masscan использует асинхронную отправку - он не ждёт ответа на каждый пакет. Ложноположительные результаты - норма. Всегда проверяй через nmap.
Запуск с -T5 на продакшн-сети. Агрессивный тайминг генерирует поток пакетов, который может положить сетевое оборудование. Для продакшн-сред максимум
, для чувствительных -
. Один раз наступишь на эти грабли - запомнишь навсегда.
Игнорирование UDP. DNS, SNMP, TFTP, NTP - все по UDP. SNMP с community string
- частая находка на внутренних пентестах, дающая доступ к конфигурации сетевого оборудования.
Сканирование без записи результатов. Флаг
сохраняет вывод в трёх форматах (nmap, xml, gnmap). Без него повторный скан - потерянные часы.
Сетевая разведка - навык, который нарабатывается практикой. Подними виртуальную лабораторию, поставь несколько машин с разными сервисами и пройди весь цикл: от masscan до ручного banner grabbing. Когда увидишь, как SYN-ACK приходит на tcpdump в реальном времени - поймёшь, как это работает, лучше любого учебника. Попробуйте просканировать свой лабораторный сегмент по шагам из раздела выше и сравнить, что нашёл masscan, а что - nmap. Расхождения будут, и они многое объяснят.