Examinando Múltiplas Portas ao Executar o NetCat (nc)

5

Eu estou olhando para testar se portas específicas estão em um host estão abertas. Eu estou usando:

nc -z host 22
nc -z host 80
nc -z host 443
nc -z host 8080

que funciona, mas seria bom usar uma linha como:

nc -z host 22 80 443 8080

que não funciona.

Eu gostaria de evitar o intervalo de portas nc -z host 22-8080 , conforme observado na página man, se possível, pois há uma grande lacuna nas portas #s que estou procurando verificar. Além disso, não quero varrer todas as portas e ser visto como uma varredura de portas abertas.

Antes de escrever um loop bash, quais são minhas opções para testar se as portas estão abertas? Eu tenho dezenas de hosts, cada um com um punhado de portas para verificar.

    
por KM. 23.07.2012 / 23:06

5 respostas

5

Estou usando -w 1 abaixo para limitar os tempos limite a 1 segundo. Eu também uso -v pelas razões mencionadas nos comentários. Eu usei -n para recusar atrasos para pesquisas reversas de DNS ...

[mpenning@tsunami ~]$ for i in $(echo "172.16.1.1,172.16.1.5"|tr "," "\n"); do echo -e "22\n80\n443\n8080" | xargs -i nc -w 1 -zvn $i {}; done
(UNKNOWN) [172.16.1.1] 22 (ssh) open
(UNKNOWN) [172.16.1.1] 80 (www) : Connection timed out
(UNKNOWN) [172.16.1.1] 443 (https) open
(UNKNOWN) [172.16.1.1] 8080 (http-alt) : Connection timed out
(UNKNOWN) [172.16.1.5] 22 (ssh) open
(UNKNOWN) [172.16.1.5] 80 (www) open
(UNKNOWN) [172.16.1.5] 443 (https) open
(UNKNOWN) [172.16.1.5] 8080 (http-alt) : Connection refused
[mpenning@tsunami ~]$
    
por 23.07.2012 / 23:40
2

Se você gosta do Paralelo GNU tanto quanto eu, tente o seguinte:

parallel nc -vz host ::: 22 80 443 8080

Exemplo de saída:

Connection to foo.example.com 22 port [tcp/ssh] succeeded!
nc: connect to foo.example.com port 80 (tcp) failed: Connection refused
nc: connect to foo.example.com port 443 (tcp) failed: Connection refused
nc: connect to foo.example.com port 8080 (tcp) failed: Connection refused

Esse método também é mais rápido em alguns casos, já que está testando a conexão a portas em paralelo, não em série. Especificamente, seria quando o host remoto (ou firewall intermediário) descartasse seus pacotes para permanecerem invisíveis (em oposição a uma conexão bem-sucedida ou rejeição forçada).

Dica: na maioria das distribuições Linux, você pode instalar parallel do seu gerenciador de pacotes.

Atualização: Com parallel , isso gera super bem para cobrir um caso frequentemente necessário de vários hosts x várias portas. O exemplo a seguir usa parallel para iterar o produto cruzado, para que você não precise gravar nenhum loop aninhado.

parallel nc -vz ::: host1 host2 host3 ::: 22 80 443 8080

Saída:

Connection to host1 22 port [tcp/ssh] succeeded!
Connection to host1 80 port [tcp/http] succeeded!
Connection to host1 443 port [tcp/https] succeeded!
nc: connect to host1 port 8080 (tcp) failed: Connection refused
Connection to host2 22 port [tcp/ssh] succeeded!
nc: connect to host2 port 80 (tcp) failed: Connection refused
nc: connect to host2 port 443 (tcp) failed: Connection refused
nc: connect to host2 port 8080 (tcp) failed: Connection refused
Connection to host3 22 port [tcp/ssh] succeeded!
nc: connect to host3 port 80 (tcp) failed: Connection refused
nc: connect to host3 port 8080 (tcp) failed: Connection refused
nc: connect to host3 port 443 (tcp) failed: Connection refused

Assim como no exemplo anterior, parallel executa os testes de conexão em paralelo. Observe que o paralelismo padrão é quantos encadeamentos seu sistema possui, mas pode substituir facilmente com a opção -j para qualquer valor. Você poderia facilmente sair com parallel -j 50 ... ou até mais, já que testar soquetes não é uma tarefa intensiva da CPU.

    
por 20.11.2017 / 20:15
1

No Redhat 6 você poderia executar algo assim como um verdadeiro one-liner:

nc -znv -w 2 <host> <port1>; nc -znv -w 2 <host> <port2>

porta de testes -z
-n não resolve o DNS
-v dá saída detalhada -w timeout após 2 segundos
; strings um comando após o outro, desde que você não se importe de digitá-lo novamente.

Eu gosto das sugestões para usar um loop se você estiver digitalizando várias portas, no entanto, se é 2 ou 3 e você já está tentando percorrer uma lista com algo como SSH, é útil usar comandos como esse.

    
por 01.11.2017 / 11:41
1

O Netcat não é realmente um scanner, já que o comentário sugere que o nmap seria uma opção melhor aqui. Não usando a opção de intervalo de portas, acho que você ficou com um shell script;

    for host in $(cat hostlist); do
        for port in $ports; do nc -z $host $port; done
    done

etc.

    
por 23.07.2012 / 23:20
0

No Gentoo Linux (com net-analyzer / netcat-110-r9 instalado):

$ nc -vz www.example.com 80 443
www.example.com [93.184.216.34] 80 (http) open

$ nc -vvz www.example.com 80 443
www.example.com [93.184.216.34] 80 (http) open
www.example.com [93.184.216.34] 443 (https) : Connection refused
    
por 22.09.2015 / 20:58