Вопрос или проблема
Может ли 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_scansudo chown youruser: ./nmap_scan
: изменяет право собственности на файл обратно на вашего пользователя, так как вы запускали sudo. Это необязательно, просто убедитесь, что вы запускаете все последующие команды от имени root или sudogrep -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.
Применение
-
Использование Grepable и XML выводов Nmap
Nmap поддерживает несколько форматов вывода, включая Grepable (
-oG
) и XML (-oX
). Эти форматы предназначены для машинного парсинга и позволяют автоматически обрабатывать результаты сканирования. Хотя nmap не предоставляет встроенных функций для фильтрации хостов по всем открытым портам, вывода в одном из этих форматов может быть использовано для последующей обработки с целью получения нужного результата. -
Команда с использованием 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}'
используется для фильтрации хостов, у которых открыты оба указанных порта.
-
Скрипты и автоматизация
Для более комплексных случаев и большого количества хостов можно использовать скрипты на языках программирования, таких как 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
, пользователь может достичь необходимого результата. Эффективность и простота управления становятся особенно полезными, если дело доходит до диагностики и устранения неполадок в сетевых инфраструктурах, где требуется достоверная информация о состоянии сервисов на хостах. Оптимизация процесса сборки таких данных повышает как безопасность, так и производительность администрирования сетей.