TCPDump : capturer et analyser le trafic réseau sur Linux

Pour capturer des trames réseaux, on peut utiliser wiresharck.
Mais il existe aussi sur Linux, en ligne de commandes l'utilitaire tcpdump.

Tcpdump est un utilitaire de ligne de commande qui vous permet de capturer et d'analyser le trafic réseau passant par votre système.
Il est capable de capturer et de décoder de nombreux protocoles différents, tels que TCP, UDP, ICMP et bien d'autres
Il est souvent utilisé pour aider à résoudre les problèmes de réseau, ainsi qu'un outil de sécurité.

Dans cet article, nous allons voir comment fonctionne cet utilitaire d'analyse réseau afin de capturer des paquets réseaux sur Linux.

TCPDump : capturer et analyser le trafic réseau sur Linux

Débuter avec TCPdump dans la capture de trames réseaux

Installer TCPDump

L'outil de d'analyse réseau n'est en général pas fourni par défaut dans les distributions Linux, ainsi vous devez l'installer.

Pour les distributions à base de Debian, Ubuntu, on utilise apt-get :

sudo apt-get install tcpdump

Pour les autres distributions en Redhat, CentOS :

sudo dnf install -y tcpdump

Première capture du trafic réseau

Ensuite on lance l'utilitaire avec la commande suivante :

sudo tcpdump

Puis les trames réseaux apparaissent.
TCPDump capture et affiche les paquets réseaux échangés par une ou plusieurs interfaces réseaux.
Cela se traduit par des lignes qui défilent à l'écran.

Pour interrompre celle-ci, utilisez la combinaison de touches CTRL+C.
Comme c'est une commande Linux, vous pouvez utiliser grep dessus.
Rediriger le contenu vers un fichier texte même s'il est aussi capable d'enregistrer les trames réseaux dans un fichier PCAP.

Bien entendu, il propose une multitudes d'options et de filtres que nous allons voir en partie dans cet article.

Voici les options générales de TCPdump :

FlagDescription
-i <interface>Ecouter une interface réseau spécifique, .e.g. “-i igb0”
-nN'effectuez pas de résolution DNS inversée sur les adresses IP
-w <filename>Enregistrez la capture au format pcap dans <nom de fichier>, par exemple "-W /tmp/wan.pcap"
-sDurée de capture: quantité de données à capturer à partir de chaque image
-c <packets>Quitter après avoir reçu un nombre spécifique de paquets
-pNe mettez pas l'interface en mode promiscuité
-vMode Verbose (bavard)
-eImprimer l'en-tête de la couche de liaison sur chaque ligne
Les options basiques de TCPDump

TCPDump : capturer et analyser le trafic réseau sur Linux

Voici un exemple d'utilisation de tcpdump :

sudo tcpdump -i ens33 -nn -s0 -v port 443
  • -i : Sélectionnez l'interface sur laquelle la capture doit avoir lieu, ce sera souvent une carte Ethernet ou un adaptateur sans fil, mais pourrait également être un vlan ou quelque chose de plus inhabituel. Pas toujours nécessaire s'il n'y a qu'une seule carte réseau.
  • -nn : un seul (n) ne résoudra pas les noms d'hôte. Un double (nn) ne résoudra pas les noms d'hôte ou les ports. Ceci est pratique non seulement pour visualiser les numéros IP / port, mais également lors de la capture d'une grande quantité de données, car la résolution du nom ralentira la capture.
  • -s0 : longueur de capture, est la taille du paquet à capturer. -s0 définira la taille sur illimité - utilisez ceci si vous voulez capturer tout le trafic. Nécessaire si vous souhaitez extraire des binaires / fichiers du trafic réseau.
  • -v: Verbose, l'utilisation de (-v) ou (-vv) augmente la quantité de détails affichés dans la sortie, affichant souvent des informations plus spécifiques au protocole.
  • port 443 : il s'agit d'un filtre de port commun pour capturer uniquement le trafic sur le port 80, c'est bien sûr généralement HTTPS.
TCPDump : capturer et analyser le trafic réseau sur Linux

Si vous ajoutez -A à la ligne de commande, la sortie inclura les chaînes ascii de la capture.
Cela permet une lecture facile et la possibilité d'analyser la sortie en utilisant grep ou d'autres commandes. Une autre option qui affiche à la fois la sortie hexadécimale et ASCII est l'option -X.

TCPDump : capturer et analyser le trafic réseau sur Linux

Capture réseau avec filtre sur les Hosts, adresse IP et ports

TCPDump permet de filtrer beaucoup d'éléments, que ce soit l'Host ou l'adresse IP, le port, le protocole réseau, etc.

Pour lister les interfaces réseaux, vous pouvez utiliser la commande de cette manière :

sudo tcmpdump -D
Capture réseau avec filtre sur les Hosts, adresse IP et ports

