Полное руководство по сканеру Nmap

Полное руководство по сканеру Nmap

Серверы редко ломают с первого удара, это всегда творческий процесс. Обычно сначала ищут точку входа. Такой точкой может быть открытый SSH без ограничений, старый Apache, панель администрирования на внешнем IP, redis без авторизации, тестовый Flask на порту 5000. Все это не выглядит как катастрофа, до тех пор пока не попадает в отчет сканирования информационной безопасности. Nmap как раз и создан для того, что быявлять хосты, открыты TCP/UDP порты, определять службы, их версии и многие другие задачи на стадии энумирации активов и футпринтинга служб. Это инструмент для точной разведки своей инфраструктуры.

Официально Nmap описывается как бесплатная open source утилита для network discovery и security auditing, а в набор входят Ncat, Ndiff и Nping. Актуальный стабильный релиз на странице загрузки Nmap сейчас указан как 7.99.

В этой статье мы рассмотрим такие темы как установка Nmap, базовое сканирование, поиск открытых сервисов, NSE-скрипты, проверка веб-приложений, типовые уязвимости, примеры плохого кода, способы защиты и роль Check Risk WAF. Это нужно, чтобы видеть инфраструктуру глазами атакующего, но работать как защитник: законно, по согласованному scope и с понятным планом исправлений.

Сначала scope, потом сканирование

Внимание: профессиональное использование Nmap начинается не с команды. Сначала нужен список разрешенных адресов. Без этого сканирование легко превращается в проблему для юристов, SOC и сетевой команды.

Рабочий минимум выглядит так: диапазоны IP, домены, окна сканирования, контакты дежурных, запрет на опасные проверки в продуктиве. Для первого прохода лучше использовать мягкие режимы. Агрессивные NSE-скрипты, brute force и exploit-категории оставляют для лаборатории или отдельного согласованного теста.

Установка nmap простая.

sudo apt update
# команда обновляет список пакетов в Ubuntu или Debian

sudo apt install nmap -y
# команда устанавливает Nmap из системного репозитория
sudo dnf install nmap -y
# команда устанавливает Nmap в Fedora, RHEL или совместимой системе
brew install nmap
# команда устанавливает Nmap на macOS через Homebrew

На Windows лучше брать официальный self-installer с сайта Nmap. Он ставит зависимости, включая компоненты для захвата пакетов. Официальная страница загрузки указывает пакеты для Windows, Linux и macOS.

После установки проверьте версию.

nmap --version
# команда показывает версию Nmap и доступные модули

Обнаружение хостов: понять, что вообще живо

Первая уязвимость инфраструктуры часто звучит крайне банально: никто не знает, что в сети реально работает. Старый сервер остался после миграции. Виртуальная машина не попала в CMDB. Тестовый стенд получил внешний адрес. Такие активы не патчат, не мониторят и не закрывают firewall-правилами.

Nmap помогает начать с карты.

nmap -sn 10.10.0.0/24 -oA reports/discovery
# команда запускает обнаружение живых хостов без сканирования портов
# команда сохраняет результат в трех форматах с базовым именем discovery

Ключ -sn делает host discovery без проверки портов. Это хороший первый шаг для внутренней сети. Если ICMP заблокирован, часть хостов может не ответить. Тогда используют TCP-probe на типовые порты.

nmap -sn -PS22,80,443,3389 10.10.0.0/24 -oA reports/discovery_tcp
# команда ищет живые хосты через TCP SYN probe на частые сервисные порты

Проблема, которую мы закрываем здесь, не в самом ICMP. Проблема в слепой зоне. Если актив не виден команде безопасности, он рано или поздно станет точкой входа.

Обратите внимание: защита простая, но требует дисциплины. Сравнивайте результаты Nmap с CMDB, DHCP, cloud inventory и EDR. Все неизвестные хосты в сети должны быть идентифицировны, за ними должен быть закреплен владелец или  они должны быть отключены.

Порты и сервисы: открыто не значит безопасно

