Aller au contenu
Sécurité medium

netcat : tester des ports et des flux

26 min de lecture

Quand on doit tester rapidement un service, transférer un fichier entre deux machines ou diagnostiquer une connexion réseau, netcat (ou nc) est l'outil idéal. Surnommé le "couteau suisse du réseau", il permet de créer des connexions TCP/UDP en une seule commande, sans configuration complexe.

  • Établir des connexions TCP et UDP vers des services
  • Scanner des ports pour vérifier leur disponibilité
  • Transférer des fichiers entre machines sans scp/rsync
  • Créer un serveur en écoute pour tester vos applications
  • Déboguer des services réseau (HTTP, SMTP, etc.)

netcat fait partie des outils de diagnostic réseau. Chaque outil a sa spécialité :

OutilSpécialitéQuand l'utiliser
netcatConnexions TCP/UDP manuellesTests rapides, transferts ponctuels
nmapScan de ports avancéDécouverte réseau, audit sécurité
curlRequêtes HTTP/HTTPSTests d'API, téléchargements
telnetConnexion texteDébogage protocoles (legacy)
socatTunnels complexesRedirections, proxys avancés
ss/netstatÉtat des connexionsVoir les ports en écoute

Quand utiliser netcat vs nmap ?

Situationnetcatnmap
Tester si un port est ouvertnc -zv host 22✅ mais overkill
Scanner une plage de ports⚠️ Basique✅ Plus complet
Détection de services/versions-sV
Transfert de fichiers✅ Parfait
Créer un serveur temporaire
Audit de sécurité✅ Scripts NSE

Workflow typique de diagnostic :

Fenêtre de terminal
# 1. Vérifier si le service répond
nc -zv 192.168.1.100 80
# 2. Récupérer la bannière du service
echo "" | nc -v -w 2 192.168.1.100 22
# 3. Tester une requête HTTP manuellement
echo -e "GET / HTTP/1.1\nHost: example.com\n\n" | nc example.com 80
# 4. Si besoin d'un scan complet → passer à nmap
nmap -sV -p 1-1000 192.168.1.100

🧠 Modèle mental — Netcat : Le tuyau réseau

Netcat crée un canal bidirectionnel entre stdin/stdout et une connexion réseau. Il peut agir en client (connecter) ou en serveur (écouter).

Modèle mental netcat : Canal bidirectionnel entre stdin/stdout et réseau, client ou serveur

Points clés

  • **Client ou Serveur** : nc HOST PORT (client) ou nc -l PORT (serveur)
  • **Bidirectionnel** : stdin → réseau et réseau → stdout
  • **Redirections** : < fichier (envoyer) et > fichier (recevoir)
  • **Protocole** : TCP par défaut, UDP avec -u

Règles d'or

1
Jamais de données sensibles sans chiffrement Netcat transmet tout en clair, utiliser ncat --ssl ou SSH
2
Toujours utiliser -v pour le debug Le mode verbeux affiche les connexions et erreurs
3
Attention aux variantes netcat-openbsd et netcat-traditional ont des syntaxes différentes

Vocabulaire essentiel

-l
Listen : mode serveur, attend une connexion
-p
Port : spécifie le port (obligatoire avec -l en traditional)
-v
Verbose : affiche les détails de connexion
-z
Zero-I/O : scan sans envoyer de données
-w
Wait : timeout en secondes
-u
UDP : utiliser UDP au lieu de TCP
📚 Pour aller plus loin — 4 options avancées
-e
Execute : lance un programme à chaque connexion (backdoor)
-k
Keep-open : reste ouvert après déconnexion (ncat)
--ssl
Chiffrement SSL/TLS (ncat uniquement)
FIFO
Named pipe pour créer des relais bidirectionnels

netcat crée un tuyau bidirectionnel entre votre terminal (stdin/stdout) et une connexion réseau. Il peut agir en client (se connecter) ou en serveur (écouter).

