Главная / Блог / Nmap для начинающих: гайд по CTF-разведке

13 мин.00

Nmap для начинающих: гайд по CTF-разведке

Nmap для начинающих: гайд по CTF-разведке

На одной из первых машин TryHackMe я убил сорок минут, сканируя топ-1000 портов и ковыряя веб-приложение на 80-м — ничего эксплуатабельного. Путь к root-флагу лежал через SSH на порту 2222, который nmap просто не увидел без флага -p-. Одна непоставленная опция — вечер в трубу. Сканирование портов nmap выглядит элементарным действием ровно до того момента, когда результат скана определяет весь дальнейший ход атаки. Разберём инструмент так, чтобы первые CTF-машины давались без таких потерь.

Как Nmap вписывается в сетевую разведку CTF

Nmap (Network Mapper) — сканер с открытым кодом. Шлёт специально сформированные пакеты на целевые хосты и разбирает ответы. В терминологии MITRE ATT&CK сканирование портов соответствует технике Network Service Discovery (T1046, тактика Discovery) — определение сервисов на удалённой машине. Определение версий и ОС укладывается в Active Scanning (T1595, Reconnaissance), включая подтехники Scanning IP Blocks (T1595.001) и Vulnerability Scanning (T1595.002). Сбор информации о ПО — Software (T1592.002, Reconnaissance). Подробнее — в нашем руководстве по создание ctf заданий.

Для CTF-площадок — TryHackMe, HackTheBox, CTF-соревнований — nmap стоит первым в цепочке:

  1. Сканирование портов — находим, что торчит наружу
  2. Определение версий сервисов nmap — узнаём, какой софт и какой версии крутится
  3. NSE-скрипты — собираем дополнительную информацию автоматически
  4. Поиск эксплойтов — searchsploit, exploit-db по найденным версиям
  5. Эксплуатация — получаем начальный доступ (initial foothold)

Каждый сетевой сервис слушает определённый порт: веб-сервер на 80/443, SSH на 22, MySQL на 3306, SMB на 445. Открытый порт — поверхность атаки. Без этой карты атаковать нечего, любые попытки эксплуатации превращаются в гадание.

Обнаружение хостов: ping sweep и флаг -Pn

На CTF-площадках обычно дан конкретный IP машины, поэтому полноценный host discovery (обнаружение живых хостов в подсети) нужен редко. Но на экзамене OSCP выдают целую подсеть, и без ping sweep вы потратите часы, сканируя несуществующие машины.

Команда nmap -sn 10.10.10.0/24 отключает сканирование портов и проверяет только доступность хостов. При запуске от root в локальной сети используется ARP-сканирование — быстрее и надёжнее ICMP. С root-привилегиями для удалённых целей по умолчанию улетают четыре типа проб: ICMP Echo Request, TCP SYN на порт 443, TCP ACK на порт 80, ICMP Timestamp Request. Без root — только TCP connect() на порты 80 и 443. Для тех кто в танке — без root nmap сильно урезан.

В MITRE ATT&CK обнаружение хостов описывается как Remote System Discovery (T1018, Discovery) и Scanning IP Blocks (T1595.001, Reconnaissance).

Главная проблема: многие CTF-машины блокируют ICMP. Nmap сообщает «Host seems down» — а хост живёхонек. Добавляйте -Pn. Он заставляет пропустить проверку доступности и сразу переходить к портам. На TryHackMe и HackTheBox -Pn экономит время на каждой машине. Если хост действительно мёртв — просто подождёте таймауты, зато не пропустите живую цель за файрволом.

Для подсетей с заблокированным ICMP работает комбинация nmap -sn -PS22,80,443,8080 -PE 10.0.0.0/24 — TCP SYN на типовые порты плюс ICMP Echo. Повышает шансы найти хосты за строгими ACL.

Сканирование портов nmap: SYN, Connect, UDP

TCP SYN — метод по умолчанию

