Aller au contenu
Sécurité medium

Maîtriser Netcat : Le couteau suisse du réseau

11 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 recettes couvrent les cas d'usage les plus fréquents. Cliquez sur un pattern pour voir la formule complète et un exemple prêt à copier.

Connexion TCP simple Base

Se connecter à un service TCP sur un port

nc example.com 80
Formule nc [HOST] [PORT]
Exemple
nc example.com 80
Paramètres
  • HOST — Adresse IP ou nom de domaine
  • PORT — Port de destination (1-65535)
Écouter sur un port Base

Ouvrir un port en écoute pour recevoir des connexions

nc -l -p 4444
Formule nc -l -p [PORT]
Exemple
nc -l -p 4444
Paramètres
  • PORT — Port local à écouter
Éviter si : Ports < 1024 nécessitent root
Scan de ports Base

Vérifier quels ports sont ouverts sur une machine

nc -zv 192.168.1.100 20-80
Formule nc -zv [HOST] [PORT-RANGE]
Exemple
nc -zv 192.168.1.100 20-80
Paramètres
  • HOST — Adresse cible
  • PORT-RANGE — Plage de ports (ex: 20-80, 22,80,443)
Éviter si : Pour des scans complexes, préférer nmap
Alternative : nmap -p 20-80 192.168.1.100
Envoyer un fichier Base

Transférer un fichier vers une machine en écoute

nc 192.168.1.100 4444 < backup.tar.gz
Formule nc [HOST] [PORT] < [FICHIER]
Exemple
nc 192.168.1.100 4444 < backup.tar.gz
Paramètres
  • HOST — Machine réceptrice
  • PORT — Port d'écoute
  • FICHIER — Fichier à envoyer
Recevoir un fichier Base

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

nc -l -p 4444 > backup.tar.gz
Formule nc -l -p [PORT] > [FICHIER]
Exemple
nc -l -p 4444 > backup.tar.gz
Paramètres
  • PORT — Port d'écoute
  • FICHIER — Fichier de destination
Chat bidirectionnel Base

Établir une communication texte entre deux machines

# Serveur: nc -l -p 1234 # Client: nc 192.168.1.100 1234
Formule Machine A: nc -l -p [PORT] | Machine B: nc [HOST] [PORT]
Exemple
# Serveur: nc -l -p 1234
# Client: nc 192.168.1.100 1234
Paramètres
  • PORT — Port de communication
  • HOST — Adresse du serveur
Test HTTP manuel Inter.

Envoyer une requête HTTP brute à un serveur web

echo -e "GET / HTTP/1.1\nHost: example.com\n\n" | nc example.com 80
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
Paramètres
  • HOST — Nom de domaine ou IP du serveur
Alternative : curl -v http://example.com
Connexion UDP Inter.

Communiquer en UDP au lieu de TCP

nc -u 192.168.1.100 53
Formule nc -u [HOST] [PORT]
Exemple
nc -u 192.168.1.100 53
Paramètres
  • HOST — Adresse cible
  • PORT — Port UDP
Connexion avec timeout Base

Limiter le temps de connexion pour éviter les blocages

nc -w 3 192.168.1.100 22
Formule nc -w [SECONDS] [HOST] [PORT]
Exemple
nc -w 3 192.168.1.100 22
Paramètres
  • SECONDS — Timeout en secondes
  • HOST — Adresse cible
  • PORT — Port cible
Récupérer la bannière Inter.

Identifier le service et sa version sur un port

echo "" | nc -v -w 2 192.168.1.100 22
Formule echo "" | nc -v -w 2 [HOST] [PORT]
Exemple
echo "" | nc -v -w 2 192.168.1.100 22
Paramètres
  • HOST — Adresse cible
  • PORT — Port du service
Proxy simple Avancé

Relayer le trafic entre deux points

mkfifo /tmp/pipe; nc -l -p 8080 < /tmp/pipe | nc example.com 80 > /tmp/pipe
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
Paramètres
  • LOCAL — Port local d'écoute
  • REMOTE — Serveur distant
  • PORT — Port distant
Éviter si : Pour un proxy robuste, utiliser socat ou haproxy
Serveur HTTP minimal Inter.

Répondre avec du contenu HTTP pour tests

