Comment créer un paquet UDP?

15

Lorsque j'exécute la commande Netcat suivante et que j'affiche les paquets avec Wireshark , cela indique que le paquet UDP est mal formé.

$ echo "this is a test" | nc -u 127.0.0.1 53

De même, l'utilisation de commandes telles que $ echo "this is a test" > /dev/udp/127.0.0.1/53produire des erreurs de «paquet mal formé» dans Wireshark.

Entrez la description de l'image ici

La commande echo est envoyée / remise au serveur Netcat sans erreur. Mais cela m'a fait me demander: est-il possible de construire manuellement un paquet UDP approprié avec écho ou un ou plusieurs autres outils Unix natifs?

J'utilise Debian et macOS.

user322500
la source
10
Selon votre capture d'écran, ce n'est pas le paquet udp lui-même qui est mal formé, mais son contenu, car le port 53 est utilisé pour DNS et votre paquet ne contient pas de demande DNS valide.
tkausl
@tkausl vous avez absolument raison. Il n'y a pas d'erreurs "malformées" lors de l'utilisation de ports autres que 53. Merci de l'avoir signalé.
user322500
1
Si vous n'utilisez pas de protocoles standard, vous êtes censé utiliser des ports compris entre 49152 et 65535. Étant donné que Linux utilise par défaut la plage 32768 à 60999 comme ports éphémères, je recommande de ne pas les choisir non plus pour les protocoles non standard. Cependant, 61000 à 65535 sont un jeu équitable pour les protocoles non standard. J'utilise habituellement echo $[61002+RANDOM%4532]pour choisir un numéro de port aléatoire dans cette plage.
kasperd
1
Ne vous connectez pas en tant que root. Vous devriez faire la plupart de votre activité en tant qu'utilisateur non root. Si vous faites des trucs en tant que root, vous serez de retour ici pour demander comment réparer votre machine, et nous ne pourrons pas vous aider (sauf pour recommander une réinstallation).
ctrl-alt-delor
1
@tkausl Regardez ce que vous avez perdu pour ne pas avoir
envoyé

Réponses:

41

Votre paquet est complètement valide, du point de vue IP et UDP. Si vous développez les détails du protocole pour Ethernet / IP / UDP dans le volet inférieur de Wireshark, vous verrez que le paquet est correctement analysé.

Cependant, comme il est destiné au port 53, Wireshark tente de l'analyser en tant que paquet DNS, ce qu'il ne peut pas faire (puisque la chaîne "ceci est un test" n'est pas une demande DNS valide selon la spécification RFC 1035 ).

Si vous suivez les spécifications de ce lien, vous serez en mesure de construire un paquet qui est valide lorsqu'il est analysé en tant que demande DNS. Si vous envoyez le paquet à un autre port, vous remarquerez que Wireshark ne l'analysera plus comme une demande DNS et n'affichera donc pas cet avertissement.

Réintégrer Monica - ζ--
la source
15

Vous pouvez les envoyer à des alias spéciaux Bash avec redirection.

Depuis les pages de manuel de Bash:

/ dev / tcp / host / port Si host est un nom d'hôte ou une adresse Internet valide et que port est un numéro de port entier ou un nom de service, bash tente d'ouvrir le socket TCP correspondant.

/ dev / udp / host / port Si host est un nom d'hôte ou une adresse Internet valide et que port est un numéro de port entier ou un nom de service, bash tente d'ouvrir le socket UDP correspondant.

Cela enverra un paquet UDP au 192.168.2.11 vers le port 8080:

echo "This is a test" > /dev/udp/192.168.2.11/8080
rAlen
la source
Merci pour cette réponse. J'ai mis à jour ma question. L'utilisation de votre méthode génère également un message d'erreur «paquet mal formé», malheureusement.
user322500
-1

Il y a plusieurs questions ici; la réclamation d'un "paquet mal formé" peut être due au déchargement de la somme de contrôle et si c'est le cas, c'est une fausse erreur car elle reflète la capture de paquet n'ayant pas une vue complète - une partie du travail a plutôt été effectuée sur le matériel réseau. WireShark devrait avoir une documentation à ce sujet.

Sinon, divers outils (tels que socat, ncou netcat, ou via des fonctionnalités extrêmement similaires dans des shells tels que ksh93ou bash) peuvent prendre des octets à partir de l'entrée standard et les vider dans ce qui devient un paquet UDP. Que ce soit "correct" dépend du protocole; on pourrait en théorie construire et envoyer un paquet DNS ou DHCP de cette façon, bien que le plus souvent, les gens utilisent une bibliothèque ou un logiciel dédié qui (espérons-le) implémente correctement le protocole en question, car il est généralement beaucoup plus complexe que de définir quelques bits dans le corps d'un paquet et l'envoi de celui-ci sur le fil, notamment la gestion des réponses, une nouvelle tentative après une temporisation ou une erreur, des champs d'en-tête de paquet, etc. Les protocoles sont généralement très bien documentés dans RFC, ou voir la série de livres "TCP / IP Illustrated" par Stevens pour encore plus de documentation.

Des outils spécifiques tels que nmapfaire des choses très personnalisées avec la construction de paquets. Sinon, pour la construction manuelle de paquets, un langage de programmation est généralement utilisé, bien que la plupart des logiciels utilisent des bibliothèques ou des services système existants pour envoyer des paquets DNS ou DHCP ou d'autres paquets UDP, car ceux-ci sont beaucoup moins de travail et beaucoup moins sujets aux erreurs que la création manuelle d'un brut paquet à partir de zéro.

branler
la source