O nmap pode exibir apenas hosts com portas específicas abertas?

18

Pode nmaplistar todos os hosts na rede local que possuem SSH e HTTP abertos? Para fazer isso, eu posso executar algo como:

nmap 192.168.1.1-254 -p22,80 --open

No entanto, isso lista os hosts que possuem QUALQUER porta de lista aberta, enquanto eu gostaria de hosts que possuem TODAS as portas abertas. Além disso, a saída é bastante detalhada:

# 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

O que eu estou procurando é uma saída simplesmente como:

192.168.1.16

como o host acima é o único com TODAS as portas abertas.

Certamente posso pós-processar a saída, mas não quero contar com o formato de saída do nmap, prefiro que o nmap faça isso, se houver uma maneira.

Brian
fonte
Se você quiser testar apenas uma porta, 'nmap -p 22 | grep -B3 open 'é uma maneira fácil.
Luciano Andress Martini 29/08

Respostas:

10

Não existe uma maneira de fazer isso no Nmap, mas seu comentário sobre não querer "confiar no formato de saída do nmap" permite-me destacar que o Nmap possui dois formatos de saída estáveis ​​para análise legível por máquina. A mais antiga é a saída Grepable ( -oG) , que funciona bem para processar com perl, awk e grep, mas está faltando algumas das saídas mais avançadas (como saída de script NSE, motivos de porta, traceroute etc.). O formato mais completo é a saída XML ( -oX) , mas pode ser um exagero para seus propósitos.

Você pode salvar essas saídas para arquivos com -oG, -oXou -oA(ambos os formatos mais saída de texto "normal"), ou você pode enviar qualquer um direto para stdout:nmap 192.168.1.1-254-p22,80 --open -oG - | awk '/22\/open.*80\/open/{print $2}'

bonsaiviking
fonte
11
Isso é perfeito, exatamente o que eu estava procurando (a -oG -)
Brian
2

Considere também este awkone-liner:

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

Ele imprimirá todos os hosts com todas as portas abertas especificadas, assim:

 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
fonte
Você deve ter adicionado -p após testar isso. O '-' na linha de comando pertence logo após -oG
Wayne
1

Tente o seguinte comando:

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

Isso irá procurar por suas portas no seu intervalo e canalizar a saída em formato greppable, procurando por portas abertas, depois imprimir os endereços IP que atendem a qualquer um desses critérios.

Marshall Hallenbeck
fonte
Bem-vindo ao U&L! Observe que a resposta aceita de ~ 3 anos atrás possui uma versão mais simples, onde ele usa o awk para grep e imprimir.
Jeff Schaller
11
Eu diria que o meu é melhor, pois você não precisa adicionar dados extras para mais portas além da opção de porta. Ele exige que você atualize seu awk com cada porta também, o que é desnecessariamente detalhado.
Marshall Hallenbeck