Открытый порт сам по себе не уязвимость. Но лишний открытый порт почти всегда лишний риск. Особенно если наружу смотрит база данных, брокер сообщений, панель мониторинга или RDP.

Базовая проверка TCP выглядит так.

nmap -sS -p 1-1000 192.0.2.10 -oA reports/tcp_top
# команда запускает TCP SYN сканирование первых 1000 портов

SYN scan является дефолтным и популярным методом, если у пользователя есть права на raw packets. Если прав нет, Nmap переходит к TCP connect scan. В документации Nmap также отдельно описаны TCP SYN, TCP connect и UDP scan.

Для полного TCP-прохода по согласованному хосту используют все порты.

sudo nmap -sS -p- --open 192.0.2.10 -oA reports/tcp_full
# команда сканирует все TCP порты
# команда показывает только открытые порты

После этого нужно определить версии сервисов.

nmap -sV -sC -p 22,80,443 192.0.2.10 -oA reports/services
# команда определяет версии сервисов
# команда запускает набор стандартных NSE-скриптов

-sV пытается понять продукт и версию. -sC запускает default scripts. Это уже ближе к аудиту, потому что в отчете появятся баннеры, HTTP-заголовки, поддерживаемые методы и другая информация.

Типовая выдача результатов nmap:

22/tcp open  ssh     OpenSSH 7.2p2
80/tcp open  http    Apache httpd 2.4.29
5432/tcp open postgresql PostgreSQL DB

Риск здесь зависит от контекста. SSH может быть нормой, если доступ разрешен только через VPN и ключи. PostgreSQL на внешнем интерфейсе почти всегда ошибка.

Закрытие публикации портов начинается с правил firewall.

sudo ufw deny from any to any port 5432 proto tcp
# команда закрывает внешний доступ к PostgreSQL

sudo ufw allow from 10.10.20.0/24 to any port 5432 proto tcp
# команда разрешает доступ к PostgreSQL только из внутренней подсети приложения

Для Linux-сервиса проверьте bind-address. Пример неправильной конфигурации:

app.run(host="0.0.0.0", port=5000, debug=True)
# код запускает тестовое приложение на всех интерфейсах
# debug=True нельзя оставлять в рабочей среде

Более безопасный вариант:

app.run(host="127.0.0.1", port=5000, debug=False)
# код запускает приложение только на localhost
# внешний доступ должен идти через reverse proxy

Nmap найдет такой тестовый сервис.

nmap -sV -p 5000 --script http-title,http-headers 192.0.2.10
# команда проверяет порт 5000
# команда получает заголовки и заголовок страницы

После исправления порт 5000 не должен быть доступен извне. Снаружи должны остаться только нужные точки входа, чаще всего 80 и 443.

UDP: медленно, но пропускать нельзя

UDP часто игнорируют, потому что он сканируется медленнее. Это плохая привычка. DNS, SNMP, NTP, VPN и разные служебные протоколы часто работают именно по UDP. Документация Nmap прямо отмечает, что UDP scan сложнее и медленнее TCP, но UDP-сервисы широко используются.

Для минимизации времени поиска начинайте с популярных портов.

sudo nmap -sU --top-ports 50 192.0.2.10 -oA reports/udp_top
# команда сканирует 50 самых популярных UDP портов

SNMP на внешнем интерфейсе часто приводит к утечке технической информации. Старые community strings вроде public и private до сих пор встречаются в сетях.

sudo nmap -sU -p 161 --script snmp-info 192.0.2.10
# команда проверяет SNMP на UDP порту 161
# команда пытается получить базовую информацию через NSE

Закрытие зависит от роли узла. Если SNMP не нужен, выключите его. Если нужен, ограничьте доступ по IP и используйте SNMPv3.

sudo ufw deny 161/udp
# команда закрывает SNMP для всех источников
# пример идеи для snmpd.conf
agentAddress udp:127.0.0.1:161
# настройка привязывает SNMP только к localhost

NSE: когда Nmap становится больше, чем сканер портов

