За пять лет пентестов я ни разу не видел, чтобы эксплойт сработал «вслепую». Каждая успешная атака начинается с разведки: ты должен знать, что торчит в сети, на каком порту, какой версии - и только потом выбирать вектор. Сетевая разведка и сканирование портов - фундамент любого пентеста. Не освоил эту фазу - дальше можно не идти.
Здесь я разберу весь цикл сетевой разведки: от обнаружения живых хостов до определения версий сервисов и обхода IDS. Не абстрактно, а с конкретными командами, разбором каждого флага и объяснением того, что в этот момент происходит на уровне пакетов. Покажу, как связать masscan и nmap в единую цепочку и получить полную карту сети.
Что происходит при сетевой разведке и зачем она нужна
Техники сетевой разведки - первое, что выполняет пентестер (или атакующий) при работе с целевой инфраструктурой. В терминологии MITRE ATT&CK сюда попадают сразу несколько техник:-
Ссылка скрыта от гостей- обнаружение сервисов на открытых портах
- Remote System Discovery (T1018, Discovery) - определение живых хостов в сети
-
Ссылка скрыта от гостей- поиск уязвимостей через активное зондирование
Весь процесс разведки выстраивается в три этапа:
- Обнаружение хостов - кто вообще живой в сети
- Сканирование портов - какие двери открыты
- Fingerprinting - что за ними стоит, какой версии, какой ОС
Обнаружение хостов в сети: ping sweep, ARP и другие методы
Прежде чем сканировать порты, нужно понять, какие хосты вообще отвечают. Гонять всю подсеть /24 по всем 65535 портам без предварительной разведки - часы впустую.ICMP ping sweep
Самый простой способ - отправить ICMP Echo Request каждому адресу в диапазоне:
Bash:
nmap -sn 192.168.1.0/24 -oG ping_sweep.gnmap
-sn говорит 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
-PR переключает nmap на ARP-запросы. Почему это надёжнее? ARP - протокол канального уровня, без него невозможна сетевая связность. Заблокировать ARP в локалке нельзя без потери коммуникации. Каждый живой хост обязан ответить - деваться ему некуда.Кастомные пробы для обхода фильтрации
Когда ICMP заблокирован, а ты не в локальном сегменте, помогают TCP-пробы на конкретные порты. Из официальной документации nmap: для обнаружения хостов можно комбинировать несколько типов проб:
Bash:
# TCP SYN на популярные порты + ICMP
nmap -sn -PS22,80,443,3389 -PE 10.0.0.0/24
-PS22,80,443,3389 шлёт TCP SYN на указанные порты. Если хост ответит SYN-ACK или RST - он живой. -PE добавляет 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
Флаг
-p- критически важен - он сканирует все 65535 портов. Без него nmap проверяет только top-1000. На моей практике забытые сервисы регулярно обнаруживаются на нестандартных портах: RDP на 33389, веб-интерфейсы на 8443, 9090, базы данных на 13306. Пропустишь порт - пропустишь вектор атаки.TCP Connect сканирование (-sT)
Connect-скан использует системный вызовconnect() для установки полного TCP-соединения:
Bash:
nmap -sT -p- 192.168.1.100 -oA connect_scan
| Параметр | SYN-скан (-sS) | Connect-скан (-sT) |
|---|---|---|
| Требует root | Да | Нет |
| Завершает хендшейк | Нет | Да |
| Скорость | Быстрее | Медленнее |
| Видимость в логах | Только IDS | IDS и логи приложений |
| Точность | Высокая | Высокая |
Когда использовать 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 не имеет хендшейка. Отправил пакет - и сидишь ждёшь
- Если порт закрыт - цель отвечает ICMP Port Unreachable
- Если порт открыт - обычно тишина (нет ответа вообще)
- Nmap помечает отсутствие ответа как
open|filtered- порт может быть как открытым, так и отфильтрованным файрволом
--top-ports 100 вместо полного перебора.Совет из практики: комбинируй 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
- Если приходит 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
-p1-65535- все TCP-порты. Masscan не знает никаких «top-1000»--rate=5000- 5000 пакетов в секунду. Для корпоративной LAN - приемлемо. Для продакшн-среды с чувствительным оборудованием снижай до 1000-oG- grepable-формат, удобный для парсинга и передачи в nmap
Передача результатов 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
Fingerprinting сервисов и определение ОС через nmap
Найти открытый порт - полдела. Нужно понять, что за ним стоит. Сканирование сервисов и версий - этап, который превращает список портов в список потенциальных векторов атаки.Version Detection (-sV)
Bash:
sudo nmap -sV --version-intensity 7 -p 22,80,443,3306,8080 192.168.1.100
-sV: nmap подключается к открытому порту и шлёт набор проб (probes) из базы [URL='https://nmap.org/book/vscan-fileformat.html']nmap-service-probes[/URL]. Ответы сравниваются с известными паттернами. Параметр --version-intensity управляет количеством проб:0- минимум проб, максимум скорости9(по умолчанию) - все пробы, максимум точности
--version-intensity 5-7 - баланс между скоростью и точностью. Полная интенсивность нужна только для хостов, где стандартные пробы дали tcpwrapped или неопределённый результат.Banner grabbing через netcat
Когда nmap показывает порт какtcpwrapped (сервис принял соединение, но не ответил на пробы), проверяю руками:
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-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-os-db.Флаг
--osscan-guess заставляет 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
В стандартной поставке nmap (на момент написания) нет официального NSE-скрипта для BlueKeep (
Ссылка скрыта от гостей
). Доступны 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 поддерживает шесть профилей тайминга:| Профиль | Название | Задержка между пробами | Когда применять |
|---|---|---|---|
| -T0 | Paranoid | 5 минут | Обход IDS при внешнем пентесте |
| -T1 | Sneaky | 15 секунд | Скрытное сканирование |
| -T2 | Polite | 0.4 секунды | Чувствительные сети |
| -T3 | Normal | По умолчанию | Стандартные задачи |
| -T4 | Aggressive | Минимальная | Быстрое сканирование в LAN |
| -T5 | Insane | Без задержек | Тестовые среды |
На внутреннем пентесте обычно хватает
-T3 или -T4. Для внешней разведки с требованием скрытности - -T1 или -T2. Лично я на внешних проектах почти всегда начинаю с -T2 - лучше подождать лишний час, чем получить звонок от SOC на второй минуте.Фрагментация пакетов
Bash:
sudo nmap -sS -f --mtu 16 -p 80,443 192.168.1.100
-f разбивает IP-пакеты на фрагменты. --mtu 16 задаёт размер фрагмента (должен быть кратен 8). Некоторые stateless файрволы не умеют собирать фрагментированные пакеты и пропускают их без анализа. Современные stateful файрволы это видят, но в устаревших инфраструктурах (а таких до сих пор полно) - работает.Decoy-сканирование
Bash:
sudo nmap -sS -D RND:10 -p- 192.168.1.100
-D RND:10 подмешивает к твоему сканированию 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
--randomize-hosts перемешивает порядок обхода. Порты nmap рандомизирует по умолчанию (можно контролировать через --top-ports или -r для последовательного перебора).Полный цикл сетевой разведки: пошаговый сценарий
Вот как я выстраиваю пентест сканирование портов на реальном проекте. Делай раз, делай два, делай три.Шаг 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
-p 1-1000) или увеличьте 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)"
Шаг 4: host discovery для пропущенных (ARP + TCP)
Bash:
sudo nmap -sn -PR -PS22,80,443,3389 10.10.0.0/16 \
-oG /tmp/${ENGAGEMENT}/scans/nmap_discovery.gnmap
# Мержим с результатами masscan
grep "Up" /tmp/${ENGAGEMENT}/scans/nmap_discovery.gnmap \
| awk '{print $2}' >> /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
-sS (SYN-скан) + -sV (определение версий) + -sC (скрипты по умолчанию) + -O (OS fingerprinting) + -p- (все порты) + -T4 (агрессивный тайминг для 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
Сводная таблица инструментов сетевой разведки
| Инструмент | Задача | Скорость | Точность | Требует root |
|---|---|---|---|---|
| masscan | Быстрый охват больших сетей | Очень высокая | Средняя | Да |
| nmap -sS | SYN-сканирование портов | Высокая | Высокая | Да |
| nmap -sT | Connect-сканирование | Средняя | Высокая | Нет |
| nmap -sV | Fingerprinting сервисов nmap | Низкая | Очень высокая | Нет |
| nmap -O | OS fingerprinting | Низкая | Высокая | Да |
| nmap --script | NSE-скрипты (vuln, enum) | Зависит от скрипта | Высокая | Зависит от скрипта |
| netcat | Banner grabbing, ручная проверка | Ручная | Точная | Нет |
| tcpdump | Анализ трафика при сканировании | Пассивный | Точная | Да |
Логика связки: masscan (быстро находим, где что-то торчит) → nmap -sS (верифицируем открытые порты) → nmap -sV -sC (определяем сервисы и версии) → nmap --script vuln (ищем уязвимости) → netcat (ручная доверификация сомнительных портов).
Типичные ошибки начинающих
Сканирование только top-1000 портов. Без-p- nmap проверяет 1000 наиболее популярных портов. Сервис на порту 8888, 31337 или 50000 будет пропущен. Я находил RDP на 33389, Jenkins на 8888, незащищённые REST API на 50080 - всё за пределами top-1000. Для тех кто в танке - это значит, что без -p- вы тупо не видите треть поверхности атаки.Доверие результатам masscan без верификации. Masscan использует асинхронную отправку - он не ждёт ответа на каждый пакет. Ложноположительные результаты - норма. Всегда проверяй через nmap.
Запуск с -T5 на продакшн-сети. Агрессивный тайминг генерирует поток пакетов, который может положить сетевое оборудование. Для продакшн-сред максимум
-T3, для чувствительных - -T2. Один раз наступишь на эти грабли - запомнишь навсегда.Игнорирование UDP. DNS, SNMP, TFTP, NTP - все по UDP. SNMP с community string
public - частая находка на внутренних пентестах, дающая доступ к конфигурации сетевого оборудования.Сканирование без записи результатов. Флаг
-oA сохраняет вывод в трёх форматах (nmap, xml, gnmap). Без него повторный скан - потерянные часы.Сетевая разведка - навык, который нарабатывается практикой. Подними виртуальную лабораторию, поставь несколько машин с разными сервисами и пройди весь цикл: от masscan до ручного banner grabbing. Когда увидишь, как SYN-ACK приходит на tcpdump в реальном времени - поймёшь, как это работает, лучше любого учебника. Попробуйте просканировать свой лабораторный сегмент по шагам из раздела выше и сравнить, что нашёл masscan, а что - nmap. Расхождения будут, и они многое объяснят.