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

18

Можно ли 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 -p 22 | grep -B3 open '- это простой способ.
Лучано Андресс Мартини

Ответы:

10

В Nmap нет способа сделать это, но ваш комментарий о нежелании «полагаться на выходной формат nmap» позволяет мне указать, что Nmap имеет два стабильных выходных формата для машиночитаемого анализа. Более старым является Grepable output ( -oG) , который хорошо работает для обработки с помощью perl, awk и grep, но в нем отсутствуют некоторые более продвинутые выходные данные (например, вывод сценария NSE, причины порта, traceroute и т. Д.). Более полным форматом является XML output ( -oX) , но он может быть излишним для ваших целей.

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

bonsaiviking
источник
1
Это отлично, только то , что я искал (в -oG -)
Brian
2

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

nmap -Pn -oG -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
Suncatcher
источник
Вы должны добавить -p после тестирования этого. Символ '-' в командной строке принадлежит сразу после -oG
Уэйн
1

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

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

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

Маршал Халленбек
источник
Добро пожаловать в U & L! Обратите внимание, что принятый ответ ~ 3 года назад имеет более простую версию, где он использует awk для поиска и печати.
Джефф Шаллер
1
Я бы сказал, что мой лучше, так как вам не нужно добавлять дополнительные данные для большего количества портов, кроме опции порта. Он требует, чтобы вы обновляли свой awk с каждым портом, что неоправданно многословно.
Маршал Халленбек