Fenêtre de terminal
# Mode client : se connecter à un service
nc [HOST] [PORT]
# Mode serveur : écouter sur un port
nc -l -p [PORT] # netcat-traditional
nc -l [PORT] # netcat-openbsd
ModeSyntaxeUsage
Clientnc HOST PORTSe connecter à un service existant
Serveurnc -l -p PORTAttendre une connexion entrante
Fenêtre de terminal
# Se connecter au port SSH
nc 192.168.1.100 22
# Se connecter à un serveur web
nc example.com 80
# puis taper : GET / HTTP/1.0 [Entrée] [Entrée]
Fenêtre de terminal
# Vérifier un seul port
nc -zv 192.168.1.100 22
# Scanner une plage de ports
nc -zv 192.168.1.100 20-25
# Scanner plusieurs ports spécifiques
nc -zv 192.168.1.100 22,80,443

Options importantes :

  • -z : Mode scan (pas de données envoyées)
  • -v : Verbeux (affiche le résultat)
  • -w N : Timeout après N secondes
Fenêtre de terminal
# Machine réceptrice (écoute sur port 4444)
nc -l -p 4444 > fichier_recu.txt
# Machine émettrice (envoie le fichier)
nc 192.168.1.100 4444 < fichier_a_envoyer.txt

Avec compression pour les gros fichiers :

Fenêtre de terminal
# Récepteur
nc -l -p 4444 | tar xzvf -
# Émetteur (envoie un dossier compressé)
tar czvf - /dossier | nc 192.168.1.100 4444
Fenêtre de terminal
# Connexion UDP (pour tester DNS, DHCP, etc.)
nc -u 8.8.8.8 53
# Écouter en UDP
nc -l -u -p 5000
Fenêtre de terminal
# Version traditionnelle (avec -e)
sudo apt install netcat-traditional
# Version OpenBSD (par défaut, sans -e)
sudo apt install netcat-openbsd
# Vérifier la version
nc -h 2>&1 | head -3

Il existe plusieurs versions de netcat avec des différences importantes :

VersionOptions notablesSécurité
netcat-traditional-e (execute), -p PORT obligatoire⚠️ -e = backdoor
netcat-openbsdPas de -e, -l PORT (sans -p)✅ Plus sûr
ncat (Nmap)--ssl, --allow, -k (keep-open)✅ Chiffrement
socatTunnels complexes, SSL natif✅ Très flexible
Fenêtre de terminal
# Identifier la version installée
nc -h 2>&1 | head -1
# netcat-traditional affiche : [v1.10-47]
# netcat-openbsd affiche : usage: nc [-46DdhklnrStUuvzC] ...
Fenêtre de terminal
# Machine 1 : écouter
nc -l -p 1234
# Machine 2 : se connecter
nc 192.168.1.100 1234
# Les deux terminaux peuvent maintenant échanger des messages
Fenêtre de terminal
# Serveur qui répond "Hello World" (une seule requête)
echo -e "HTTP/1.1 200 OK\n\nHello World" | nc -l -p 8080
# Serveur persistant (boucle)
while true; do echo -e "HTTP/1.1 200 OK\n\nHello $(date)" | nc -l -p 8080; done
Fenêtre de terminal
# SSH
echo "" | nc -v -w 2 192.168.1.100 22
# SSH-2.0-OpenSSH_8.9p1 Ubuntu-3ubuntu0.1
# SMTP
echo "QUIT" | nc -v -w 2 mail.example.com 25
# 220 mail.example.com ESMTP Postfix
# HTTP
echo -e "HEAD / HTTP/1.1\nHost: example.com\n\n" | nc example.com 80
Fenêtre de terminal
# Créer un relais du port local 8080 vers remote:80
mkfifo /tmp/relay
nc -l -p 8080 < /tmp/relay | nc remote.example.com 80 > /tmp/relay

Ces patterns couvrent la grande majorité des usages de netcat, du simple test de port au relais de trafic. Chacun associe une formule générique et un exemple concret à adapter.

Se connecter à un service TCP sur un port donné.

