Главная / Блог / Nmap для CTF: сканирование портов, определение сервисов и ОС, обход фильтров — практический гайд

13 мин.00

Nmap для CTF: сканирование портов, определение сервисов и ОС, обход фильтров — практический гайд

Nmap для CTF: сканирование портов, определение сервисов и ОС, обход фильтров — практический гайд

Nmap для CTF: сканирование портов, определение сервисов и ОС, обход фильтров — практический гайд

На прошлом марафоне HackTheBox я потерял 40 минут на машине категории Easy — и не потому что эксплойт оказался сложным. Дефолтный nmap не показал порт 8443, где висел уязвимый Jenkins с RCE. Один флаг -p- решил бы всё за пять минут. С тех пор у меня жёсткое правило: сначала полное nmap сканирование портов, потом всё остальное. Без исключений.

В этом гайде разберём nmap для CTF по шагам — от обнаружения хостов до обхода фильтров, с разбором вывода и практическим workflow, который можно применять на любой лабораторной машине.

Место Nmap в цепочке атаки

Nmap — первое, что запускаешь на любом CTF и пентесте. В терминах MITRE ATT&CK он покрывает сразу несколько техник:

  • Active Scanning (T1595, Reconnaissance) — сканирование IP-блоков (T1595.001) и поиск уязвимостей (T1595.002)
  • Network Service Discovery (T1046, Discovery) — обнаружение сервисов на открытых портах
  • System Information Discovery (T1082, Discovery) — определение ОС через fingerprinting
  • Remote System Discovery (T1018, Discovery) — обнаружение живых хостов в сети

В полной цепочке nmap стоит на позиции reconnaissance → initial access: результаты сканирования определяют вектор входа. Нашли открытый порт 445 с SMBv1 — идём в эксплуатацию. Увидели порт 80 с Apache 2.4.49 — проверяем path traversal. Обнаружили нестандартный порт 9090 с Cockpit — ищем дефолтные учётки. Без качественной разведки сети nmap всё остальное — стрельба вслепую.

[Применимо: внешний пентест, внутренний пентест, CTF-лаборатории всех уровней]

Статус инструмента: Nmap — проект с открытым исходным кодом, активно поддерживается с 1997 года. На GitHub больше 10 000 звёзд, база fingerprints и NSE-скриптов регулярно обновляется.

Требования к окружению

Перед запуском команд проверьте готовность:

  • ОС: Kali Linux 2023.x+, Parrot OS, Ubuntu 22.04+ или любой Linux с пакетным менеджером. На Windows — установка через официальный инсталлятор с nmap.org (включает Npcap)
  • RAM: 2 ГБ минимум (сам Nmap легковесный, узкое место — пропускная способность сети)
  • Права: root/sudo для SYN-сканирования, определения ОС и большинства продвинутых техник. Без root доступен только TCP Connect (-sT)
  • Сеть: прямое подключение к целевой сети или VPN-туннель до лаборатории (HTB, THM, PG). В изолированных сетях работает без интернета
  • Установка: sudo apt install nmap (Debian/Ubuntu/Kali) или sudo dnf install nmap (Fedora/CentOS)

Разведка сети Nmap: обнаружение хостов

Прежде чем сканировать порты, нужно убедиться, что хост жив. В CTF с одной целевой машиной — формальность, но в сетевых лабораториях (подсеть 10.10.10.0/24) обнаружение хостов экономит десятки минут.

Команда nmap -sn 192.168.1.0/24 запускает ping sweep: отправляет комбинацию ICMP Echo Request, TCP SYN на порт 443 и TCP ACK на порт 80. Хост ответил хотя бы на один зонд — жив. Флаг -sn отключает сканирование портов, оставляя только фазу обнаружения.

Типичная ошибка новичков: хост не отвечает на ICMP (пинг запрещён фаерволом), и его считают офлайн. Решение — флаг -Pn, который пропускает обнаружение и считает все указанные хосты живыми. В CTF-лабораториях это часто единственный рабочий вариант: таск-мейкеры любят блокировать ICMP на целевых машинах.

Для тонкой настройки зондов: -PS22,80,443 отправляет TCP SYN на конкретные порты, -PA80 — TCP ACK на порт 80, -PU53 — UDP на DNS-порт, -PE — стандартный ICMP Echo Request. Комбинируя зонды, можно обойти простые правила фильтрации. Например, nmap -sn -PS80,443 -PA22 10.10.10.0/24 сработает даже если ICMP заблокирован, но TCP-порты 22, 80 или 443 принимают входящие подключения.

[Применимо: внутренний пентест, CTF с подсетью. Для одиночной машины HTB/THM обычно хватит -Pn]

Nmap сканирование портов: выбор техники для CTF

Ядро работы с инструментом. Nmap поддерживает около дюжины типов сканирования, но в CTF и на лабораторных машинах 90% задач решаются тремя.

SYN-сканирование — дефолт и основной режим

Запускается командой nmap -sS <цель> (или просто nmap <цель> от root — SYN используется по умолчанию). Nmap отправляет пакет с флагом SYN, как будто начинает TCP-соединение. В ответ SYN-ACK — порт открыт. RST — закрыт. Тишина или ICMP-ошибка — фильтруется.

Фишка в том, что соединение никогда не завершается полностью. Nmap сразу шлёт RST после получения SYN-ACK, поэтому в логах целевого сервиса обычно не остаётся записи об установленном подключении. На практике современные IDS (Suricata, Snort) палят SYN-скан по паттерну пакетов, но в CTF-контексте это некритично.

Ограничение: нужен root, потому что работает с raw-пакетами через сетевой стек ядра.

[Применимо: CTF, внешний и внутренний пентест. Против stateful firewall с SPI может быть заблокирован, но в лабораторных условиях работает стабильно]

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

Команда nmap -sT <цель>. Использует стандартный системный вызов connect() — полное трёхстороннее рукопожатие TCP. Работает без привилегий, но медленнее SYN-скана и оставляет записи в логах (сервис видит реальное подключение).

Когда пригодится: работа из контейнера без root, сканирование через прокси-цепочку (proxychains), или ситуация когда на атакующей машине нет доступа к raw-сокетам. В CTF такое бывает на этапе пивотинга — когда сканируете внутреннюю сеть через скомпрометированный хост.

UDP — забытые порты, которые решают таск

Команда nmap -sU <цель>. UDP-сканирование медленное и ненадёжное по природе протокола: UDP не подтверждает получение пакета. Нет ответа — порт может быть открытым или отфильтрованным (Nmap покажет open|filtered). Пришёл ICMP Port Unreachable (тип 3, код 3) — порт закрыт.

Почему это критично для CTF: сервисы DNS (53), SNMP (161), TFTP (69) и NTP (123) работают по UDP. Если на машине крутится SNMP с community-строкой public — это прямой путь к утечке конфигурации и перечислению всей системы. Пропустить UDP — потенциально пропустить половину атакуемой поверхности.

Практический совет: не сканируйте все 65535 UDP-портов — это займёт часы из-за rate-limiting ICMP-ответов на стороне ОС (Linux и Solaris тут особенно строги). Начните с nmap -sU --top-ports 50 -Pn <цель>. UDP-скан можно комбинировать с TCP: nmap -sS -sU --top-ports 100 <цель> проверит оба протокола за один проход.

[Ограничение: UDP-скан не работает через proxychains/SOCKS-прокси — UDP не проксируется через SOCKS4/5 в стандартной конфигурации]

Таблица выбора техники сканирования

Ситуация Техника Флаг Nmap Комментарий
CTF-машина, есть root SYN scan -sS Быстро, полуоткрытый, дефолт
Нет root-привилегий TCP Connect -sT Полное соединение, медленнее
Подозрение на UDP-сервис UDP scan -sU Комбинировать с -sS
Pivot через чужой хост TCP Connect через прокси -sT + proxychains Единственный рабочий вариант
Нужно понять правила FW ACK scan -sA Не показывает открытые порты, только фильтрацию
Обход stateless-фильтра FIN/NULL/Xmas -sF / -sN / -sX Против не-RFC-compliant хостов ненадёжно