NSE, или Nmap Scripting Engine, запускает Lua-скрипты для автоматизации проверок. В документации Nmap перечислены категории safe, default, discovery, vuln, intrusive, exploit и другие. Это важно, потому что не каждый скрипт подходит для production.

Для аккуратной проверки начинайте с безопасных категорий nse скриптов.

nmap -sV --script "default,safe" 192.0.2.10 -oA reports/nse_safe
# команда запускает стандартные и безопасные NSE-скрипты

Для проверки известных уязвимостей есть категория vuln. Она содержит скрипты, которые ищут признаки конкретных проблем. Но часть таких проверок может быть шумной или чувствительной для старых сервисов. Поэтому в боевой среде сначала запускают точечные скрипты.

nmap -sV --script "vuln and safe" 192.0.2.10 -oA reports/vuln_safe
# команда запускает только те vuln-скрипты, которые также отмечены как safe

Пример поиска ms17-010 в SMB.

nmap -p445 --script smb-vuln-ms17-010 192.0.2.10
# команда проверяет SMB на признаки MS17-010

Скрипт smb-vuln-ms17-010 предназначен для обнаружения уязвимости MS17-010, известной по атакам WannaCry и Petya.

Закрытие здесь не должно ограничиваться “скрыть порт”. Нужно отключить SMBv1, поставить патчи, убрать 445 с внешнего периметра и оставить доступ только из доверенных сегментов.

Disable-WindowsOptionalFeature -Online -FeatureName SMB1Protocol
# команда отключает SMBv1 в Windows
sudo ufw deny 445/tcp
# команда закрывает SMB снаружи на Linux firewall

Веб-приложения: Nmap видит симптомы, код лечит причину

Nmap не заменяет Burp Suite, OWASP ZAP или ручной аудит кода. Но он быстро показывает грубые ошибки: лишние методы HTTP, слабые TLS-настройки, отсутствие защитных заголовков, старые версии серверов и часть известных CVE. OWASP Top 10 2025 относит Broken Access Control, Security Misconfiguration, Supply Chain Failures, Cryptographic Failures и Injection к ключевым рискам веб-приложений.

Начнем с заголовков.

nmap -p80,443 --script http-headers,http-security-headers example.com
# команда получает HTTP-заголовки
# команда проверяет наличие защитных заголовков

Скрипт http-security-headers проверяет заголовки, связанные с безопасностью, по проекту OWASP Secure Headers.

Пример конфигурации защиты для Nginx:

add_header Strict-Transport-Security "max-age=31536000" always;
# настройка включает HSTS для HTTPS

add_header X-Content-Type-Options "nosniff" always;
# настройка запрещает браузеру угадывать MIME-тип

add_header Content-Security-Policy "default-src 'self'" always;
# настройка ограничивает источники загрузки контента

Проверка TLS:

nmap -p443 --script ssl-enum-ciphers example.com
# команда проверяет поддерживаемые TLS протоколы и наборы шифров

ssl-enum-ciphers многократно инициирует TLS-соединения и собирает список поддерживаемых cipher suites.

Пример конфигурации защиты для Nginx:

ssl_protocols TLSv1.2 TLSv1.3;
# настройка разрешает только современные версии TLS

ssl_prefer_server_ciphers off;
# настройка позволяет использовать современные правила выбора шифров

Теперь пример ошибки в коде. Nmap может найти веб-сервис, но причину SQL-инъекции нужно искать в приложении.

Уязвимый код:

email = request.args.get("email")
query = "SELECT * FROM users WHERE email = '" + email + "'"
cursor.execute(query)
# код собирает SQL строку через конкатенацию
# пользовательский ввод попадает в запрос без параметризации

Исправленный код:

email = request.args.get("email")
cursor.execute("SELECT * FROM users WHERE email = %s", (email,))
# код использует параметризованный запрос
# база получает данные отдельно от SQL-команды

Для низкоуровневой проверки можно использовать NSE-скрипт http-sql-injection, но только на своем стенде или в согласованном тесте.

nmap -p80,443 --script http-sql-injection example.com
# команда запускает базовую проверку URL и форм на признаки SQL-инъекции