Fenêtre de terminal
# Formule
nc [HOST] [PORT]
# Exemple
nc example.com 80
  • HOST : adresse IP ou nom de domaine.
  • PORT : port de destination (1-65535).

Ouvrir un port en écoute pour recevoir des connexions.

Fenêtre de terminal
# Formule
nc -l -p [PORT]
# Exemple
nc -l -p 4444
  • PORT : port local à écouter. Les ports inférieurs à 1024 nécessitent root.

Vérifier rapidement quels ports sont ouverts sur une machine.

Fenêtre de terminal
# Formule
nc -zv [HOST] [PORT-RANGE]
# Exemple
nc -zv 192.168.1.100 20-80
  • PORT-RANGE : plage (20-80) ou liste (22,80,443). Pour des scans complexes, préférez nmap.

Transférer un fichier vers une machine en écoute.

Fenêtre de terminal
# Formule
nc [HOST] [PORT] < [FICHIER]
# Exemple
nc 192.168.1.100 4444 < backup.tar.gz
  • FICHIER : fichier local redirigé vers la connexion réseau.

Écouter et sauvegarder les données reçues dans un fichier.

Fenêtre de terminal
# Formule
nc -l -p [PORT] > [FICHIER]
# Exemple
nc -l -p 4444 > backup.tar.gz
  • FICHIER : fichier de destination qui reçoit les données.

Établir une communication texte entre deux machines.

Fenêtre de terminal
# Serveur
nc -l -p 1234
# Client
nc 192.168.1.100 1234

Tout ce qui est tapé d'un côté s'affiche de l'autre.

Envoyer une requête HTTP brute à un serveur web, utile pour le debug.

Fenêtre de terminal
# Formule
echo -e "GET / HTTP/1.1\nHost: [HOST]\n\n" | nc [HOST] 80
# Exemple
echo -e "GET / HTTP/1.1\nHost: example.com\n\n" | nc example.com 80

Pour un usage courant, curl -v http://example.com est plus pratique.

Communiquer en UDP au lieu de TCP — indispensable pour DNS, DHCP, SNMP.

Fenêtre de terminal
# Formule
nc -u [HOST] [PORT]
# Exemple
nc -u 192.168.1.100 53
  • -u : bascule en mode UDP.

Limiter le temps de connexion pour éviter les blocages dans un script.

Fenêtre de terminal
# Formule
nc -w [SECONDS] [HOST] [PORT]
# Exemple
nc -w 3 192.168.1.100 22
  • -w : délai d'expiration en secondes.

Identifier le service et sa version sur un port ouvert.

Fenêtre de terminal
# Formule
echo "" | nc -v -w 2 [HOST] [PORT]
# Exemple
echo "" | nc -v -w 2 192.168.1.100 22

Envoyer une ligne vide suffit à déclencher la bannière de nombreux services.

Relayer le trafic entre deux points via un named pipe.

Fenêtre de terminal
# Formule
mkfifo /tmp/pipe
nc -l -p [LOCAL] < /tmp/pipe | nc [REMOTE] [PORT] > /tmp/pipe
# Exemple
mkfifo /tmp/pipe
nc -l -p 8080 < /tmp/pipe | nc example.com 80 > /tmp/pipe

Pour un proxy robuste, utilisez plutôt socat ou haproxy.

Répondre avec du contenu HTTP pour des tests rapides.

Fenêtre de terminal
# Formule
while true; do echo -e "HTTP/1.1 200 OK\n\n[BODY]" | nc -l -p [PORT]; done
# Exemple
while true; do echo -e "HTTP/1.1 200 OK\n\nHello World" | nc -l -p 8080; done

Pour un vrai serveur, python3 -m http.server est préférable.

Ces erreurs reviennent constamment avec netcat. Plusieurs touchent la sécurité : les connaître évite des fuites de données et des backdoors involontaires.

Les options varient selon la variante installée : netcat-traditional, netcat-openbsd, ncat.

