En utilisant `/ dev / udp` de bash, comment saurais-je si le port était ouvert?

14

Je n'ai pas accès à netcatou nmapalors j'essaie d'utiliser bashet les /dev/udp/fichiers spéciaux pour tester les ports.

Je pourrais faire quelque chose comme:

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

Mais $?c'est toujours 0lorsque vous utilisez UDP. Je suppose que c'est parce que c'est la valeur de retour de la echo ""commande correcte?

J'essaie essentiellement de reproduire ce que je suis capable de faire nmapet netcat:

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

Comment pourrais-je faire cela /dev/udp?

Belmin Fernandez
la source
1
UDP ne garantit pas la livraison, donc même si bash pense qu'il a réussi à envoyer le message, le message peut avoir été détruit en cours de route. Comment avez-vous testé un envoi infructueux (pas une connexion infructueuse: UDP n'est pas une connexion)?
Gilles 'SO- arrête d'être méchant'

Réponses:

13

Pour TCP, il suffit de vérifier $?. Si la connexion a échoué, $?ne sera pas 0:

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

Il faudra du temps pour bashréaliser que la connexion a échoué. Vous pouvez utiliser le délai d' expiration pour déclencher bash:

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

Le test du port udp est plus complexe.

À strictement parler, il n'y a pas d' état ouvert (bien sûr, udp est un protocole sans état ) avec udp. Il n'y a que deux états avec udp, en écoute ou non . Si l'état ne l' est pas , vous obtiendrez une destination ICMP inaccessible .

Malheureusement, le pare-feu ou le routeur supprime souvent ces paquets ICMP, vous ne serez donc pas sûr de l'état du port udp.

cuonglm
la source
J'ai reformulé ma question pour me concentrer sur l'UDP. Mes excuses pour l'édition ninja. Je pensais que ce serait similaire, donc je n'ai pas fait la distinction. Merci de l'avoir éclairci.
Belmin Fernandez
10

En général, vous ne pouvez pas.

Contrairement à TCP, UDP est sans connexion. Vous ne pouvez pas détecter qu'un port est ouvert simplement en établissant une connexion sans connexion avec lui comme vous pouvez le faire avec TCP. Au lieu de cela, vous devez envoyer des données au port et voir ce qui se passe, et les détails d'UDP mis en œuvre dans le monde réel rendent l'interprétation des résultats difficile. Même des outils sophistiqués au niveau des paquets comme nmapne peuvent pas dire avec certitude s'il existe un programme écoutant un port UDP donné. nmapclasse les ports UDP en trois groupes:

  1. Certainement ouvert. L'envoi d'un paquet au port a provoqué une réponse de données de la machine de destination.
  2. Certainement fermé. L'envoi d'un paquet au port a provoqué un message "ICMP Destination inaccessible" de la machine de destination.
  3. Soit ouvert ou filtré. L'envoi d'un paquet au port n'a suscité aucune réponse. Il y a peut-être un pare-feu qui supprime les paquets; il y a peut-être un programme d'écoute et nmapn'a tout simplement pas compris comment obtenir une réponse; peut-être que l'utilisateur n'a pas eu de chance et que tous les paquets ont été perdus en transit.
marque
la source
Excellentes informations sur nmap. Merci, cela clarifie beaucoup de confusion.
Belmin Fernandez