SYN-скан (-sS) — основной рабочий инструмент. Он отправляет пакет с флагом SYN и анализирует ответ без завершения TCP-рукопожатия:

  • SYN-ACK в ответ — порт открыт, Nmap тут же шлёт RST и рвёт соединение
  • RST в ответ — порт закрыт
  • Тишина после нескольких попыток или ICMP unreachable (type 3, codes 1, 2, 3, 9, 10, 13) — порт фильтруется

За незавершённое рукопожатие SYN-скан и прозвали «half-open scanning». Многие сервисы не логируют неустановленные соединения, поэтому метод относительно тихий. Для CTF скрытность не критична, а вот скорость — ещё как. SYN-скан прожёвывает тысячи портов в секунду на хорошем канале.

Запуск: sudo nmap -sS 10.10.10.100. Требует root — работает с сырыми пакетами.

TCP Connect — когда нет root

Без root Nmap автоматически переключается на -sT — полное трёхстороннее рукопожатие через системный вызов connect(). Медленнее SYN-скана, шумнее (каждое соединение логируется сервисом), проще ловится IDS. На CTF вы работаете на своей машине с root, так что -sT используется редко.

UDP — то, что все забывают

UDP-сервисы пропускают чаще всего. И зря. DNS (53), SNMP (161), TFTP (69), DHCP (67/68) — всё это работает по UDP, и через них регулярно получают начальный доступ на CTF-машинах. SNMP с community string public отдаёт полную конфигурацию устройства. TFTP позволяет стянуть файлы без аутентификации.

Команда sudo nmap -sU --top-ports 20 10.10.10.100 сканирует двадцать самых популярных UDP-портов. Полный UDP-скан всех 65535 портов — это часы ожидания: открытые и filtered-порты молчат, Nmap вынужден ждать таймауты и повторять попытки. Вдобавок Linux по умолчанию ограничивает ICMP port unreachable примерно до 1 сообщения в секунду (sysctl net.ipv4.icmp_ratelimit), что дополнительно тормозит процесс. Ограничивайте скоуп через --top-ports или -p.

Для полной картины UDP комбинируется с TCP: sudo nmap -sS -sU --top-ports 100 10.10.10.100.

Шесть состояний портов

Nmap различает шесть состояний, но на CTF вы столкнётесь с тремя основными:

Состояние Что значит Что делать
open Сервис принимает соединения Ваша цель — определить версию и искать уязвимости
closed Порт доступен, но сервис не слушает Не приоритет, но может появиться позже
filtered Файрвол блокирует пробу Попробовать обойти позже — через SSRF, pivoting или другой тип скана

Три оставшихся (unfiltered, open|filtered, closed|filtered) — результат специфических типов сканирования (ACK-скан, NULL/FIN/Xmas, UDP) и встречаются реже. open|filtered типичен для UDP — Nmap не получил ответа и не может определить, открыт порт или фильтруется. Флаг -sV помогает разрешить неоднозначность.

Двухфазное сканирование: быстрый проход + глубокий анализ

Запускать один «монстр-скан» на все 65535 портов с определением версий, скриптами и детекцией ОС — классическая ошибка новичка. Такая команда молотит 15-25 минут, и всё это время вы сидите и ждёте вместо того, чтобы анализировать находки.

Двухфазный подход решает проблему:

# Фаза 1: быстрый полный скан (30-60 секунд)
sudo nmap -sS -p- --min-rate 5000 -Pn 10.10.10.100 -oN ports.txt

# Фаза 2: глубокий анализ найденных портов (1-3 минуты)
sudo nmap -sC -sV -p 22,80,8080,3306 10.10.10.100 -oA detailed

На первой фазе -p- сканирует все порты, --min-rate 5000 разгоняет отправку пакетов до 5000 в секунду, -Pn пропускает host discovery. Результат через минуту — голый список открытых портов без подробностей.

На второй фазе -sC запускает дефолтные NSE-скрипты, -sV определяет версии, а -oA detailed сохраняет результат во всех форматах. Но сканируются только те порты, которые нашла первая фаза — вместо 65535 их обычно 3-8. Разница ощутимая.

Экономия: 10-15 минут на каждой машине. На марафоне из пяти машин — час чистого времени. На OSCP-экзамене с пятью целями и ограничением в 24 часа это разница между сдачей и провалом.

