nc — connexions TCP et UDP arbitraires et écoute
SYNTAXE
nc [-46bCDdFhklNnrStUuvZz] [-I longueur] [-i intervalle] [-M ttl] [-m minttl] [-O longueur]
[-P nom_utilisateur_proxy] [-p port_source] [-q secondes] [-s adresse_source] [-T mot_clé] [-V table_de_routage]
[-W limite_réception] [-w délai_d'attente] [-X protocole_proxy] [-x adresse_proxy[:port]] [destination] [port]
DESCRIPTION
L'utilitaire nc (ou netcat) est utilisé pour à peu près tout ce qui concerne TCP, UDP ou les sockets de domaine Unix. Il peut ouvrir des connexions TCP, envoyer des paquets UDP, écouter sur des ports TCP et UDP arbitraires, effectuer une analyse de port et gérer à la fois IPv4 et IPv6. Contrairement à telnet(1), nc s'exécute bien dans des scripts et sépare les messages d'erreur sur la sortie standard au lieu de les envoyer à la sortie standard, comme le fait telnet(1) dans certains cas.
Les utilisations courantes incluent :
proxys TCP simples
clients et serveurs HTTP basés sur des scripts shell
tests de démons réseau
un proxy SOCKS ou HTTP pour [ssh]({filename}../../ssh)(1)
et bien plus encore
Les options sont les suivantes :
-4 Utiliser uniquement les adresses IPv4.
-6 Utiliser uniquement les adresses IPv6.
-b Autoriser la diffusion.
-C Envoyer CRLF comme fin de ligne. Chaque caractère de saut de ligne (LF) des données d'entrée est traduit en CR+LF avant d'être écrit dans la prise. Les caractères de saut de ligne qui sont déjà précédés d'un retour chariot (CR) ne sont pas traduits. Les données reçues ne sont pas affectées.
-D Activer le débogage sur la prise.
-d Ne pas tenter de lire à partir de stdin.
-F Transmettre la première prise connectée à l'aide de sendmsg(2) vers la sortie standard et quitter. Ceci est utile en conjonction avec -X pour que nc effectue la configuration de la connexion avec un proxy, puis laisse le reste de la connexion à un autre programme (par exemple, [ssh]({filename}../../ssh)(1) en utilisant l'option ssh_config(5) ProxyUseFdpass). Ne peut pas être utilisé avec -U.
-h Afficher le texte d'aide de nc et quitter.
-I longueur
Spécifier la taille du tampon de réception TCP.
-i intervalle
Dormir pendant un intervalle de secondes entre les lignes de texte envoyées et reçues. Cela entraîne également un délai entre les connexions à plusieurs ports.
-k Une fois qu'une connexion est terminée, écouter pour une autre. Nécessite -l. Lorsqu'il est utilisé avec l'option -u, la prise de serveur n'est pas connectée et peut recevoir des datagrammes UDP de plusieurs hôtes.
-l Écouter une connexion entrante au lieu d'initier une connexion à un hôte distant. La destination et le port à écouter peuvent être spécifiés soit en tant qu'arguments non optionnels, soit avec les options -s et -p respectivement. Ne peut pas être utilisé avec -x ou -z. De plus, tous les délais d'attente spécifiés avec l'option -w sont ignorés.
-M ttl Définir la TTL/limite de sauts des paquets sortants.
-m minttl
Demander au noyau de supprimer les paquets entrants dont la TTL/limite de sauts est inférieure à minttl.
-N Fermer la socket réseau après la fin du flux d'entrée (EOF). Certains serveurs exigent cela pour terminer leur travail.
-n Ne pas effectuer de résolution de nom de domaine. Si un nom ne peut pas être résolu sans DNS, une erreur sera signalée.
-O length
Spécifier la taille du tampon d'envoi TCP.
-P proxy_username
Spécifie un nom d'utilisateur à présenter au serveur proxy qui nécessite une authentification. Si aucun nom d'utilisateur n'est spécifié, l'authentification ne sera pas tentée. L'authentification proxy est prise en charge uniquement pour les proxys HTTP CONNECT pour le moment.
-p source_port
Spécifier le port source que nc doit utiliser, sous réserve de restrictions de privilèges et de disponibilité.
-q seconds
Après la fin du flux d'entrée (EOF), attendre le nombre de secondes spécifié, puis quitter. Si le nombre de secondes est négatif, attendre indéfiniment (par défaut). La spécification d'un nombre de secondes non négatif implique l'option -N.
-r Choisir les ports source et/ou de destination de manière aléatoire au lieu de les choisir de manière séquentielle dans une plage ou dans l'ordre dans lequel le système les attribue.
-S Activer l'option RFC 2385 TCP MD5 signature.
-s sourceaddr
Définir l'adresse source à partir de laquelle envoyer les paquets, ce qui est utile sur les machines dotées de plusieurs interfaces. Pour les sockets de datagrammes de domaine Unix, spécifie le fichier de socket temporaire local à créer et à utiliser afin que les datagrammes puissent être reçus. Ne peut pas être utilisé avec l'option -x.
-T keyword
Modifier la valeur de la classe de service IPv4/IPv6. Le mot-clé peut être l'un des suivants : critical, inetcontrol, lowcost, lowdelay, netcontrol, throughput, reliability, ou l'un des codes de service différencié : ef, af11… af43, cs0… cs7 ; ou un nombre en hexadécimal ou décimal.
-t Envoyer des réponses RFC 854 DON'T et WON'T aux demandes RFC 854 DO et WILL. Cela permet d'utiliser nc pour créer des scripts de sessions telnet.
-U Utiliser des sockets de domaine Unix. Ne peut pas être utilisé avec les options -F ou -x. Sous Linux, si le nom commence par un symbole @, il est interprété comme un socket d'espace de noms abstrait : le symbole @ est remplacé par un octet NUL avant la liaison ou la connexion. Pour plus de détails, consultez unix(7).
-u Utiliser UDP au lieu de TCP. Ne peut pas être utilisé avec l'option -x. Pour les sockets de domaine Unix, utiliser un socket de datagramme au lieu d'un socket de flux. Si un socket de domaine Unix est utilisé, un socket de réception temporaire est créé dans /tmp, sauf si l'option -s est spécifiée.
-V rtable
Définir la table de routage à utiliser.
-v Produire une sortie plus détaillée.
-W recvlimit
Terminer après avoir reçu recvlimit paquets du réseau.
-w timeout
Les connexions qui ne peuvent pas être établies ou qui sont inactives se terminent après timeout secondes. L'option -w n'a aucun effet sur l'option -l, c'est-à-dire que nc écoutera indéfiniment une connexion, avec ou sans l'option -w. La valeur par défaut est aucun délai d'attente.
-X proxy_protocol
Utiliser le protocole proxy lors de la communication avec le serveur proxy. Les protocoles pris en charge sont 4 (SOCKS 4, 4A (SOCKS v.4A), 5 (SOCKS v.5) et connect (proxy HTTPS). Si le protocole n’est pas spécifié, la version SOCKS 5 est utilisée. Notez que le protocole SOCKS v.4 est très limité et ne peut être utilisé que lorsque l’hôte de destination peut être résolu en une adresse IPv4. Les autres protocoles transmettent la destination sous forme de chaîne à interpréter par le proxy distant et n’ont pas cette limitation.
-x proxy_address[:port]
Se connecter à la destination en utilisant un proxy à l’adresse proxy_address et au port. Si le port n’est pas spécifié, le port bien connu pour le protocole proxy est utilisé (1080 pour SOCKS, 3128 pour HTTPS). Une adresse IPv6 peut être spécifiée de manière non ambiguë en encadrant proxy_address entre crochets. Un proxy ne peut pas être utilisé avec aucune des options -lsuU.
-Z Mode DCCP.
-z Rechercher uniquement les démons en écoute, sans envoyer de données. Ne peut pas être utilisé avec l’option -l.
la destination peut être une adresse IP numérique ou un nom d’hôte symbolique (sauf si l’option -n est fournie). En général, une destination doit être spécifiée, sauf si l’option -l est fournie (dans ce cas, l’hôte local est utilisé). Pour les sockets de domaine Unix, une destination est requise et il s’agit du chemin du socket auquel se connecter (ou sur lequel écouter si l’option -l est fournie).
le port peut être spécifié en tant que numéro de port numérique ou en tant que nom de service. Les plages de ports peuvent être spécifiées sous forme de numéros de port numériques du type nn-mm. En général, un port de destination doit être spécifié, sauf si l’option -U est fournie. Pour certaines options, la valeur 0 demande au système de choisir un numéro de port.
MODÈLE CLIENT/SERVEUR
Il est assez simple de créer un modèle client/serveur très basique à l’aide de nc. Sur une console, démarrez nc en mode écoute sur un port spécifique pour une connexion. Par exemple :
$ nc -l 1234
nc est maintenant à l’écoute sur le port 1234 pour une connexion. Sur une deuxième console (ou une deuxième machine), connectez-vous à la machine et au port sur lesquels la connexion est en cours d’écoute :
$ nc -N 127.0.0.1 1234
Il devrait maintenant y avoir une connexion entre les ports. Tout ce qui est tapé sur la deuxième console sera concaténé à la première, et vice versa. Une fois la connexion établie, nc ne se soucie pas vraiment de quel côté est utilisé comme « serveur » et de quel côté est utilisé comme « client ». La connexion peut être terminée à l’aide d’un EOF (« ^D »), car l’indicateur -N a été donné.
Il n’y a pas d’option -c ou -e dans cette version de netcat, mais vous pouvez toujours exécuter une commande après l’établissement de la connexion en redirigeant les descripteurs de fichiers. Soyez prudent ici, car l’ouverture d’un port et la permission à quiconque de se connecter et d’exécuter des commandes arbitraires sur votre site est DANGEREUX. Si vous avez vraiment besoin de le faire, voici un exemple :
Sur le côté « serveur » :
$ rm -f /tmp/f; mkfifo /tmp/f
$ cat /tmp/f | /bin/sh -i 2>&1 | nc -l 127.0.0.1 1234 > /tmp/f
Sur le côté « client » :
En faisant cela, vous créez un fichier FIFO à l’emplacement /tmp/f et vous configurez nc pour qu’il écoute sur le port 1234 de l’adresse 127.0.0.1 sur le côté « serveur ». Lorsque le « client » établit une connexion réussie à ce port, /bin/sh est exécuté sur le côté « serveur » et l’invite de commandes est fournie au côté « client ».
Lorsque la connexion est terminée, nc se ferme également. Utilisez -k si vous souhaitez qu’il continue d’écouter, mais si la commande se termine, cette option ne le redémarrera pas ni ne maintiendra nc en fonctionnement. N’oubliez pas non plus de supprimer le descripteur de fichier une fois que vous n’en avez plus besoin :
$ rm -f /tmp/f
TRANSFERT DE DONNÉES
L’exemple de la section précédente peut être étendu pour créer un modèle de transfert de données de base. Toutes les informations saisies à une extrémité de la connexion seront affichées à l’autre extrémité, et les entrées et sorties peuvent être facilement capturées afin d’émuler un transfert de fichiers.
Commencez par utiliser nc pour écouter sur un port spécifique, avec la sortie capturée dans un fichier :
$ nc -l 1234 > filename.out
À l’aide d’une deuxième machine, connectez-vous au processus nc en écoute, en lui fournissant le fichier à transférer :
$ nc -N host.example.com 1234 < filename.in
Une fois le fichier transféré, la connexion se fermera automatiquement.
COMMUNICATION AVEC LES SERVEURS
Il est parfois utile de communiquer avec les serveurs « manuellement » plutôt que via une interface utilisateur. Cela peut faciliter le dépannage, car il peut être nécessaire de vérifier les données qu’un serveur envoie en réponse aux commandes émises par le client. Par exemple, pour récupérer la page d’accueil d’un site web :
$ printf "GET / HTTP/1.0\r\n\r\n" | nc host.example.com 80
Notez que cela affiche également les en-têtes envoyés par le serveur web. Ils peuvent être filtrés à l’aide d’un outil tel que sed(1), si nécessaire.
Des exemples plus complexes peuvent être créés lorsque l’utilisateur connaît le format des requêtes requises par le serveur. Par exemple, un e-mail peut être soumis à un serveur SMTP en utilisant :
$ nc [-C] localhost 25 << EOF
HELO host.example.com
MAIL FROM:<_>
RCPT TO:<_>
DATA
Corps du courriel.
.
QUIT
EOF
ANALYSE DES PORTS
Il peut être utile de savoir quels ports sont ouverts et quels services sont en cours d’exécution sur une machine cible. L’indicateur -z peut être utilisé pour indiquer à nc de signaler les ports ouverts, plutôt que d’initier une connexion. Il est généralement utile d’activer la sortie verbeuse vers la sortie d’erreur en utilisant cette option en conjonction avec l’indicateur -v.
Par exemple :
$ nc -zv host.example.com 20-30
Connection to host.example.com 22 port [tcp/ssh] succeeded!
Connection to host.example.com 25 port [tcp/smtp] succeeded!
La plage de ports a été spécifiée pour limiter la recherche aux ports 20 à 30, et elle est analysée par ordre croissant (sauf si l’indicateur -r est défini).
Vous pouvez également spécifier une liste de ports à analyser, par exemple :
$ nc -zv host.example.com http 20 22-23
nc: connect to host.example.com 80 (tcp) failed: Connection refused
nc: connect to host.example.com 20 (tcp) failed: Connection refused
Connection to host.example.com port [tcp/ssh] succeeded!
nc: connect to host.example.com 23 (tcp) failed: Connection refused
Les ports sont analysés dans l’ordre que vous avez spécifié (sauf si l’indicateur -r est défini).
Alternativement, il pourrait être utile de savoir quel logiciel de serveur est en cours d’exécution et quelles sont les versions. Ces informations sont souvent contenues dans les bannières d’accueil. Afin de les récupérer, il est nécessaire d’abord d’établir une connexion, puis de rompre la connexion une fois la bannière récupérée. Cela peut être réalisé en spécifiant un court délai d’attente avec l’indicateur -w, ou en envoyant une commande « QUIT » au serveur :
$ echo "QUIT" | nc host.example.com 20-30
SSH-1.99-OpenSSH_3.6.1p2
Désaccord de protocole.
220host.example.com IMS SMTP Receiver Version 0.84 Prêt
EXEMPLES
Ouvrir une connexion TCP au port 42 de host.example.com, en utilisant le port 31337 comme port source, avec un délai d’attente de 5 secondes :
$ nc -p 31337 -w 5 host.example.com 42
Ouvrir une connexion UDP au port 53 de host.example.com :
$ nc -u host.example.com 53
Ouvrir une connexion TCP au port 42 de host.example.com en utilisant 10.1.2.3 comme adresse IP pour l’extrémité locale de la connexion :
$ nc -s 10.1.2.3 host.example.com 42
Créer et écouter sur un socket de flux de domaine Unix :
$ nc -lU /var/tmp/dsocket
Se connecter au port 42 de host.example.com via un proxy HTTP à 10.2.3.4, port 8080. Cet exemple pourrait également être utilisé par ssh(1) ; voir la directive ProxyCommand dans ssh_config(5) pour plus d’informations.
$ nc -x10.2.3.4:8080 -Xconnect host.example.com 42
Le même exemple, cette fois en activant l’authentification proxy avec le nom d’utilisateur « ruser » si le proxy l’exige :
$ nc -x10.2.3.4:8080 -Xconnect -Pruser host.example.com 42
VOIR AUSSI
AUTEURS
Implémentation originale par *Hobbit* <_>. Réécriture avec prise en charge d’IPv6 par Eric Jackson <_>. Modifié pour le port Debian par Aron Xu ⟨_⟩.
AVERTISSEMENTS
Les analyses de port UDP utilisant la combinaison d’indicateurs -uz signaleront toujours le succès, quelle que soit l’état de la machine cible. Cependant, en conjonction avec un analyseur de trafic soit sur la machine cible, soit sur un appareil intermédiaire, la combinaison d’indicateurs -uz pourrait être utile pour le diagnostic des communications. Notez que la quantité de trafic UDP généré peut être limitée en raison des ressources matérielles et/ou des paramètres de configuration.