Netcat, Cryptcat et Socat : 3 outils incontournables de réseau

31 octobre 2008 – 12:44

En cours de Computer Systems Security, j’ai eu un TP de réseau sur la manipulation des outils Netcat, Cryptcat et Socat. Si vous faites du réseau mais ne connaissez pas ces outils (au moins Netcat), vous manquez vraiment quelque chose ! Il s’agit de trois petits outils à utilisation très simple mais aux possibilités innombrables. Les trois ont un point commun : ils vous permettent de créer des connexions TCP ou UDP entre machine, mais chacun a ses particularités, dont je vais essayer de donner un bref aperçu.

Netcat : Le couteau-suisse TCP/UDP

Netcat est disponible pour Linux et Windows et permet basiquement d’ouvrir un flux TCP ou UDP entre deux machines. On pourrait considérer Netcat comme un wrapper pour les primitives d’ouverture de sockets du système d’exploitation. En une ligne de commande, il est possible de créer un serveur écoutant sur un port, ou bien se connecter à un port d’une machine distante. Quelques exemples… Sur une première machine d’adresse IP 192.168.0.1, tapez :

nc -l -p 12345

Et dans une autre d’ip 192.168.0.2, tapez :

nc 192.168.0.2 12345

Tapez quelque chose dans une des consoles, suivi d’un retour à la ligne ; ce que vous tapez apparaîtra dans l’autre console. La 1ère ligne ouvrir un serveur en écoute sur le port 12345 de votre machine, et la 2ème vous permet de vous y connecter. Une fois la connexion établie, tout ce qui entre dans un des processus ressort par l’autre : vous venez d’établir un flux bi-directionnel entre les deux.

La puissance de Netcat vient du fait qu’à la manière de l’outil cat d’Unix/Linux, il écoute sur l’entrée standard et écrit sur la sortie standard. Il est donc possible de combiner les fonctionnalités réseau de Netcat avec la puissance du shell et des outils de communications interprocessus des environnements Unix/Linux. Par exemple, vous pouvez piper l’entrée ou la sortie de Netcat, la rediriger dans un fichier… Quelques exemples simples :

  • nc -l -p 12345 < fichier.txt vous permet de créer un serveur en écoute sur le port 12345 de votre machine. Tout client qui s’y connectera recevra le fichier fichier.txt. Cela vous permet d’envoyer des fichiers en réseau.
  • commande | nc -l -p 12345 vous permet d’exécuter une commande shell et d’envoyer le résultat au client qui se connectera au serveur.
  • De façon similaire, nc -l -p 12345 | commande permettra au client d’envyoer des données à une commande lancée sur le serveur. commande peut être /bin/bash, ce qui vous permettra d’exécuter des commandes à distance sur le serveur ! Petit bémol cependant : le client ne verra pas le résultat de la commande, puisque les pipes sont des tubes directionnels.
  • Pour remédier à cela, il existe une technique utilisant les tubes nommés (named pipes) d’Unix: créez un tube nommé avec la commande mkfifo /tmp/tube_test puis lancez la commande nc -l -p 12345 < /tmp/tube_test | /bin/bash > /tmp/tube_test. Le client peut désormais s’y connecter avec nc <IP> 12345, taper des commandes et observer le résultat ! Voila comment obtenir une backdoor à moindre coût sur un système ;)

Netcat n’est bien entendu pas limité à se connecter à un autre Netcat ! Vous pouvez tout à fait vous en servir pour vous connecter à un service existant et dialoguer avec lui. Par exemple, en se connectant sur le port 25 d’un serveur SMTP il est facile d’envoyer un mail.

Netcat peut aussi être utilisé pour faire de la récupération de bannières applicatives (banner grabbing). Connectez-vous sur le port 22 d’un serveur SSH : vous obtenez le nom du serveur avec sa version exacte. Idem pour tous les autres services… C’est en utilisant cet outil qu’on réalise à quel point certains services sont bavards. Pour vous en persuader, connectez-vous à un serveur Apache avec PHP configuré par défaut, envoyez une simple requête HTTP et observez la réponse ; il y a des fortes chances qu’Apache vous révèle son numéro de version, celles de PHP, ainsi que les modules lancés.

