¿Puede nmap mostrar solo hosts con puertos específicos abiertos?

18

¿Puede nmapenumerar todos los hosts en la red local que tienen abiertos tanto SSH como HTTP? Para hacerlo, puedo ejecutar algo como:

nmap 192.168.1.1-254 -p22,80 --open

Sin embargo, esto enumera los hosts que tienen CUALQUIERA de los puertos de lista abiertos, mientras que me gustaría que los hosts tengan TODOS los puertos abiertos. Además, el resultado es bastante detallado:

# 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

Lo que estoy buscando es la salida simplemente como:

192.168.1.16

ya que el host anterior es el único con TODOS los puertos abiertos.

Ciertamente puedo postprocesar la salida, pero no quiero confiar en el formato de salida de nmap, prefiero que nmap lo haga, si hay alguna manera.

Brian
fuente
Si desea probar solo un puerto, 'nmap -p 22 | grep -B3 open 'es una manera fácil.
Luciano Andress Martini

Respuestas:

10

No hay una forma de hacerlo dentro de Nmap, pero su comentario sobre no querer "confiar en el formato de salida de nmap" me permite señalar que Nmap tiene dos formatos de salida estables para el análisis legible por máquina. El más antiguo es la salida Grepable ( -oG) , que funciona bien para procesar con perl, awk y grep, pero le falta algo de la salida más avanzada (como salida de script NSE, razones de puerto, traceroute, etc.). El formato más completo es la salida XML ( -oX) , pero puede ser excesivo para sus propósitos.

Puede guardar estas salidas en archivos con -oG, -oXo -oA(ambos formatos más salida de texto "normal"), o puede enviar uno directamente a stdout:nmap 192.168.1.1-254-p22,80 --open -oG - | awk '/22\/open.*80\/open/{print $2}'

bonsaiviking
fuente
1
Eso es perfecto, justo lo que estaba buscando (la -oG -)
Brian
2

Considere también esta awkfrase:

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

Le imprimirá todos los hosts con todos los puertos abiertos especificados como este:

 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
fuente
Debe haber agregado -p después de probar esto. El '-' en la línea de comando pertenece justo después de -oG
Wayne el
1

Pruebe el siguiente comando:

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

Esto buscará sus puertos en su rango y canalizará la salida en formato greppable buscando puertos abiertos, luego imprimirá las direcciones IP que cumplan con cualquiera de esos criterios.

Marshall Hallenbeck
fuente
¡Bienvenido a U&L! Tenga en cuenta que la respuesta aceptada de hace ~ 3 años tiene una versión más simple de esto, donde utiliza awk para grep e imprimir.
Jeff Schaller
1
Yo diría que el mío es mejor ya que no tiene que agregar datos adicionales para más puertos más allá de la opción de puerto. El suyo requiere que también actualice su awk con cada puerto, lo cual es innecesariamente detallado.
Marshall Hallenbeck