
На одной из первых машин TryHackMe я убил сорок минут, сканируя топ-1000 портов и ковыряя веб-приложение на 80-м — ничего эксплуатабельного. Путь к root-флагу лежал через SSH на порту 2222, который nmap просто не увидел без флага -p-. Одна непоставленная опция — вечер в трубу. Сканирование портов 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 стоит первым в цепочке:
Каждый сетевой сервис слушает определённый порт: веб-сервер на 80/443, SSH на 22, MySQL на 3306, SMB на 445. Открытый порт — поверхность атаки. Без этой карты атаковать нечего, любые попытки эксплуатации превращаются в гадание.
На 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.
SYN-скан (-sS) — основной рабочий инструмент. Он отправляет пакет с флагом SYN и анализирует ответ без завершения TCP-рукопожатия:
За незавершённое рукопожатие SYN-скан и прозвали «half-open scanning». Многие сервисы не логируют неустановленные соединения, поэтому метод относительно тихий. Для CTF скрытность не критична, а вот скорость — ещё как. SYN-скан прожёвывает тысячи портов в секунду на хорошем канале.
Запуск: sudo nmap -sS 10.10.10.100. Требует root — работает с сырыми пакетами.
Без root Nmap автоматически переключается на -sT — полное трёхстороннее рукопожатие через системный вызов connect(). Медленнее SYN-скана, шумнее (каждое соединение логируется сервисом), проще ловится IDS. На CTF вы работаете на своей машине с root, так что -sT используется редко.
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 портов. Я бы не рекомендовал — слишком легко пропустить нестандартный порт.
Знать, что порт 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. Разница принципиальна, и лучше узнать об этом на этапе разведки, а не после получения шелла.
Nmap Scripting Engine (NSE) — движок на Lua, который превращает сканер из простого обнаружителя портов в платформу для network enumeration. В комплекте больше 600 скриптов, разложенных по категориям по назначению и степени интрузивности.
Для 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 можно смело запускать на второй фазе двухфазного скана — ничего не сломаете.
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 на нестабильном VPNTiming template T5 (Insane) отправляет пакеты с максимальной агрессией. На нестабильном VPN-подключении до HTB или TryHackMe это приводит к потерянным пакетам и ложным filtered-результатам. Вы будете думать, что порт за файрволом, а он просто не ответил из-за дропа. T4 (Aggressive) — разумный максимум для CTF. T3 (Normal) — если соединение нестабильно.
Машина показывает только 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 строит карту, дальше работают специализированные инструменты.
| Задача | Команда |
|---|---|
| Быстрый скан всех портов | 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 комментариев
Пожалуйста, войдите, чтобы оставить комментарий.
Загрузка комментариев...