A partir de là, on peut filtrer sur une interface avec l'option -i :

tcpdump -i ens33

Lisez bien ce que tcpdump vous répond car il indique alors l'interface réseaux capturée :

listening on ens33, link-type EN10MB (Ethernet), capture size 262144 bytes

Si on veut filtrer sur un host ou une adressse IP, on utilise l'option host.
L'utilitaire va alors capturer les paquets entrants ou sortant avec cet host.

tcpdump -i ens33 host 212.122.15.13

Mais on peut très bien filtrer qu'en source ou destination :

tcpdump src 212.122.15.13
tcpdump dst 212.122.15.13

Enfin il est tout à fait possible de filtrer un réseau avec le paramètre net.
Il faut alors indiquer le réseau à l'aide du masque de sous-reseau.

tcpdump net 1.2.3.0/24

Enfin on utilise la même syntaxe pour jouer sur les ports réseaux :

tcpdump port 3389
tcpdump src port 1025

Ou encore pour filtrer sur un intervalle de ports :

tcpdump portrange 21-23
tcpdump less 32
tcpdump greater 64
tcpdump <= 128

Capture HTTP

L'option -A permet d'afficher les textes en clairs contenus dans les paquets réseaux.
Ainsi pour les protocoles applications non chiffrés, on peut très bien récupérer des informations.
C'est notamment le cas avec HTTP.

Ainsi pour récupérer l'user-agent d'une connexion WEB, on peut utiliser grep de cette manière :

sudo tcpdump -nn -A -s1500 -l | grep "User-Agent:"

Ou encore pour récupérer les Cookies :

sudo tcpdump -nn -A -s0 -l | egrep -i 'Set-Cookie|Host:|Cookie:'

Combinaisons de filtres et opérateurs

Les règles de filtrages acceptent les opérateurs logiques tel que :

  • AND ou &&
  • OR ou ||
  • not ou !

Ainsi pour que tcpdump intercepte à la fois les paquets du protocole FTP et FTP-DATA, on utilise or :

tcpdump -vvAs0 port ftp or ftp-data

Ou encore ci-dessous pour filtrer sur une IP source et un port en particulier :

tcpdump -i any -c5 -nn src 192.168.122.98 and port 80

Enfin en plus complexe, filtrer les GET en HTTP :

sudo tcpdump -s 0 -A -vv 'tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420'

Enregistrer capture tcpdump dans un fichier

Une autre fonctionnalité utile fournie par tcpdump est la possibilité d'enregistrer la capture dans un fichier afin que vous puissiez analyser les résultats ultérieurement.
Cela vous permet de capturer des paquets en mode batch pendant la nuit, par exemple, et de vérifier les résultats le matin.
Enfin cela aide également lorsqu'il y a trop de paquets à analyser car la capture en temps réel peut se produire trop rapidement.

Par exemple pour enregistrer le traffic HTTP et HTTPS dans un fichier webserver.pcap :

sudo tcpdump -i any -c10 -nn -w webserver.pcap port 443 and port 80

Le format pcap est un format standard de capture de paquets reconnus notamment par Wireshark et TShark.
Ainsi, vous pouvez lire le fichier avec ces derniers.

Mais tcpdump peut aussi l'exploiter.
Ainsi pour lire ce dernier, on utilise l'option -r.
Il est alors possible d'appliquer n'importe quel filtre sur ce dernier pour trouver ce que l'on cherche.

tcpdump -nn -r webserver.pcap

Analyser le réseau avec TCPDump

TCPDump est capable de retranscrire beaucoup de protocoles comme TCP, UDP, ICMP, etc.
Ainsi le contenu transmis diffère selon le type de protocole puisque les contenus des paquets sont différents.

TCP

Pour lire et comprendre le contenu des trames réseaux récupérées par tcpdump, il faut avoir un minimum de connaissance.
Ainsi, avant de vous lancer, quelques rappels sur le protocole TCP/IP.
Pour connaître les différents états de connexions, vous pouvez lire ceci :

Éventuellement compléter avec cet autre article :

Voici un exempel de capture de paquets réseaux en TCP avec TCPDump :