Вариант для ленивых: sudo nmap -A -T4 10.10.10.100. Флаг -A включает определение версий, дефолтные скрипты, детекцию ОС и traceroute. -T4 — агрессивный тайминг. Удобно для быстрого старта, но без -p- сканируются только топ-1000 портов. Я бы не рекомендовал — слишком легко пропустить нестандартный порт.

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

Знать, что порт 80 открыт, — мало. Нужно знать, что за ним стоит Apache 2.4.49 на Ubuntu, потому что именно версия определяет вектор атаки.

Флаг -sV активирует определение версий: Nmap шлёт дополнительные пробы из базы nmap-service-probes и сопоставляет ответы с известными сигнатурами. Пример реального вывода:

PORT     STATE SERVICE VERSION
22/tcp   open  ssh     OpenSSH 7.2p2 Ubuntu 4ubuntu2.8
80/tcp   open  http    Apache httpd 2.4.18 ((Ubuntu))
3306/tcp open  mysql   MySQL 5.7.28-0ubuntu0.18.04.4
8080/tcp open  http    Werkzeug httpd 1.0.1 (Python 3.8.10)

Каждая строка — потенциальный вектор. OpenSSH 7.2p2 — версия 2016 года, searchsploit openssh 7.2 покажет известные уязвимости. Apache 2.4.18 — тоже не первой свежести. Werkzeug на 8080 — Python-фреймворк для веб-приложений, частый гость на CTF-машинах с дырявым пользовательским кодом. MySQL 5.7.28 — если удастся подобрать пароль или добраться через SSRF, это прямой доступ к данным.

Интенсивность определения регулируется через --version-intensity (0-9, по умолчанию 7). Значение 0 (--version-light) — только самые вероятные пробы, быстро, но может не опознать нестандартный сервис. Значение 9 (--version-all) — все пробы, медленно, зато максимально точно. На CTF стандартное значение покрывает 95% случаев, так что трогать не обязательно.

Определение ОС через -O анализирует особенности TCP/IP-стека: размер окна, TTL, TCP-опции. Nmap сопоставляет ответы с базой nmap-os-db. Для точного результата нужны хотя бы один открытый и один закрытый порт на цели. Если Nmap не уверен — --osscan-guess выдаст наиболее вероятные варианты.

На CTF определение ОС помогает выбрать инструменты привилегированного доступа: Linux — LinPEAS, GTFOBins; Windows — WinPEAS, PowerUp. Разница принципиальна, и лучше узнать об этом на этапе разведки, а не после получения шелла.

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

Nmap Scripting Engine (NSE) — движок на Lua, который превращает сканер из простого обнаружителя портов в платформу для network enumeration. В комплекте больше 600 скриптов, разложенных по категориям по назначению и степени интрузивности.

Категории скриптов NSE

Для CTF полезнее всего шесть категорий:

Категория Назначение Запуск
default Безопасные скрипты с полезной информацией -sC или --script=default
safe Не нагружают цель, не вызывают сбоев --script=safe
vuln Проверка на конкретные уязвимости --script=vuln
discovery Обнаружение дополнительной информации --script=discovery
brute Перебор учётных данных --script=brute
exploit Активная эксплуатация уязвимостей --script=exploit

Категории intrusive, dos и fuzzer на CTF используются редко — они могут уронить сервис на целевой машине, а это обычно не то, чего вы хотите.

Скрипты из категории default проходят строгий отбор по скорости, полезности и неинтрузивности. Поэтому -sC можно смело запускать на второй фазе двухфазного скана — ничего не сломаете.

Скрипты для CTF-практики

http-enum перечисляет директории и файлы на веб-сервере: nmap --script http-enum -p 80,443 <target>. Находит стандартные пути: /admin/, /phpmyadmin/, /robots.txt, /wp-login.php. Полноценный directory bruteforce через gobuster или feroxbuster он не заменит, но даёт быструю первую картину до запуска тяжёлого инструмента.