Symptôme : une option n'est pas reconnue, ou le comportement diffère d'une machine à l'autre.

Cause : netcat-openbsd n'a pas -e ; netcat-traditional exige -p avec -l.

Fenêtre de terminal
nc -h # vérifier les options disponibles

Vous transférez des données sensibles en clair via netcat.

Symptôme : les données peuvent être interceptées sur le réseau.

Cause : netcat ne chiffre jamais les communications.

Fenêtre de terminal
ncat --ssl 192.168.1.100 4444

Vous utilisez nc -e /bin/bash en production.

Symptôme : création d'une backdoor permettant l'exécution de commandes à distance.

Cause : -e exécute un programme à chaque connexion. Ne l'utilisez jamais en dehors d'un lab isolé.

Vous tentez d'écouter sur un port inférieur à 1024 sans être root.

Symptôme : message Permission denied.

Cause : les ports 1 à 1023 sont réservés à root.

Fenêtre de terminal
nc -l -p 8080 # un port > 1024, ou exécuter avec sudo

Vous attendez de netcat qu'il accepte plusieurs connexions successives.

Symptôme : le listener s'arrête après la première connexion.

Cause : par défaut, nc -l n'accepte qu'une seule connexion.

Fenêtre de terminal
while true; do nc -l -p 4444; done

Vous oubliez d'ouvrir le port dans le pare-feu.

Symptôme : Connection refused ou timeout.

Cause : iptables, nftables ou firewalld bloque le port.

Fenêtre de terminal
sudo firewall-cmd --add-port=4444/tcp --permanent

Vous utilisez la mauvaise syntaxe pour écouter selon la variante.

Symptôme : erreur Cannot use -p and -l together, ou Missing port.

Cause : netcat-openbsd attend nc -l PORT ; netcat-traditional attend nc -l -p PORT.

Fenêtre de terminal
# OpenBSD
nc -l 4444
# Traditional
nc -l -p 4444

Vous attendez que le serveur reste ouvert après une déconnexion.

Symptôme : le serveur se ferme après chaque transfert.

Cause : le netcat traditionnel n'a pas d'option keep-open.

Fenêtre de terminal
ncat -k -l 4444 # reste ouvert après déconnexion

Ce lab vous fait manipuler netcat sur localhost : test de port, écoute, transfert et récupération de bannière. Comptez 20 minutes.

Le script suivant crée un dossier de travail avec des fichiers de test :

Fenêtre de terminal
# Créer un dossier de travail
mkdir -p /tmp/nc-lab
cd /tmp/nc-lab
# Créer des fichiers de test
echo "Message secret" > secret.txt
echo "Données à transférer" > data.txt
dd if=/dev/urandom of=binary.bin bs=1K count=10 2>/dev/null
# Vérifier la variante de netcat
nc -h 2>&1 | head -5

Pour tout nettoyer à la fin : rm -rf /tmp/nc-lab.

  1. Test de connexion basique — vérifiez si le port 22 (SSH) est ouvert : nc -zv localhost 22. -z scanne sans envoyer de données, -v affiche le résultat.

  2. Écouter sur un port — ouvrez un serveur sur le port 4444 en mode verbeux : nc -l -p 4444 -v. -l active l'écoute, -p spécifie le port.

  3. Transfert de fichier — envoyez secret.txt vers une machine en écoute : nc localhost 4444 < secret.txt. La redirection < envoie le contenu du fichier vers la connexion. Avec compression : gzip -c secret.txt | nc localhost 4444.

  4. Scanner une plage de ports — scannez les ports 20 à 25 : nc -zv localhost 20-25. Le format N-M couvre tous les ports de N à M inclus.

  5. Récupérer une bannière — récupérez la bannière SSH avec un timeout de 2 secondes : echo "" | nc -v -w 2 localhost 22. Une ligne vide suffit à déclencher la bannière.

Ces exercices vont du test de port simple au relais de trafic. Lisez l'énoncé, cherchez la commande, puis dépliez la solution.

