Usando o `/ dev / udp` do bash, como eu saberia se a porta estava aberta?

14

Não tenho acesso netcatou nmapestou tentando usar bashe os /dev/udp/arquivos especiais para testar as portas.

Eu poderia fazer algo como:

echo "" > /dev/udp/example.com/8000

Mas $?é sempre 0ao usar UDP. Estou assumindo que é porque esse é o valor de retorno do echo ""comando correto?

Basicamente, estou tentando replicar o que sou capaz de fazer nmape netcat:

nmap -sU -p 8000 example.com | grep open >/dev/null && echo 'open'
nc -z -u example.com 8000 && echo 'open'

Como eu faria isso /dev/udp?

Belmin Fernandez
fonte
1
O UDP não garante a entrega, portanto, mesmo se o bash achar que conseguiu enviar a mensagem, a mensagem pode ter sido destruída no caminho. Como você testou um envio sem êxito (não uma conexão sem êxito: o UDP não é uma conexão)?
Gilles 'SO- stop be evil

Respostas:

13

Para tcp, basta verificar $?. Se a conexão falhar, $?não será 0:

$ >/dev/tcp/google.com/81
bash: connect: Network is unreachable
bash: /dev/tcp/google.com/81: Network is unreachable
$ echo $?
1

Vai levar tempo para bashperceber que a conexão falhou. Você pode usar o tempo limite para disparar bash:

$ timeout 1 bash -c '>/dev/tcp/google.com/80' &&
  echo Port open ||
  echo Port close
Port open

Testar a porta udp é mais complexo.

Estritamente falando, não há estado aberto (é claro, o udp é um protocolo sem estado ) com o udp. Existem apenas dois estados com udp, ouvindo ou não . Se o estado não for , você receberá um Destino ICMP Inacessível .

Infelizmente, o firewall ou o roteador geralmente descartam esses pacotes ICMP, para que você não tenha certeza de qual estado da porta udp.

cuonglm
fonte
Reformulei minha pergunta para focar no UDP. Minhas desculpas pela edição ninja. Eu pensei que seria semelhante, então não fiz a distinção. Obrigado por esclarecê-lo.
Belmin Fernandez 21/03
10

Em geral, você não pode.

Ao contrário do TCP, o UDP não possui conexão. Você não pode detectar que uma porta está aberta simplesmente fazendo uma conexão do tipo nada como você pode com o TCP. Em vez disso, você precisa enviar dados para a porta e ver o que acontece, e os detalhes do UDP implementados no mundo real dificultam a interpretação dos resultados. Até mesmo ferramentas sofisticadas em nível de pacote, como nmapnão sei ao certo se há um programa ouvindo uma determinada porta UDP. nmapclassifica as portas UDP em três grupos:

  1. Definitivamente aberto. O envio de um pacote para a porta provocou uma resposta de dados da máquina de destino.
  2. Definitivamente fechado. O envio de um pacote para a porta gerou uma mensagem "Destino ICMP inacessível" da máquina de destino.
  3. Aberto ou filtrado. O envio de um pacote para a porta não provocou resposta alguma. Talvez haja um firewall que está descartando os pacotes; talvez haja um programa ouvindo enmap simplesmente não tenha descoberto como obter uma resposta; talvez o usuário tenha tido azar e todos os pacotes tenham sido perdidos em trânsito.
Marca
fonte
Ótimas informações sobre nmap. Obrigado, isso esclarece muita confusão.
Belmin Fernandez 22/03