Может ли nmap отображать только хосты с открытыми конкретными портами?

Вопрос или проблема

Может ли nmap перечислить все хосты в локальной сети, которые имеют открытыми порты SSH и HTTP? Для этого я могу выполнить что-то подобное:

nmap 192.168.1.1-254 -p22,80 --open

Однако это перечисляет хосты, которые имеют открытыми ЛЮБЫЕ из указанных портов, тогда как я хочу, чтобы были перечислены хосты, у которых открыты ВСЕ порты. Кроме того, вывод довольно подробный:

# nmap 192.168.1.1-254 -p22,80 --open

Starting Nmap 6.47 ( http://nmap.org ) at 2015-12-31 10:14 EST
Nmap scan report for Wireless_Broadband_Router.home (192.168.1.1)
Host is up (0.0016s latency).
Not shown: 1 closed port
PORT   STATE SERVICE
80/tcp open  http

Nmap scan report for new-host-2.home (192.168.1.16)
Host is up (0.013s latency).
PORT   STATE SERVICE
22/tcp open  ssh
80/tcp open  http

Nmap done: 254 IP addresses (7 hosts up) scanned in 3.78 seconds

Я ищу вывод, который просто таков:

192.168.1.16

так как вышеуказанный хост является единственным, у которого ВСЕ порты открыты.

Я, конечно, могу обработать вывод, но я не хочу полагаться на формат вывода nmap, я бы предпочел, чтобы nmap сделал это, если есть такая возможность.

Нет способа сделать это в рамках Nmap, но ваш комментарий о том, что не хотите “полагаться на форматы вывода nmap”, позволяет мне указать, что у Nmap есть два стабильных формата вывода для машинного парсинга. Старый — это Grepable output (-oG), который хорошо работает для обработки с помощью Perl, awk и grep, но в нем отсутствуют некоторые более совершенные данные (такие как вывод скриптов NSE, причины состояния портов, traceroute и т. д.). Более полный формат — это XML output (-oX), но для ваших нужд он может быть излишним.

Вы можете сохранить эти выводы в файлы с помощью -oG, -oX или -oA (оба формата плюс “нормальный” текстовый вывод), или отправить любой из них прямо в stdout: nmap 192.168.1.1-254 -p22,80 --open -oG - | awk '/22\/open.*80\/open/{print $2}'

Попробуйте следующую команду:

nmap --open -p 22,80 192.168.1.1-254 -oG - | grep "/open" | awk '{ print $2 }'

Это выполнит сканирование ваших портов в вашем диапазоне и направит вывод в формате greppable, ищущем открытые порты, затем напечатает IP-адреса, соответствующие любому из этих критериев.

Рассмотрите также этот однострочник awk:

nmap -Pn -oG /dev/stdout -p22,80,443,445 100.100.100.100 | awk '/open/{ s = ""; for (i = 5; i <= NF-4; i++) s = s substr($i,1,length($i)-4) "\n"; print $2 " " $3 "\n" s}'

Он выведет вам всех хостов со всеми указанными открытыми портами следующим образом:

100.100.100.100 (some-domain.com)
22/open/tcp//ssh
80/open/tcp//http
443/open/tcp//microsoft-ds
445/open/tcp//https-alt

Мое “быстрое и грязное” решение:

nmap -p 443 192.168.178.0/24 | grep 'report\|open'

Вывод:

Nmap scan report for fritz.box (192.168.178.1)
443/tcp open  https
Nmap scan report for 192.168.178.2
Nmap scan report for 192.168.178.3
...

Преимущество:

Вы по-прежнему можете видеть все отвечающие клиенты в сети, чтобы вы могли подстроить порты (например, порт 80 вместо порта 443) под них.

Все эти ответы все еще показывают Игнорируемые порты, даже если есть открытый порт. Следующее сработало для меня:

sudo nmap -sS "10.10.10.0/24" --open -oG ./nmap_scan; sudo chown youruser: ./nmap_scan; cat ./nmap_syn | grep -v 'Nmap\|Status:' | sed 's/\t/,/g' |  awk '{gsub("Ignored State: .*", "");print}' | column -t -s',' 
  • sudo nmap -sS "192.168.1.0/24" --open -oG ./nmap_scan: выполните syn-сканирование только для открытых портов и сохраните вывод в файл в формате grepable под названием nmap_scan
  • sudo chown youruser: ./nmap_scan: изменяет право собственности на файл обратно на вашего пользователя, так как вы запускали sudo. Это необязательно, просто убедитесь, что вы запускаете все последующие команды от имени root или sudo
  • grep -v '^Nmap\|^Status:': удаляет любые строки, начинающиеся с Status: или Nmap, это мусорные строки и не нужные для вывода.
  • sed 's/\t/,/g': заменяет все табуляции на запятые, это по сути превращает вывод в формат CSV, который легче обрабатывать
  • awk '{gsub("Ignored State: .*", "");print}': удаляет “Ignored State: .*”, что является регулярным выражением для чего-либо после “Ignored State:”. между каждым , секцией.
  • column -t -s',': необязательно: отображает вывод в формате столбцов, чтобы сделать его читаемым

Ответ или решение

Теория

Nmap — это мощный инструмент для сканирования сети и выявления открытых портов на различных хостах. В данном контексте пользователь желает получить список IP-адресов хостов в локальной сети, которые имеют открытыми сразу несколько портов: SSH (порт 22) и HTTP (порт 80). Стандартный вывод nmap отображает хосты с одним или несколькими открытыми портами, тогда как пользователь желает получить только те устройства, у которых открыты все указанные порты.

Пример

Для стандартного сканирования nmap, которое выводит все хосты с любыми открытыми портами, используется следующая команда:

nmap 192.168.1.1-254 -p22,80 --open

Но это сканирование выводит не только те хосты, у которых открыты оба порта, но и те, которые имеют открытым хотя бы один из них. Это создает избыточный и менее релевантный вывод.

Чтобы достичь результата, когда выводятся только IP-адреса, у которых открыты именно указанные порты (SSH и HTTP), может потребоваться использование дополнительных утилит и методов постобработки данных, таких как grep, awk или специализированные выходные форматы nmap.

Применение

  1. Использование Grepable и XML выводов Nmap

    Nmap поддерживает несколько форматов вывода, включая Grepable (-oG) и XML (-oX). Эти форматы предназначены для машинного парсинга и позволяют автоматически обрабатывать результаты сканирования. Хотя nmap не предоставляет встроенных функций для фильтрации хостов по всем открытым портам, вывода в одном из этих форматов может быть использовано для последующей обработки с целью получения нужного результата.

  2. Команда с использованием Grep и Awk

    Можно использовать следующую команду для фильтрации результатов и отображения хостов с открытыми портами 22 и 80:

    nmap --open -p22,80 192.168.1.1-254 -oG - | awk '/22\/open/ && /80\/open/ {print $2}'

    В этой команде:

    • -oG - передает результат nmap в формате, совместимом с утилитами командной строки.
    • awk '/22\/open/ && /80\/open/ {print $2}' используется для фильтрации хостов, у которых открыты оба указанных порта.
  3. Скрипты и автоматизация

    Для более комплексных случаев и большого количества хостов можно использовать скрипты на языках программирования, таких как Python или Bash, чтобы автоматизировать процесс сбора и обработки данных. Такие скрипты могут запускать nmap для указанного диапазона IP-адресов, а затем обрабатывать результаты, чтобы вывести только те адреса, которые соответствуют заданным требованиям (например, наличие открытых портов 22 и 80).

Пример скрипта на Bash:

#!/bin/bash
nmap --open -p22,80 192.168.1.1-254 -oG - | awk '
/22\/open/ { ssh[$2] = 1 }
/80\/open/ { http[$2] = 1 }
END {
  for (ip in ssh) {
    if (http[ip]) {
      print ip
    }
  }
}'

Заключение

На данный момент Nmap в своей стандартной функциональности не предлагает возможности фильтрации по нескольким портам без постобработки, но благодаря гибкости инструментов командной строки, таких как awk и grep, пользователь может достичь необходимого результата. Эффективность и простота управления становятся особенно полезными, если дело доходит до диагностики и устранения неполадок в сетевых инфраструктурах, где требуется достоверная информация о состоянии сервисов на хостах. Оптимизация процесса сборки таких данных повышает как безопасность, так и производительность администрирования сетей.

Оцените материал
Добавить комментарий

Капча загружается...