Exercice 1 — Vérifier un service web. Vérifiez si le port 443 (HTTPS) est ouvert sur example.com.

Indice : -z pour scanner, -v pour voir le résultat.

Voir la solution
Fenêtre de terminal
nc -zv example.com 443

-z réalise un scan sans données, -v affiche le statut de la connexion.

Exercice 2 — Chat entre deux terminaux. Établissez une communication entre deux terminaux de la même machine.

Indice : un terminal écoute, l'autre se connecte.

Voir la solution
Fenêtre de terminal
# Terminal 1
nc -l -p 1234
# Terminal 2
nc localhost 1234

Le premier terminal devient serveur avec -l, le second s'y connecte en client.

Exercice 3 — Scanner les services courants. Scannez les ports SSH, HTTP et HTTPS sur localhost en une seule commande.

Indice : plusieurs ports se séparent par des virgules.

Voir la solution
Fenêtre de terminal
nc -zv localhost 22,80,443

Les ports peuvent être listés avec des virgules ou exprimés en plage (22-443).

Exercice 4 — Transfert de dossier. Transférez le dossier /tmp/nc-lab vers une machine en écoute.

Indice : combinez tar et netcat avec un pipe.

Voir la solution
Fenêtre de terminal
# Récepteur
nc -l -p 4444 | tar xvf -
# Expéditeur
tar cvf - /tmp/nc-lab | nc localhost 4444

tar crée une archive en streaming, netcat la transporte, tar l'extrait à l'arrivée.

Exercice 5 — Test HTTP manuel. Récupérez la page d'accueil d'example.com avec une requête HTTP/1.1.

Indice : une requête HTTP a besoin de GET, Host et deux retours à la ligne.

Voir la solution
Fenêtre de terminal
echo -e "GET / HTTP/1.1\nHost: example.com\n\n" | nc example.com 80

HTTP/1.1 exige le header Host ; le double \n termine les en-têtes.

Exercice 6 — Connexion UDP DNS. Testez la connectivité UDP vers un serveur DNS sur le port 53.

Indice : -u pour UDP, -w pour un timeout.

Voir la solution
Fenêtre de terminal
nc -zuv -w 2 8.8.8.8 53

-u active le mode UDP, indispensable pour tester un service DNS.

Exercice 7 — Serveur HTTP de fortune. Créez un serveur qui renvoie « Hello World » sur le port 8080.

Indice : la réponse HTTP doit inclure une status line et un body.

Voir la solution
Fenêtre de terminal
while true; do echo -e "HTTP/1.1 200 OK\n\nHello World" | nc -l -p 8080; done

La boucle while permet de servir plusieurs requêtes successives.

Exercice 8 — Relais de port. Créez un relais qui écoute sur 8080 et redirige vers localhost:22.

Indice : utilisez un named pipe (mkfifo) pour la communication bidirectionnelle.

Voir la solution
Fenêtre de terminal
mkfifo /tmp/relay
nc -l -p 8080 < /tmp/relay | nc localhost 22 > /tmp/relay

Le FIFO permet de relayer les données dans les deux sens.

Exercice 9 — Backdoor contrôlée (lab uniquement). Créez un shell distant sur le port 5555. À ne jamais faire en production.

Indice : l'option -e (ou -c) exécute un programme à la connexion.

Voir la solution
Fenêtre de terminal
# Serveur
nc -l -p 5555 -e /bin/bash
# Client
nc localhost 5555

-e exécute le programme pour chaque connexion — extrêmement dangereux hors d'un lab isolé.

Quand une connexion netcat échoue, ces méthodes de diagnostic et ces erreurs fréquentes couvrent la grande majorité des cas.