smb-vuln-* — серия скриптов для проверки SMB-уязвимостей. На HTB и TryHackMe машины с открытым 445 портом часто уязвимы к EternalBlue или другим SMB-атакам:

# Проверка SMB-уязвимостей
nmap --script "smb-vuln*" -p 445 10.10.10.100
# Категория vuln целиком — медленнее, но покрывает больше
nmap --script vuln -p 22,80,445 10.10.10.100
# SSL/TLS анализ — слабые шифры, просроченные сертификаты
nmap --script ssl-enum-ciphers -p 443 10.10.10.100

ftp-anon проверяет анонимный доступ к FTP. Входит в default-категорию и запускается автоматически при -sC. Если FTP на порту 21 разрешает анонимный вход — скрипт это покажет. На CTF в таких FTP часто валяются конфигурационные файлы или подсказки.

ssl-enum-ciphers анализирует SSL/TLS-конфигурацию. Показывает слабые шифры и устаревшие версии протокола. Полезно для обнаружения уязвимостей вроде POODLE или DROWN.

Передача аргументов скриптам работает через --script-args: например, nmap --script http-enum --script-args http-enum.basepath="/api/" -p 80 <target> ограничивает перечисление директорией /api/. Документация по каждому скрипту доступна через nmap --script-help <имя>.

Нюанс: --script vuln прогоняет все проверки уязвимостей по найденным портам. Шумно, занимает несколько минут, но на CTF — пожалуйста. Вам не нужно прятаться от SOC-аналитиков. В терминах MITRE ATT&CK это Vulnerability Scanning (T1595.002, Reconnaissance).

Сохранение и обработка результатов

Потерянный вывод nmap — боль, знакомая каждому. Сканировали машину, перешли к эксплуатации, через полчаса не можете вспомнить точную версию Apache. Пересканировать — минус время.

Четыре формата вывода:

Флаг Формат Когда использовать
-oN файл Обычный текст Чтение глазами
-oG файл Grepable Парсинг через grep/awk/cut
-oX файл XML Импорт в Metasploit через db_import
-oA имя Все три сразу Всегда — стандарт для CTF и OSCP

Правило простое: -oA с понятным именем на каждый скан без исключений. Создаёт три файла, и вы ничего не потеряете. На OSCP-экзамене это не просто удобство — сохранённые сканы обязательны для отчёта.

Grepable формат особенно удобен для обработки результатов по подсети. Найти все хосты с открытым SMB: grep "445/open" scan.gnmap | cut -d' ' -f2. Все веб-серверы: grep "80/open" scan.gnmap. Результат — список IP для дальнейшей работы с nikto, gobuster или sqlmap.

Импорт XML в Metasploit: db_import /path/to/scan.xml. После этого команды hosts и services покажут все найденные цели и сервисы в табличном виде — запускай модули эксплуатации прямо по результатам скана.

Ошибки новичков, которые стоят флагов

Забыть -p-

По умолчанию nmap сканирует топ-1000 портов. Покрывает большинство стандартных сервисов, но разработчик CTF-машины может повесить веб-приложение на 8443, SSH — на 2222, а базу данных — на 27017. Без -p- вы их не увидите. На каждой машине первая фаза должна включать -p-. Без вариантов.

Не сохранить вывод

Запустили скан, прочитали в терминале, закрыли вкладку, пришлось пересканировать. Знакомо? Решение: -oA всегда, без раздумий. Имя файла по шаблону: htb_machine_initial, htb_machine_detailed. Структура в папке машины — через неделю скажете себе спасибо.

Использовать -T5 на нестабильном VPN

Timing template T5 (Insane) отправляет пакеты с максимальной агрессией. На нестабильном VPN-подключении до HTB или TryHackMe это приводит к потерянным пакетам и ложным filtered-результатам. Вы будете думать, что порт за файрволом, а он просто не ответил из-за дропа. T4 (Aggressive) — разумный максимум для CTF. T3 (Normal) — если соединение нестабильно.

Игнорировать UDP