11:41:49.505061 IP broadband-46-242-12-177.ip.moscow.rt.ru.15696 > desktop-93fvsjn.home.8621: Flags [S], seq 168213842, win 65535, options [mss 1452,sackOK,TS val 6699327 ecr 0,nop,wscale 6], length 0
11:41:49.505351 IP desktop-93fvsjn.home.8621 > broadband-46-242-12-177.ip.moscow.rt.ru.15696: Flags [S.], seq 2881719658, ack 168213843, win 65535, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0
11:41:49.579211 IP broadband-46-242-12-177.ip.moscow.rt.ru.15696 > desktop-93fvsjn.home.8621: Flags [.], ack 1, win 1369, length 0
11:41:49.606107 IP broadband-46-242-12-177.ip.moscow.rt.ru.15696 > desktop-93fvsjn.home.8621: Flags [P.], seq 1:47, ack 1, win 1369, length 46
11:41:49.606563 IP desktop-93fvsjn.home.8621 > broadband-46-242-12-177.ip.moscow.rt.ru.15696: Flags [F.], seq 1, ack 47, win 1026, length 0
11:41:49.679237 IP broadband-46-242-12-177.ip.moscow.rt.ru.15696 > desktop-93fvsjn.home.8621: Flags [.], ack 2, win 1369, length 0
11:41:49.690613 IP broadband-46-242-12-177.ip.moscow.rt.ru.15696 > desktop-93fvsjn.home.8621: Flags [F.], seq 47, ack 2, win 1369, length 0
11:41:49.690833 IP desktop-93fvsjn.home.8621 > broadband-46-242-12-177.ip.moscow.rt.ru.15696: Flags [.], ack 48, win 1026, length 0
Analyser les paquets TCP avec TCPDump

On trouve alors de multiples champs comme :

  • Le premier champ, 11:41:49.505351, représente l'horodatage du paquet reçu selon l'horloge locale.
  • Ensuite, IP représente le protocole de la couche réseau - dans ce cas, IPv4. Pour les paquets IPv6, la valeur est IP6.
  • Le champ suivant, desktop-93fvsjn.home.8621, est l'host P source et le port. On peut bien entendu avoir son adresse IP si aucune résolution n'est activée.
  • Puis suit de l'adresse IP ou le host et du port de destination, par exemple broadband-46-242-12-177.ip.moscow.rt.ru.15696
  • Dans le cas d'une connexion TCP, on trouve ensuite le Flag, ici [S.]

Voici la liste des flags possibles en TCP :

ValeurType de FlagDescription
SSYNInitialisation de la connexion
FFINConnexion terminée
PPUSHData push
RRSTRéinitialisation de la connexion
.ACKAcquittement de la connexion
Les flags des connexions TCP
  • Vient ensuite le numéro de séquence des données contenues dans le paquet. Pour le premier paquet capturé, il s'agit d'un nombre absolu. Les paquets suivants utilisent un nombre relatif pour faciliter leur suivi. Dans cet exemple, la séquence est la suite 1:47, ce qui signifie que ce paquet contient les octets 1 à 47 de ce flux.
  • Ceci est suivi du numéro d'acquittement: ack 168213843. Dans ce cas, il vaut 1 lorsque c'est le côté qui envoie les données. Pour le côté recevant des données, ce champ représente le prochain octet attendu (données) sur ce flux. Par exemple, ack 48 répond au paquet dont seq est 47.
  • Puis on trouve le champs de la taille de la fenêtre win 65535, qui représente le nombre d'octets disponibles dans le tampon de réception.
  • Ensuite, les options TCP telles que le MSS (taille maximale du segment) ou l'échelle de la fenêtre.
  • Enfin, nous avons la longueur du paquet, longueur 46, qui représente la longueur, en octets, des données utiles. La longueur est la différence entre le dernier et le premier octets du numéro de séquence. Ainsi seq donne length 46.

ICMP et UDP

Autre exemple ci-dessous avec le protocole ICMP.
On obtient la source et destination, le type de message (unreachable, echo request), la longueur du paquet et la séquence.

11:35:08.378155 IP dhcp-077-250-206-015.chello.nl > desktop-93fvsjn.home: ICMP dhcp-077-250-206-015.chello.nl udp port 8621 unreachable, length 36
11:35:20.557298 IP 91.219.252.200 > desktop-93fvsjn.home: ICMP time exceeded in-transit, length 137
11:35:58.842807 IP pc74.home > par10s28-in-f99.1e100.net: ICMP echo request, id 1, seq 1, length 64

En UDP on trouve les mêmes informations avec la longueur.

1:42:11.868753 IP desktop-93fvsjn.home.8621 > 79-70-253-71.dynamic.dsl.as9105.com.8621: UDP, length 101

Liens

Vous avez trouvé cet article utile et interressant, n'hésitez pas à le partager...
bouton facebookbouton twitterbouton whatapps
Cet article est sous licence Creative Commons BY-NC-SA.
Vous êtes autorisé à partager et modifier cet article, à condition de créditer le site ainsi que la licence, d'utiliser la même licence si vous modifiez l'oeuvre et de ne pas en faire d'utilisation commerciale.

Trouver la solution sur le forum d'aide

Vous êtes arrivé au terme de l'article TCPDump : capturer et analyser le trafic réseau sur Linux mais vous n'avez pas trouvé la solution à votre problème...

Suivez ces articles du forum pour trouver une réponse :

Sinon créez votre propre demande pour obtenir de l'aide gratuite.
Plus de détails : Comment obtenir de l'aide sur le forum