while true; do echo -e "HTTP/1.1 200 OK\n\nHello World" | nc -l -p 8080; done
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
Paramètres
  • PORT — Port d'écoute
  • BODY — Contenu de la réponse
Éviter si : Pour un vrai serveur, utiliser python3 -m http.server

Ces erreurs courantes peuvent faire perdre du temps ou causer des dégâts. Les pièges les plus critiques sont affichés en premier.

Pas de chiffrement

Transférer des données sensibles en clair

Danger
Le piège : Transférer des données sensibles en clair
Symptôme : Les données peuvent être interceptées sur le réseau
Cause : Netcat ne chiffre jamais les communications
Correction : Utiliser ncat --ssl ou tunneler via SSH
ncat --ssl 192.168.1.100 4444
Option -e dangereuse

Utiliser nc -e /bin/bash en production

Danger
Le piège : Utiliser nc -e /bin/bash en production
Symptôme : Création d'une backdoor permettant l'exécution de commandes
Cause : -e exécute un programme pour chaque connexion
Correction : Ne jamais utiliser -e en dehors d'un lab isolé
Différentes versions de netcat

Les options varient selon la version (netcat-traditional, netcat-openbsd, ncat)

Attention
Le piège : Les options varient selon la version (netcat-traditional, netcat-openbsd, ncat)
Symptôme : Option non reconnue ou comportement différent
Cause : netcat-openbsd n'a pas -e, netcat-traditional a -p obligatoire pour -l
Correction : Vérifier la version avec nc -h et adapter les options
nc -h  # Voir les options disponibles
Ports privilégiés

Écouter sur un port < 1024 sans root

Attention
Le piège : Écouter sur un port < 1024 sans root
Symptôme : Permission denied
Cause : Les ports 1-1023 sont réservés à root
Correction : Utiliser un port > 1024 ou exécuter avec sudo
nc -l -p 8080  # Au lieu de 80
Firewall bloque les connexions

Oublier d'ouvrir le port dans le firewall

Attention
Le piège : Oublier d'ouvrir le port dans le firewall
Symptôme : Connection refused ou timeout
Cause : iptables/nftables/firewalld bloque le port
Correction : Ouvrir le port dans le firewall
sudo firewall-cmd --add-port=4444/tcp --permanent
Syntaxe d'écoute variable

Utiliser la mauvaise syntaxe pour écouter

Attention
Le piège : Utiliser la mauvaise syntaxe pour écouter
Symptôme : Error: Cannot use -p and -l together / Missing port
Cause : netcat-openbsd: nc -l PORT, netcat-traditional: nc -l -p PORT
Correction : Adapter selon la version installée
# BSD: nc -l 4444
# Traditional: nc -l -p 4444
Connexion unique

S'attendre à ce que netcat accepte plusieurs connexions

Info
Le piège : S'attendre à ce que netcat accepte plusieurs connexions
Symptôme : Le listener s'arrête après la première connexion
Cause : Par défaut, nc -l n'accepte qu'une connexion
Correction : Utiliser une boucle while ou ncat -k
while true; do nc -l -p 4444; done
Pas de mode keep-open natif

Attendre que le serveur reste ouvert après une déconnexion

Info
Le piège : Attendre que le serveur reste ouvert après une déconnexion
Symptôme : Le serveur se ferme après chaque transfert
Cause : netcat traditionnel n'a pas d'option keep-open
Correction : Utiliser ncat -k ou une boucle while
ncat -k -l 4444  # Reste ouvert après déconnexion

🔧 Quand ça ne marche pas

Méthodes de debug

Mode verbeux

Afficher les détails de connexion

nc -v HOST PORT

Vérifier la version

Identifier quelle variante de netcat est installée

nc -h 2>&1 | head -5

Tester localement

Éliminer les problèmes réseau en testant sur localhost

nc -zv localhost PORT

Vérifier les ports en écoute

Lister les services qui écoutent

ss -tlnp

Capturer le trafic

Voir les paquets échangés

sudo tcpdump -i any port PORT

Erreurs fréquentes

Connection refused
Causes possibles
  • Aucun service n'écoute sur ce port
  • Le firewall bloque la connexion
  • L'adresse IP est incorrecte