Fenêtre de terminal
# Mode verbeux : détails de connexion
nc -v HOST PORT
# Identifier la variante de netcat installée
nc -h 2>&1 | head -5
# Tester localement pour écarter un problème réseau
nc -zv localhost PORT
# Lister les services en écoute
ss -tlnp
# Capturer le trafic échangé
sudo tcpdump -i any port PORT
ErreurCause probableSolution
Connection refusedAucun service n'écoute, pare-feu, ou mauvaise IPVérifier l'écoute avec ss -tlnp | grep PORT, démarrer le service ou ouvrir le port
Connection timed outMachine injoignable, pare-feu en DROP, ou routageTester avec ping HOST et traceroute HOST
Permission denied / Can't grab portPort < 1024 sans root, port déjà utilisé, ou SELinuxUtiliser sudo ou un port > 1024
Invalid option / Unknown optionVariante de netcat différente (BSD vs traditional)Vérifier la version avec nc -h et adapter la syntaxe

À garder sous la main : la syntaxe de base, les options principales et les combinaisons les plus utilisées au quotidien.

SyntaxeSignificationExemple
nc HOST PORTConnexion TCP simplenc example.com 80
nc -l -p PORTÉcouter sur un port (traditional)nc -l -p 4444
nc -l PORTÉcouter sur un port (BSD/OpenBSD)nc -l 4444
SyntaxeSignificationExemple
-vMode verbeuxnc -v example.com 80
-zScan sans envoyer de donnéesnc -zv host 20-80
-w NTimeout après N secondesnc -w 3 host 22
-uMode UDP au lieu de TCPnc -u host 53
-nPas de résolution DNSnc -n 192.168.1.1 80
-kKeep-open (ncat uniquement)ncat -k -l 4444
--sslConnexion chiffrée SSL/TLS (ncat)ncat --ssl host 443
--allow HOSTN'accepter que certaines IP (ncat)ncat -l 4444 --allow 192.168.1.0/24
SyntaxeSignificationExemple
< fichierEnvoyer le contenu d'un fichiernc host 4444 < data.txt
> fichierSauvegarder dans un fichiernc -l -p 4444 > received.txt
-z PORT-PORTScan d'une plage de portsnc -zv host 1-1024
-z P1,P2,P3Scan de ports spécifiquesnc -zv host 22,80,443
SyntaxeSignificationExemple
nc -l ... | tar xvf -Extraire une archive reçuenc -l -p 4444 | tar xvf -
tar cvf - dir | nc ...Envoyer un dossier compressétar cvf - /data | nc host 4444
nc -l ... | nc HOSTProxy basique via pipenc -l -p 8080 | nc target 80
... 2>&1 | grep openFiltrer le résultat d'un scannc -zv host 22 2>&1 | grep open
socat - TCP:H:PÉquivalent netcat avec socatsocat - TCP:example.com:80

Vous maîtrisez netcat quand vous pouvez cocher chacun de ces points sans hésiter :

  • Je sais me connecter à un service TCP/UDP.
  • Je sais scanner des ports avec -zv.
  • Je sais transférer un fichier entre deux machines.
  • Je sais créer un serveur en écoute.
  • Je connais les différences entre les variantes de netcat.
  • Je sais quand utiliser ncat --ssl pour le chiffrement.

Contrôle de connaissances

Validez vos connaissances avec ce quiz interactif

10 questions
6 min.
80% requis

Informations

  • Le chronomètre démarre au clic sur Démarrer
  • Questions à choix multiples, vrai/faux et réponses courtes
  • Vous pouvez naviguer entre les questions
  • Les résultats détaillés sont affichés à la fin

Lance le quiz et démarre le chronomètre

Netcat reste un outil incontournable pour le diagnostic réseau rapide et les transferts ponctuels. Sa simplicité en fait l'outil idéal pour tester si un service répond, récupérer une bannière ou envoyer un fichier sans configuration.

Points clés à retenir :

  1. Client : nc HOST PORT / Serveur : nc -l -p PORT
  2. Scan : -zv pour tester sans envoyer de données
  3. Timeout : -w N pour éviter les blocages
  4. UDP : -u pour les protocoles comme DNS
  5. Jamais de données sensibles sans chiffrement (ncat --ssl ou SSH)
  6. Jamais de -e en production (risque de backdoor)

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn