Czy nmap może wyświetlać tylko hosty z określonymi portami?

18

Czy można wyświetlić nmaplistę wszystkich hostów w sieci lokalnej, które mają otwarte SSH i HTTP? Aby to zrobić, mogę uruchomić coś takiego:

nmap 192.168.1.1-254 -p22,80 --open

Wyszczególnia to jednak hosty, które mają DOWOLNE porty listy otwarte, natomiast chciałbym, aby hosty, które WSZYSTKIE porty były otwarte. Ponadto dane wyjściowe są dość szczegółowe:

# 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

To, czego szukam, to po prostu wynik:

192.168.1.16

ponieważ powyższy host jest jedynym z WSZYSTKIMMI otwartymi portami.

Z pewnością mogę przetworzyć dane wyjściowe, ale nie chcę polegać na formacie wyjściowym nmap, wolałbym, aby nmap to zrobił, jeśli istnieje sposób.

Brian
źródło
Jeśli chcesz przetestować tylko jeden port, 'nmap -p 22 | grep -B3 open 'jest łatwym sposobem.
Luciano Andress Martini

Odpowiedzi:

10

Nie ma sposobu, aby to zrobić w Nmap, ale twój komentarz o tym, że nie chcesz „polegać na formacie wyjściowym nmap”, pozwala mi zauważyć, że Nmap ma dwa stabilne formaty wyjściowe do parsowania do odczytu maszynowego. Starsza z nich to wyjście Grepable ( -oG) , które działa dobrze przy przetwarzaniu w Perl, awk i grep, ale brakuje niektórych bardziej zaawansowanych danych wyjściowych (takich jak dane wyjściowe skryptu NSE, przyczyny portów, traceroute itp.). Bardziej kompletnym formatem jest format wyjściowy XML ( -oX) , ale może być zbyt wysoki dla Twoich celów.

Możesz zapisać te dane wyjściowe w plikach za pomocą -oG, -oXlub -oA(oba formaty plus „normalne” wyjście tekstowe), lub możesz wysłać jeden bezpośrednio na standardowe wyjście:nmap 192.168.1.1-254-p22,80 --open -oG - | awk '/22\/open.*80\/open/{print $2}'

bonsaiviking
źródło
1
To doskonały, tylko to, co szukałem (w -oG -)
Brian
2

Rozważ również ten awkjednowarstwowy:

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}'

Spowoduje to wydrukowanie wszystkich hostów ze wszystkimi określonymi otwartymi portami w następujący sposób:

 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
źródło
Musisz dodać -p po przetestowaniu tego. „-” w wierszu poleceń należy wpisać zaraz po -oG
Wayne
1

Spróbuj wykonać następujące polecenie:

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

Spowoduje to wyszukanie portów w twoim zakresie i potokowanie danych wyjściowych w formacie grep, szukając otwartych portów, a następnie wydrukowanie adresów IP, które spełniają którekolwiek z tych kryteriów.

Marshall Hallenbeck
źródło
Witamy w U&L! Zauważ, że zaakceptowana odpowiedź sprzed około 3 lat ma prostszą wersję, w której używa awk do grep i drukowania.
Jeff Schaller
1
Twierdzę, że moje jest lepsze, ponieważ nie musisz dodawać dodatkowych danych dla większej liczby portów poza opcją portu. On wymaga od ciebie aktualizacji awk dla każdego portu, co jest niepotrzebnie gadatliwe.
Marshall Hallenbeck