Diagnostic
  1. Vérifier que le service écoute : ss -tlnp | grep PORT
  2. Vérifier le firewall : sudo iptables -L -n
  3. Tester en local d'abord : nc -zv localhost PORT
✅ Solution

Démarrer le service ou ouvrir le port dans le firewall

Vérifier avec :
ss -tlnp | grep PORT
Connection timed out
Causes possibles
  • La machine cible est injoignable
  • Le firewall DROP les paquets (pas de réponse)
  • Problème de routage réseau
Diagnostic
  1. Tester la connectivité : ping HOST
  2. Tracer la route : traceroute HOST
  3. Vérifier avec un autre port connu ouvert
✅ Solution

Vérifier la connectivité réseau et les règles firewall

Vérifier avec :
ping -c 3 HOST
Permission denied / Can't grab port
Causes possibles
  • Port < 1024 nécessite root
  • Le port est déjà utilisé
  • SELinux bloque l'opération
Diagnostic
  1. Vérifier si le port est utilisé : ss -tlnp | grep PORT
  2. Tester avec un port > 1024
  3. Vérifier SELinux : getenforce
✅ Solution

Utiliser sudo ou un port > 1024

Vérifier avec :
ss -tlnp | grep PORT
Invalid option / Unknown option
Causes possibles
  • Version de netcat différente (BSD vs traditional)
  • L'option n'existe pas dans cette version
Diagnostic
  1. Vérifier la version : nc -h 2>&1 | head -1
  2. Lister les options : nc -h
✅ Solution

Adapter la syntaxe à la version installée

Vérifier avec :
nc -h 2>&1 | head -5

📋 Cheatsheet nc

📝 Syntaxe :

nc HOST PORT Connexion TCP simple
nc -l -p PORT Écouter sur un port (traditional)
nc -l PORT Écouter sur un port (BSD/OpenBSD)

🚀 Commandes types :

Connexion TCP simple Se connecter à un service TCP sur un port
nc example.com 80
Écouter sur un port Ouvrir un port en écoute pour recevoir des connexions
nc -l -p 4444
Scan de ports Vérifier quels ports sont ouverts sur une machine
nc -zv 192.168.1.100 20-80
Envoyer un fichier Transférer un fichier vers une machine en écoute
nc 192.168.1.100 4444 < backup.tar.gz
Recevoir un fichier Écouter et sauvegarder les données reçues dans un fichier
nc -l -p 4444 > backup.tar.gz

⚙️ Options

-v Mode verbeux (affiche les détails) nc -v example.com 80
-z Scan sans envoyer de données nc -zv host 20-80
-w N Timeout après N secondes nc -w 3 host 22
-u Mode UDP au lieu de TCP nc -u host 53
-n Pas de résolution DNS nc -n 192.168.1.1 80
-k Keep-open (ncat uniquement) ncat -k -l 4444
-e PROG Exécuter programme (dangereux) nc -l -p 4444 -e /bin/bash
-c CMD Exécuter commande shell nc -l -p 4444 -c "cat /etc/passwd"
--ssl Connexion chiffrée SSL/TLS ncat --ssl host 443
--allow HOST N'accepter que certaines IP ncat -l 4444 --allow 192.168.1.0/24
--exec Exécuter programme (ncat) ncat -l 4444 --exec /bin/bash

🔍 Filtres

-z PORT-PORT Scan de plage de ports nc -zv host 1-1024
-z P1,P2,P3 Scan de ports spécifiques nc -zv host 22,80,443

⚡ Actions

< fichier Envoyer le contenu d'un fichier nc host 4444 < data.txt
> fichier Sauvegarder dans un fichier nc -l -p 4444 > received.txt

🔗 Composition

| tar xvf - Extraire une archive reçue nc -l -p 4444 | tar xvf -
tar cvf - dir | Envoyer un dossier compressé tar cvf - /data | nc host 4444
echo "GET /" | nc Requête HTTP simple echo "GET / HTTP/1.0\n" | nc host 80
nc -l | nc HOST Proxy basique (via pipe) nc -l -p 8080 | nc target 80
2>&1 Rediriger stderr vers stdout nc -zv host 22 2>&1 | grep open
socat - TCP:H:P Équivalent nc avec socat socat - TCP:example.com:80
socat TCP-L:P - Écouter avec socat socat TCP-LISTEN:4444 -

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.