Диапазоны портов: что и как сканировать

По умолчанию Nmap сканирует примерно 1000 популярных TCP-портов из базы nmap-services. Для CTF этого часто мало — таск-мейкеры вешают сервисы на нестандартные порты: 3000, 5000, 8080, 8443, 9090 и выше.

Флаг -p- — сокращение для -p 1-65535, сканирует все порты. Можно указать конкретные через запятую (-p 22,80,443,8080), диапазон (-p 1-1024) или смешать протоколы: -p T:80,443,U:53,161 для одновременного TCP и UDP-скана (не забудьте -sU для UDP-части).

Флаг --top-ports 20 сканирует N самых популярных портов — годится для быстрой начальной проверки. Флаг -F (fast scan) сканирует только порты из nmap-services — быстрее дефолта, но разница для TCP несущественна.

Определение сервисов Nmap: версии и баннеры

Знать что порт 80 открыт — полдела. Нужно понять, что именно за ним стоит: Apache или Nginx, какая версия, какие модули. Для этого есть флаг -sV.

Команда nmap -sV -Pn -p 22,80,445 <цель> подключается к каждому открытому порту, отправляет серию зондов из базы nmap-service-probes и сравнивает ответы с сигнатурами. По умолчанию интенсивность на максимуме (--version-intensity 9). Для ускорения в CTF можно снизить до 5: nmap -sV --version-intensity 5 <цель> — потеря точности минимальна, а скорость вырастает ощутимо.

Пример вывода и что с ним делать:

PORT    STATE SERVICE     VERSION
22/tcp  open  ssh         OpenSSH 8.9p1 Ubuntu 3ubuntu0.1
80/tcp  open  http        Apache httpd 2.4.52 ((Ubuntu))
445/tcp open  netbios-ssn Samba smbd 4.15.13-Ubuntu

Разбор построчно. OpenSSH 8.9p1 — версия относительно свежая, но стоит проверить CVE-базу. Apache 2.4.52 — вектор для исследования: проверить конфигурацию через curl -I, поискать скрытые директории. Samba 4.15.13 — SMB-вектор: проверить анонимный доступ, перечислить шары через smbclient -L, попробовать гостевой вход. Каждая строка вывода — подсказка для следующего шага в цепочке.

[Ограничение: -sV генерирует заметный сетевой шум — десятки подключений к каждому порту. На реальном пентесте с требованием скрытности использовать точечно, а не по всем портам]

Nmap определение ОС

Флаг -O активирует fingerprinting операционной системы. Nmap шлёт серию специально сформированных TCP, UDP и ICMP-пакетов и анализирует тонкие различия в ответах: значения TTL, размер TCP-окна, TCP-опции, поведение при фрагментации. Паттерны сравниваются с базой nmap-os-db.

Команда: nmap -O --osscan-guess -Pn <цель>. Флаг --osscan-guess заставляет Nmap предложить наиболее вероятную ОС даже при низкой уверенности — на CTF-машинах с минимумом открытых портов это выручает.

Метод работает лучше, когда доступны и открытые, и закрытые порты — больше контекста для сравнения. На машине с единственным открытым портом точность падает.

Ограничение: целевая система может намеренно искажать параметры TCP/IP-стека (TTL, window size), чтобы запутать fingerprinting. В корпоративных сетях такое встречается; в CTF — почти никогда.

Для комплексной разведки на CTF хватит одной команды: nmap -sC -sV -O -Pn <цель>. Флаг -sC запускает набор default NSE-скриптов — о них дальше.

Nmap скрипты NSE для CTF

Nmap Scripting Engine превращает сканер в полноценный инструмент перечисления. NSE-скрипты написаны на Lua и покрывают задачи от перечисления SMB-шар до проверки конкретных CVE.

Категории скриптов, которые нужны на CTF:

  • default — безопасные скрипты, запускаются через -sC. Показывают SSH-ключи, HTTP-заголовки, SMB-информацию
  • vuln — проверка известных уязвимостей. Скрипт smb-vuln-ms17-010 обнаружит EternalBlue, smb-vuln-ms08-067 — классическую RCE в Windows XP/2003
  • discovery — дополнительное перечисление: DNS zone transfer, NTP-информация, SNMP community strings
  • brute — перебор учётных данных (SSH, FTP, HTTP Basic)

Для примера: CVE-2009-3103 — уязвимость в SMBv2 (srv2.sys) на Windows Vista/Server 2008 (CWE-399). EPSS у неё 0.9012 (топ-1% по вероятности эксплуатации), и на Exploit-DB лежат готовые PoC (EDB-9594, EDB-40280). NSE-скрипты категории vuln находят такие вещи автоматически — экономит время, которое иначе ушло бы на ручную проверку.

Практические команды: nmap --script vuln -Pn -p 445 <цель> — проверка SMB на известные уязвимости. nmap --script http-enum -p 80 <цель> — перечисление директорий на веб-сервере (gobuster не заменит, но начальную картину даёт). nmap --script smb-enum-shares,smb-enum-users -p 445 <цель> — перечисление шар и пользователей. Можно запустить целую категорию: nmap --script discovery -p 80 <цель>.

[Ограничение: категория exploit и скрипты с --script-args=unsafe=1 могут уронить целевой сервис. В CTF допустимо, на реальном пентесте — только после согласования]

Обход базовых фильтров Nmap

На CTF и в лабораториях встречаются машины с простым фаерволом, блокирующим стандартное сканирование. Nmap предлагает несколько техник для обхода stateless-фильтров. Против stateful firewall с SPI и современных NGFW всё это бесполезно — и это надо держать в голове.

Фрагментация пакетов. Флаг -f разбивает TCP-заголовок на несколько мелких IP-фрагментов. Простой пакетный фильтр не соберёт фрагменты и не сможет проанализировать TCP-флаги. Команда: nmap -sS -f -Pn <цель>. Двойной флаг -ff уменьшает фрагменты до 16 байт.

[Работает: stateless packet filter, ACL на маршрутизаторе. Не работает: stateful FW, IPS с дефрагментацией — Cisco Firepower, Palo Alto, Check Point]

Decoy-сканирование. Флаг -D RND:5 подмешивает к сканированию пакеты с пятью случайными поддельными IP-адресами, затрудняя определение реального источника. Вариант -D 10.10.10.1,10.10.10.2,ME позволяет явно указать decoy-IP и позицию реального адреса.

[Работает: обход IDS на уровне логирования. Не работает: если на сети включена проверка обратного пути (uRPF) или фильтрация по MAC на L2]

Source port. Некоторые legacy-фаерволы пропускают трафик с определённых портов — 53 (DNS), 88 (Kerberos). Флаг --source-port 53 (или -g 53) заставляет Nmap слать пакеты с указанного source-порта. Против фаервола с DPI — бесполезно.

Контроль скорости. Timing templates от -T0 (параноидально медленный) до -T5 (максимально быстрый). В CTF стандарт — -T4. Для тонкой настройки: --scan-delay 200ms устанавливает задержку между зондами (по данным highon.coffee — один из рабочих способов обхода порогов срабатывания на SOHO-устройствах). Флаг --max-rate 100 ограничивает скорость до 100 пакетов в секунду.

Когда обход фильтров nmap НЕ работает:

Техника Неэффективна против
Фрагментация (-f) Stateful FW, IPS с дефрагментацией
Decoy (-D) uRPF, MAC-фильтрация на L2
Source port (-g) DPI, application-aware firewall
Idle scan (-sI) Хосты с рандомизацией IP ID (Linux 4.x+)
Slow timing (-T0/-T1) ML-based IDS с поведенческим анализом

Практический workflow: nmap сканирование портов CTF-машины от старта до флага

Три фазы, каждая запускается параллельно с анализом результатов предыдущей. Этот workflow отработан на нескольких десятках машин HTB и TryHackMe.

Фаза 1 — быстрая разведка (30 секунд). Запускаю nmap -sS -Pn --top-ports 1000 -T4 <цель> и сразу смотрю первые результаты. Пока сканер работает, открываю браузер и пробую порты 80/443 — если там веб, уже начинаю ручной осмотр параллельно.