Машина показывает только 80-й порт, веб-приложение кажется тупиком. Проверьте UDP: sudo nmap -sU --top-ports 20 <target>. SNMP на 161-м порту с community string public — полный дамп конфигурации. TFTP на 69-м — возможность стянуть файлы без аутентификации. Эти векторы регулярно встречаются на HackTheBox, и каждый раз кто-то на них спотыкается.

Не читать баннеры внимательно

Nmap показал Apache httpd 2.4.49 — а вы уже полезли искать SQL-инъекции на сайте, не проверив саму версию. Apache 2.4.49 и 2.4.50 уязвимы к path traversal, который ведёт к RCE. Первое действие после получения версии — searchsploit <сервис> <версия>. Десять секунд работы, которые могут сэкономить часы.

Не комбинировать с другими инструментами

Nmap — сетевая разведка CTF, а не универсальное оружие. Нашли веб-сервер — переходите к gobuster/feroxbuster для фаззинга директорий. Нашли SMB — используйте smbclient или enum4linux для перечисления шар. Нашли уязвимую версию — ищите PoC. Nmap строит карту, дальше работают специализированные инструменты.

Шпаргалка: команды nmap для CTF

Задача Команда
Быстрый скан всех портов sudo nmap -sS -p- --min-rate 5000 -Pn <target>
Глубокий скан найденных портов nmap -sC -sV -p <порты> <target> -oA detailed
UDP топ-20 sudo nmap -sU --top-ports 20 <target>
Проверка уязвимостей nmap --script vuln -p <порты> <target>
SMB-разведка nmap --script "smb-vuln*" -p 445 <target>
HTTP-перечисление nmap --script http-enum -p 80,443 <target>
Определение ОС sudo nmap -O --osscan-guess <target>
Всё в одной команде sudo nmap -A -T4 -p- <target> -oA full

За полтора года на CTF-площадках я заметил одну вещь: большинство новичков тратят 80% времени на эксплуатацию и 5% на разведку. Пропорция должна быть обратной. Тщательное сканирование портов nmap с определением версий сервисов и NSE-скриптами сокращает этап эксплуатации до минут — потому что ты точно знаешь, что ломать. Я видел ребят, которые три часа ковыряли веб-приложение на 80-м порту, а рядом на 22222-м висел SSH с дефолтными кредами — просто потому что -p- не поставили. Инструмент элементарный, но навык чтения вывода и выбора следующего шага прокачивается только количеством пройденных машин. Двухфазный подход работает на любой площадке, но без практики на десятках разных конфигураций он останется теорией. Если только начинаешь и nmap — твой первый серьёзный инструмент, IB Basics на codeby.school закрывает фундамент за пару месяцев без академического тона — оттуда проще выстраивать прогрессию к OSCP и реальным пентестам.

🚀 Хочешь закрепить на практике? Реши задачи по теме на HackerLab — категория «pentest-machines».

Поделиться

0 комментариев

Пожалуйста, войдите, чтобы оставить комментарий.

Загрузка комментариев...

Читайте также

Уязвимости JWT токенов в CTF: подделка подписи

11 мин.

4

Уязвимости JWT токенов в CTF: подделка подписи

Пошаговый разбор атак на JWT: alg none, hashcat brute-force, RS256→HS256 confusion, JWK injection (CVE-2018-0114), kid path traversal и SQLi. Чек-лист для CTF.

30 СЕНТЯБРЬ, 2026

SQL-инъекции для начинающих: ручной поиск и sqlmap

12 мин.

7

SQL-инъекции для начинающих: ручной поиск и sqlmap

Пошаговый разбор SQL-инъекций: ручной поиск уязвимостей, UNION и blind-атаки, автоматизация через sqlmap с конкретными командами — на примерах из CTF.

29 СЕНТЯБРЬ, 2026

XXE-инъекции: эксплуатация XML в CTF

11 мин.

14

XXE-инъекции: эксплуатация XML в CTF

Пошаговый разбор XXE-эксплуатации для CTF: чтение файлов, blind OOB-exfiltration, обход фильтров через UTF-16 и XInclude с готовыми пейлоадами.

29 СЕНТЯБРЬ, 2026