Официальное описание скрипта говорит, что он обходит HTTP-сервер, ищет URL с параметрами и формы, а затем пытается выявить поля, уязвимые к SQL injection. Там же указано, что сложные случаи лучше проверять отдельным инструментом по типу SQLmap.

Для XSS логика такая же. Nmap может подсветить риск, но исправление живет в коде.

Уязвимый код:

res.send("<h1>Hello " + req.query.name + "</h1>")
# код вставляет пользовательский ввод в HTML без экранирования

Исправленный код:

const escapeHtml = require("escape-html")

res.send("<h1>Hello " + escapeHtml(req.query.name) + "</h1>")
# код экранирует пользовательский ввод перед выводом в HTML

 

Профессиональный рабочий процесс

В зрелой команде Nmap не запускают хаотично. Его встраивают в цикл.

Сначала discovery:

nmap -sn 10.10.0.0/24 -oA reports/week_01_discovery
# команда ищет живые хосты в подсети

Потом сканирование портов по живым хостам:

nmap -sS -p- --open -iL live_hosts.txt -oA reports/week_01_tcp_full
# команда сканирует все TCP порты по списку хостов

Затем версии и безопасные скрипты:

nmap -sV -sC --script "default,safe" -iL live_hosts.txt -oA reports/week_01_services
# команда собирает версии сервисов и безопасные NSE-данные

Для сравнения изменений используют Ndiff. Он входит в набор Nmap и нужен, чтобы увидеть, что изменилось между двумя XML-отчетами.

ndiff reports/week_00_services.xml reports/week_01_services.xml
# команда сравнивает два XML-отчета Nmap

Так появляется нормальный процесс. Новый порт не теряется. Старый сервис не остается без владельца. Уязвимость получает срок исправления.

Комплексные рекомендации

  • Сканируйте только свои системы или системы с письменным разрешением. Это снижает юридические риски и не ломает доверие между командами.
  • Храните scope в файлах и используйте -iL. Так меньше шанс случайно проверить чужой адрес.
  • Разделяйте discovery, TCP, UDP, version detection и NSE. Один огромный запуск сложнее читать и сложнее безопасно повторять.
  • Не запускайте intrusive, brute, dos и exploit в production без отдельного разрешения. Эти категории могут менять состояние сервиса или создавать заметную нагрузку.
  • Проверяйте findings вручную. Баннер может врать, WAF может менять ответы, а старый сервис может быть закрыт компенсирующими мерами.
  • Закрывайте не только уязвимость, но и путь к ней. Патч нужен, но firewall, VPN, allowlist, MFA и сегментация тоже нужны.
  • Сохраняйте отчеты через -oA. История изменений часто важнее одного красивого скриншота.
  • После исправления всегда делайте повторное сканирование. Без retest уязвимость остается обещанием, а не закрытым риском.

Заключение

Nmap полезен не потому, что умеет “сканировать все”. Он полезен потому, что заставляет смотреть на инфраструктуру предметно. Вот хост. Вот порт. Вот сервис. Вот версия. Вот риск. Вот действие.

Хорошая защита складывается из нескольких слоев: аккуратная настройка сервисов, своевременные обновления, закрытые лишние порты, безопасный код, нормальные логи, WAF перед веб-приложением и регулярная проверка изменений. Nmap закрывает важную часть этой работы. Он показывает, где поверхность атаки уже стала больше, чем должна быть.

Начните с малого: просканируйте разрешенный диапазон, сохраните отчет, найдите неизвестные сервисы и закройте один лишний порт. Это скучная работа. Именно она чаще всего и снижает реальный риск.

Инструменты
103
31.05.2026 15:00
ИП Елисеев Иван Владимирович
ИНН: 236401038208
Свидетельство о государственной регистрации программы для ЭВМ № 2026683774 от 04 августа 2026 г.
Продукт включен в реестр Российского ПО. Реестровая запись №32239 от 17.02.2026 г.
Регистрационный номер оператора, осуществляющего обработку персональных данных: 23-26-176186