
На первой HackTheBox-машине я потерял 40 минут. Просканировал топ-1000 портов — SSH и HTTP, ничего интересного. Решил, что бокс сломан. Потом добавил -p-, и на порту 8443 обнаружился веб-интерфейс с RCE в форме авторизации. Один пропущенный флаг — и вся разведка ушла в мусорку. С тех пор полный скан всех 65535 портов — обязательный шаг, без исключений. Эта статья — конспект того, что стоило узнать до первого CTF: от логики сканирования портов Nmap до конкретного workflow, который экономит время и находит то, что новички стабильно пропускают.
Каждый CTF-бокс — машина с набором сервисов. Один или несколько содержат уязвимость, которая ведёт к флагу. Задача — найти эти сервисы, определить версии и понять, куда копать. Именно это делает Nmap — Network Mapper, свободный инструмент для сетевой разведки, ставший стандартом. Подробнее — в нашем статье о создание ctf заданий.
В терминологии MITRE ATT&CK действия при запуске Nmap укладываются в несколько техник:
Эта классификация — не академическая формальность. Она помогает осознать, что сканирование — структурированный процесс сбора информации, а не «запустил команду и ждёшь». В CTF качество разведки определяет, найдёте вы вектор атаки за 5 минут или будете блуждать час.
Nmap закрывает три задачи в CTF:
Документация Nmap прямо говорит: инструмент использует сырые IP-пакеты для определения доступных хостов, их сервисов с версиями, операционных систем и действующих правил фильтрации. На практике одна команда даёт полную картину атакуемой поверхности.
На Kali Linux Nmap предустановлен. Для других дистрибутивов — одна команда: sudo apt install nmap для Debian/Ubuntu, sudo dnf install nmap для Fedora, brew install nmap для macOS. Проверить установку: nmap --version. На Windows есть установщик с nmap.org.
Момент, который упускают на старте: большинство типов сканирования требуют root-привилегий, потому что Nmap работает с raw sockets. Без sudo инструмент тихо переключается на TCP Connect-скан (-sT) вместо быстрого SYN-скана (-sS). Результат похожий, но медленнее и шумнее. Привычка запускать sudo nmap — базовая гигиена.
Первая команда для любого CTF-бокса: sudo nmap -sV -sC <target-ip>. Флаг -sV включает определение версий сервисов, -sC запускает набор дефолтных NSE-скриптов. Вместе они дают максимум информации при минимуме усилий.
Типичный вывод на CTF-машине:
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.5
80/tcp open http Apache httpd 2.4.41 ((Ubuntu))
|_http-title: Welcome to My App
|_http-server-header: Apache/2.4.41 (Ubuntu)
3306/tcp filtered mysql
8080/tcp closed http-proxy
Разберём каждую строку с позиции CTF-игрока. OpenSSH 8.2p1 — конкретная версия, можно проверить наличие известных CVE. Apache 2.4.41 на Ubuntu — веб-сервер, первый кандидат на исследование через браузер и перебор директорий. MySQL filtered — база данных спрятана за файрволом. Найдёте SSRF или RCE на веб-сервере — попробуйте достучаться к ней изнутри. 8080 closed — сейчас пусто, но запомните: иногда сервисы поднимаются после определённых действий на боксе.
Без флагов -sV -sC вы бы увидели только номера портов и состояния — без версий, без заголовков HTTP, без информации о конфигурации. Разница между «порт 80 открыт» и «Apache 2.4.41 на Ubuntu с заголовком Welcome to My App» — это разница между пустой догадкой и конкретным вектором.
Nmap поддерживает больше десятка техник сканирования. Документация по Port Scanning Techniques перечисляет SYN, Connect, UDP, FIN, Xmas, NULL, ACK, Idle и другие. В CTF реально нужны три: SYN, TCP Connect и UDP. Остальные — для обхода файрволов в боевых пентестах, в лабораторных условиях они избыточны.
SYN-скан (-sS) — метод по умолчанию при запуске от root. Самый быстрый и распространённый тип сканирования портов Nmap. Механика простая: Nmap шлёт пакет с флагом SYN, анализирует ответ и не завершает TCP-рукопожатие.
Три варианта ответа: - Пришёл SYN-ACK — порт открыт. Nmap сразу шлёт RST, обрывая соединение - Пришёл RST — порт закрыт, сервис не слушает - Нет ответа после нескольких попыток или пришёл ICMP unreachable (type 3, codes 1, 2, 3, 9, 10, 13) — порт фильтруется файрволом
Почему SYN-скан называют «полуоткрытым» (half-open)? TCP-соединение никогда не устанавливается до конца. Если параллельно отслеживаете трафик в Wireshark, увидите последовательность SYN → SYN-ACK → RST вместо нормального трёхстороннего рукопожатия SYN → SYN-ACK → ACK. Это полезно понимать для CTF-задач по форензике, где нужно определить тип активности по дампу трафика.
Запуск: sudo nmap -sS -p- -T4 <target>. Флаг -p- критически важен — без него Nmap проверит только 1000 самых популярных портов из базы nmap-services. В CTF ключевые сервисы специально размещают на нестандартных портах (8443, 9090, 50000), и без полного скана вы их просто не увидите.
TCP Connect-скан (-sT) выполняет полное трёхстороннее рукопожатие через системный вызов connect(). Root не нужен, но медленнее и шумнее — каждое соединение логируется на стороне цели. В CTF единственное применение — когда сканируете через прокси (proxychains) или из-под непривилегированного пользователя после получения начального доступа к машине. Команда: nmap -sT <target> — без sudo.
UDP-сканирование (-sU) — то, что отличает грамотный enumeration от поверхностного. DNS (53), SNMP (161), TFTP (69), NTP (123) — эти сервисы работают по UDP и регулярно становятся вектором атаки. Если SNMP открыт с community string public, одна команда snmpwalk может выдать учётные данные или информацию о процессах.
Проблема: UDP-скан медленный. Протокол не предусматривает подтверждения получения пакетов. Открытые и фильтруемые порты редко отвечают, а для закрытых портов многие системы ограничивают частоту ICMP-ответов. Полный UDP-скан может занять часы. Решение — ограничить скоуп: sudo nmap -sU --top-ports 20 -T4 <target> проверит 20 самых популярных UDP-портов. Обычно укладывается в несколько минут, хотя время зависит от ICMP rate-limiting на цели — от 1 до 10+ минут.
Комбинация TCP и UDP в одной команде (sudo nmap -sS -sU --top-ports 200 <target>) позволяет Nmap выполнять оба скана параллельно, но UDP-часть всё равно останется узким местом из-за rate-limiting ICMP-ответов.
Nmap выделяет шесть состояний портов, и понимание разницы между ними — навык, без которого сканирование портов Nmap превращается в бессмысленное ожидание.
| Состояние | Что это значит | Действие в CTF |
|---|---|---|
| open | Сервис принимает соединения | Главная цель — определяйте версию, ищите уязвимости |
| closed | Порт доступен, сервис не слушает | Запомните — сервисы иногда появляются после действий на боксе |
| filtered | Файрвол блокирует пакеты | Пробуйте достучаться изнутри после получения шелла |
| unfiltered | Порт доступен, но open/closed не определить | Результат ACK-скана — переключитесь на SYN для уточнения |
| open|filtered | Нет ответа — неясно, открыт или фильтруется | Типично для UDP. Используйте -sV для уточнения |
| closed|filtered | Невозможно определить состояние | Редкое состояние при Idle-скане |
Для CTF ключевой паттерн: filtered на порту базы данных (3306, 5432, 1433) — подсказка, что после получения RCE или SSRF на веб-сервере стоит попробовать подключиться к базе через localhost. По классификации OWASP, SSRF (A10:2021) входит в десятку наиболее критичных уязвимостей веб-приложений, и в CTF её часто используют именно для доступа к фильтрованным внутренним сервисам.
Универсальная команда для CTF: sudo nmap -A -T4 -p- <target> -oA scan. Флаг -A — агрессивный режим, объединяющий -sV (версии), -sC (дефолтные скрипты), -O (определение ОС) и traceroute. -T4 — шаблон тайминга, ускоряющий скан на хорошем канале. -p- — все порты. -oA scan — сохранение результатов во всех форматах: .nmap (текстовый), .xml (для парсинга) и .gnmap (grepable).
Grepable-формат — штука незаменимая для быстрого поиска: grep "80/open" scan.gnmap покажет все хосты с открытым HTTP. Привычка добавлять -oA к каждому скану экономит время, когда через час работы нужно вспомнить конкретную версию сервиса.
Флаг -sV заставляет Nmap подключаться к открытым портам и отправлять серию проб из базы nmap-service-probes. Ответы сравниваются с сигнатурами для определения конкретного ПО и версии. Интенсивность регулируется через --version-intensity: значение 0 использует минимум проб (быстро, но может ошибиться), стандартное 9 пробует все доступные пробы для максимальной точности.
Если Nmap определяет сервис как tcpwrapped — соединение завершило рукопожатие, но сервис не отдал баннер. Тут стоит попробовать руками: nc -nv <target> <port> и посмотреть, что вернётся.
Конкретная версия сервиса — отправная точка для поиска эксплойтов. Привычка проверять <service> <version> exploit в поисковике после каждого скана стабильно сокращает время до первого шелла. На одном боксе я нашёл vsftpd 2.3.4 — гугл за 10 секунд показал бэкдор, и шелл был через минуту.
Определение ОС (-O) использует анализ TCP/IP-стека цели: значения TTL, размеры TCP-окна, порядок TCP-опций, обработку ICMP-ответов. Всё это формирует «отпечаток», который Nmap сверяет с базой nmap-os-db. Для точного результата нужны и открытые, и закрытые порты — чем разнообразнее ответы, тем точнее определение.
В CTF знание ОС определяет выбор payload: Linux или Windows, какой шелл генерировать, где искать флаг (/root/root.txt или C:\Users\Administrator\Desktop\root.txt). Если Nmap сомневается — добавьте --osscan-guess для наиболее вероятного варианта.
Nmap Scripting Engine — встроенный движок на Lua, который превращает сканер портов в полноценный инструмент разведки. Скрипты лежат в /usr/share/nmap/scripts/ — на Kali их сотни. Поиск по ключевому слову: ls /usr/share/nmap/scripts/ | grep smb.
Флаг -sC (эквивалент --script default) запускает скрипты из категории default — безопасные, не деструктивные, но дающие полезную информацию. Для HTTP — заголовки, title страницы, robots.txt. Для SMB — перечисление шар. Для FTP — проверку анонимного доступа.
Вывод NSE для FTP-сервера на CTF-боксе:
21/tcp open ftp vsftpd 3.0.3
| ftp-anon: Anonymous FTP login allowed (FTP code 230)
|_drwxr-xr-x 2 ftp ftp 4096 Jan 15 14:23 pub
| ftp-syst:
| STAT:
|_ FTP server status: Connected to ::ffff:10.10.14.5
Этот вывод сразу говорит: анонимный доступ разрешён, есть директория pub. В CTF там почти всегда лежит подсказка или файл с учётными данными. Без -sC вы бы увидели только «порт 21 открыт, vsftpd 3.0.3» — и прошли мимо.
Помимо дефолтных, вот скрипты NSE Nmap, которые я прогоняю чаще всего:
http-enum — перебор типовых директорий и файлов на веб-сервере, работает как быстрый Gobustersmb-enum-shares и smb-enum-users — перечисление SMB-ресурсов и учётных записейdns-brute — перебор поддоменов через словарьvuln — категория скриптов для проверки известных уязвимостей (EternalBlue, Heartbleed, ShellShock)Запуск конкретного скрипта: sudo nmap --script http-enum -p 80 <target>. Запуск категории: sudo nmap --script vuln -p <порты> <target>. Категорию vuln стоит прогонять на каждом CTF-боксе после первичного сканирования — если скрипт что-то нашёл, это экономит полчаса ручного перебора.
Конкретная последовательность команд Nmap для начинающих, которую я использую на каждом боксе:
Шаг 1. Быстрый скан основных портов. sudo nmap -sV -sC -T4 <target> — за 30-60 секунд выдаст картину основных сервисов. Пока команда работает, откройте браузер и проверьте HTTP на стандартных портах.
Шаг 2. Полный скан всех TCP-портов. sudo nmap -sS -p- -T4 <target> -oA full — фоновая задача. Находит сервисы на нестандартных портах. Именно здесь прячутся 30-40% CTF-уязвимостей.
Шаг 3. UDP-скан ключевых портов. sudo nmap -sU --top-ports 20 -T4 <target> — SNMP, TFTP, DNS. Если SNMP открыт — snmpwalk -c public -v1 <target> может выдать учётные данные.
Шаг 4. Точечный скан найденных сервисов. Когда шаг 2 нашёл новый порт: sudo nmap -sV -sC -p <port> <target> для детального определения.
Шаг 5. Скрипты категории vuln. sudo nmap --script vuln -p <порты> <target> — автоматизированная проверка известных уязвимостей.
Шаги 1 и 2 запускайте параллельно. Пока полный скан работает в фоне, вы уже исследуете найденные сервисы из быстрого скана. Не сидите и не смотрите на прогресс-бар — это потерянное время.
| Сервис | Типичный порт | Следующий шаг |
|---|---|---|
| HTTP/HTTPS | 80, 443, 8080, 8443 | Браузер, Gobuster для директорий, robots.txt, source code |
| SSH | 22 | Записать версию, искать утечки ключей в других сервисах |
| FTP | 21 | Проверить анонимный доступ (NSE ftp-anon покажет автоматически) |
| SMB | 139, 445 | smbclient -L //<target>, enum4linux для полного перечисления |
| MySQL/PostgreSQL | 3306, 5432 | Если filtered — запомнить для пост-эксплуатации через localhost |
| SNMP | 161 (UDP) | snmpwalk -c public -v1 <target> — часто выдаёт системную информацию |
| RDP | 3389 | Возможна атака на учётные данные, проверить xfreerdp |
Сканирование только топ-1000 портов. По умолчанию Nmap проверяет 1000 самых популярных портов из базы nmap-services. CTF-боксы специально размещают ключевые сервисы на нестандартных портах. Без -p- в фоне вы рискуете потерять час на бесплодный перебор уже найденных сервисов, когда ответ висит на порту 50000.
Забыли sudo. Без root Nmap использует TCP Connect вместо SYN-скана. Результат похожий, но медленнее. На соревнованиях с ограничением по времени эта разница ощутима.
Игнорирование UDP. Фраза «я просканировал все порты» обычно означает «все TCP-порты». UDP — отдельный мир с отдельными сервисами. SNMP с дефолтной community string — подарок, который новички стабильно пропускают.
Не сохраняют результаты. Через час работы с боксом вы забудете точную версию SSH. Флаг -oA стоит добавлять к каждой команде. Один раз настроили привычку — и больше не нужно пересканировать ради одной строчки.
Путаница filtered и closed. Closed — порт доступен, но сервис не слушает. Filtered — файрвол блокирует пакеты. В CTF filtered часто означает, что сервис доступен только изнутри. После получения шелла проверяйте: ss -tlnp на цели покажет, что слушает на localhost.
Пролистывание вывода NSE. Дефолтные скрипты (-sC) выдают массу деталей: HTTP-заголовки, доменные имена из SSL-сертификатов, SMB-шары, анонимный FTP. Промотать этот вывод — значит пропустить половину подсказок, которые Nmap уже нашёл за вас.
Тайминг -T5 и потерянные порты. Максимально агрессивный тайминг может пропускать порты из-за таймаутов. -T4 — разумный максимум. -T3 — если канал нестабильный или цель отвечает медленно. Даже в контролируемых лабораторных условиях HTB -T5 приводит к пропуску открытых портов на загруженных машинах.
Nmap — инструмент, с которого начинается каждый CTF-бокс и каждый реальный пентест. Но инструмент без методологии — просто программа, которая выдаёт текст в терминал. Разница между «запустил скан и ждёшь» и «запустил быстрый скан, параллельно исследуешь HTTP, потом подключаешь результаты полного скана» — это разница между стагнацией на easy-боксах и стабильным решением medium.
По моему опыту, 60-70% времени на CTF-боксе уходит на разведку, не на эксплуатацию. Новички инвертируют пропорцию: 20 минут на скан, час на эксплойты, которые не подходят. Грамотный сбор информации Nmap сужает воронку до одного-двух конкретных векторов — дальше дело техники.
Периодически слышу, что Nmap устарел и Masscan или Rustscan делают то же самое быстрее. По скорости — да. Но ни один альтернативный сканер не даёт того уровня определения версий и той библиотеки NSE-скриптов, которые есть у Nmap. В реальном пентесте Masscan используют для быстрого прохода по большим подсетям, а потом отдают найденные порты Nmap для глубокого анализа. В CTF, где цель — один хост, Nmap в одиночку закрывает всю разведку.
И ещё одна вещь: сканирование — итеративный процесс, а не одноразовая команда. Первый скан даёт общую картину. Второй детализирует найденное. Третий проверяет гипотезы — скан после получения учётных данных, скан изнутри после шелла. Каждый следующий скан строится на результатах предыдущего. Попробуйте прогнать этот workflow на любом easy-боксе HTB — и сравните, сколько времени уходило раньше и сколько с системным подходом. Если хотите пройти эту цепочку от SYN-пакета до отчёта с прогрессией — на WAPT разбирают подобные сценарии в лабах от базового enumeration до OSCP-уровня.
🚀 Хочешь закрепить на практике? Реши задачи по теме на HackerLab — категория «pentest-machines».
0 комментариев
Пожалуйста, войдите, чтобы оставить комментарий.
Загрузка комментариев...