Maintenant, rajoutez à cela toute une foule d’options, et vous obtenez la réelle puissance de Netcat !

  • L’option -c permet de spécifier une commande à lancer et à laquelle se connecter ensuite. En d’autre termes, Netcat va relier sa sortie à l’entrée de cette commande, et relier la sortie de la commande à sa propre entrée. Exemple : nc -l -p 12345 -c /bin/bash est la version courte de notre dernier exemple, car cela crée automatiquement un serveur qui enverra toutes les entrées à /bin/bash et renverra tous les résultats au client. Mais il y a encore plus fort : vous pouvez utiliser une autre instance de Netcat comme ceci :
  • Lancez sur une première machine IP_A un serveur sur le port 12346 : nc -l -p 12346
  • Sur une deuxième machine IP_B, lancez nc -l -p 12345 -c ‘nc <IP_A> 12346′ afin d’ouvrir un serveur sur le port 12345 de la machine et de le relier au serveur de la 1ère
  • Sur une troisième machine, connectez-vous au 2ème serveur avec nc <IP_B> 12345. Tout ce que vous tapez est transmis à la 2ème machine qui retransmet le tout à la 1ère, et vice-cersa pour le retour. En gros, la 2ème machine fait office de proxy, ou bouncer. Le serveur final (1ère machine) ne verra jamais l’adresse IP du client.
  • Par défaut, Netcat utilise TCP. L’option -u permet dele fiare basculer en mode UDP.
  • Par défaut, Netcat essaie de résoudre les DNS. Pour éviter cela en réseau local si vous n’utilisez que des adresses IP, utilisez l’option -n.
  • L’option -z permet de fermer la connexion juste après qu’elle ait été ouverte. En fait, cela permet de juste tester si un port est ouvert sans envoyer de données. En scriptantun minimum, il deviant facile de concevoir son propre scanner de port !

Il existe bien d’autres flags, à vous de les découvrir via l’aide (-h) ou le manuel (man nc).

Cryptcat : Netcat en crypté

Si vous lancez Wireshark sur vos machines, vous vous apercevrez que vous pouvez tout à fait lire les données envoyées par Netcat. Pour remédier à cela, utilisez Cryptcat à la place de Netcat ! Cet outil s’utilise exactement comme Netcat mais encrypte le traffic grâce à un algorithme de chiffrement symétrique. La clé de chiffrement est par défaut metallica mais peut être changée avec l’option -k. Attention, lisez bien l’aide ou le manuel avant d’utiliser Cryptcat car certaines versions ne supportent pas certains flags de Netcat.

Socat : Relai bidirectionel

Socat (uniquement pour Linux/Unix) vous permet d’établir non pas une mais deux connexions à la fois et de les relier. Cet outil possède une quantité phénoménales d’options qui lui permettent de réaliser des opérations complexes de façon triviale. Socat est capable de lire/écrire dans tous types de flux, aussi bien réseau (TCP, UDP avec IPv4 et IPv6, SSL…) que systèmes (fichiers, file descriptors, pipes, terminaux virtuels, processus…). Comme exemple, recréons un bouncer mais cette fois-ci avec Socat :

socat TCP4-LISTEN:<port_source> TCP4:<IP_cible>:<port_cible>

N’est-ce pas déconcertant de simplicité ? Et gardez à l’esprit que ce n’est qu’une des possibilités… Tapez dans l’aide pour la liste exhaustives des options supportées.

Netcat, Cryptcat et Socat : l’attirail obligatoire pour le réseau

En résumé, Netcat permet d’exécuter les opérations réseau de base, Cryptcat rajoute une couche de chiffrement à ces flux, et Socat permet de les relier de façon bidirectionnelle. Munis de ces outils, il devient très facile de manier les couches réseau. Outre l’aspect « bidouillage », ils permettent de tester rapidement le fonctionnement de certains services. En les combinant à des outils comme Nmap et TCPDump, et en développant un minimum de petits scripts, il est possible de coder des outils vraiment puissants. Bref, j’espère vous avoir convaincu d’adopter ces outils ;)

  1. Une réponse à “Netcat, Cryptcat et Socat : 3 outils incontournables de réseau”

  2. Bonjour,
    Je connaissais ces outils, mais j’ai quand même appris des trucs en lisant ton texte, notamment la partie sur les named pipes. Bref, merci pour ce billet très didactique et très bien écrit.

    Par Hoper le 3 septembre 2009

Désolé, les commentaires sont fermés pour le moment.