Фаза 2 — полное сканирование (2-5 минут). В отдельном терминале запускаю nmap -sS -Pn -p- -T4 <цель>. Находит всё, что не вошло в топ-1000: веб-приложения на 3000, 5000, 8443, кастомные сервисы на высоких портах. Именно тут обычно прячутся точки входа на «хитрых» машинах.

Фаза 3 — глубокое сканирование. По результатам первых двух фаз формирую список портов и запускаю прицельный анализ:

nmap -sC -sV -O -Pn -p 22,80,445,8080 <цель> -oA results

Тут -sC запускает default-скрипты, -sV определяет версии, -O — ОС, а -oA results сохраняет результаты сразу в трёх форматах: .nmap (текст), .xml (для импорта), .gnmap (grepable). Всегда сохраняйте вывод — пригодится для отчёта и чтобы не пересканировать.

Если среди портов есть 445 (SMB) — отдельный проход: nmap --script vuln -Pn -p 445 <цель>. Подозреваете UDP-сервисы — nmap -sU --top-ports 50 -Pn <цель>.

Отключение DNS-резолвинга флагом -n ускоряет сканирование, когда обратная DNS-запись не нужна — а в CTF она не нужна почти никогда.

Ограничения Nmap: когда нужны альтернативы

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

Скорость на больших диапазонах. Для подсети /16 (65536 адресов) Nmap будет работать часами. Masscan справится за минуты — у него собственный TCP-стек, заточенный под массовое сканирование. Стандартный подход: Masscan для быстрого обнаружения открытых портов, затем Nmap для детального анализа. В CTF с одной машиной это неактуально, но на OSCP-экзамене с несколькими целями — экономит время.

Веб-перечисление. Скрипт --script http-enum даёт базовый список директорий, но для полноценного перебора нужен gobuster, feroxbuster или ffuf с качественным словарём (SecLists).

Детектируемость. Nmap генерирует характерный паттерн трафика, который распознают Snort и Suricata. В классификации AbuseIPDB это категория #14 — Port Scan. На реальном пентесте с требованием скрытности начинайте с пассивной разведки (Shodan, Censys, Netlas), а Nmap применяйте точечно.

Сканирование через прокси. Через SOCKS-прокси (proxychains) работает только TCP Connect (-sT). SYN-скан, UDP-скан и определение ОС требуют raw-пакетов и через прокси невозможны. Альтернатива — поднять chisel-туннель и запустить Nmap непосредственно на pivot-хосте.

Задача Nmap Альтернатива Когда менять
Скан /16+ подсетей Часы Masscan, ZMap Более 1000 хостов
Перебор директорий Базовый gobuster, feroxbuster Нужен словарь и глубина
SNMP-перечисление --script snmp-brute onesixtyone + snmpwalk Нужна полная MIB-выгрузка
Пассивная разведка Не умеет Shodan, Censys, Netlas Нужна скрытность
Скан через SOCKS Только -sT chisel + nmap на pivot Pivot-сценарий

За два года решения CTF-машин я заметил закономерность: большинство новичков теряют время не из-за незнания экзотических техник сканирования. Они проигрывают из-за неполного сканирования — пропущенного -p-, забытого UDP-прохода, непросмотренного вывода NSE-скриптов. Nmap для CTF — не коллекция хитрых флагов, а дисциплина: полный скан, сохранение результатов, внимательное чтение каждой строки вывода. Я разбирал десятки writeup'ов, где автор тратил часы на поиск «сложного» вектора, а ответ лежал в строке Nmap-вывода, которую просто не дочитали до конца.

Ещё наблюдение: после нескольких десятков пройденных машин начинаешь читать вывод как текст — Apache 2.4.49 сразу ассоциируется с path traversal, OpenSSH 7.7 — с перечислением пользователей, SMB без signing — с relay-атакой. Этот навык нарабатывается только руками, не чтением cheatsheet'ов. Если только начинаешь и хочешь пройти путь от базовых концепций до первых решённых задач системно — IB Basics на codeby.school берёт с любого старта, без академического тона.

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

Поделиться

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

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

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