Analyser les trames Ethernet avec tcpdump sous Linux

CompTIABeginner
Pratiquer maintenant

Introduction

Dans ce laboratoire, vous apprendrez les bases de l'analyse du trafic réseau sur un système Linux en utilisant le puissant outil en ligne de commande tcpdump. L'objectif principal est de capturer et d'inspecter les trames Ethernet au niveau de la couche de liaison de données, offrant une expérience pratique de la manière dont les données sont structurées pour la transmission sur un réseau local. Vous acquerrez des compétences pratiques pour identifier et interpréter les communications réseau de bas niveau.

Vous commencerez par préparer votre environnement, ce qui inclut l'installation de tcpdump et l'identification de votre interface réseau active. Ensuite, vous initierez une capture de paquets en direct pour surveiller l'activité réseau en temps réel. Pour comprendre différents modèles de communication, vous générerez du trafic unicast à l'aide de la commande ping et du trafic broadcast via ARP. En examinant la sortie capturée, vous apprendrez à analyser les en-têtes des trames Ethernet et à distinguer les adresses MAC unicast et broadcast.

Installer tcpdump et identifier votre interface réseau

Dans cette étape, vous allez préparer votre environnement pour l'analyse réseau. Cela implique deux actions clés : l'installation de tcpdump, un puissant renifleur de paquets en ligne de commande, et l'identification du nom de votre interface réseau principale. Un renifleur de paquets vous permet de "voir" les données qui transitent sur le réseau, et tcpdump doit savoir quelle connexion réseau spécifique surveiller.

Tout d'abord, assurons-nous que tcpdump est installé. Bien qu'il s'agisse d'un outil standard, il est bon de confirmer sa présence. Nous utiliserons le gestionnaire de paquets apt. La commande sudo apt update synchronise votre liste de paquets avec les dépôts logiciels, et sudo apt install tcpdump -y installe l'outil, le -y confirmant automatiquement l'installation.

Exécutez les commandes suivantes dans votre terminal :

sudo apt update
sudo apt install tcpdump -y

Une fois l'installation terminée, vous pouvez la vérifier en consultant la version de tcpdump.

tcpdump --version

Vous devriez voir une sortie similaire à celle-ci, confirmant que l'outil est prêt à être utilisé. Les numéros de version peuvent varier.

tcpdump version 4.99.x
libpcap version 1.10.x
OpenSSL 3.0.x [Date]

Ensuite, vous devez trouver le nom de l'interface réseau que vous allez surveiller. Un ordinateur peut avoir plusieurs interfaces (par exemple, pour Ethernet filaire, Wi-Fi ou réseaux virtuels). Nous utiliserons la commande ip addr pour lister toutes les interfaces réseau disponibles et leurs configurations.

Exécutez cette commande :

ip addr

La sortie listera plusieurs interfaces. Vous recherchez votre interface active principale. Elle est souvent nommée eth0 ou enp0s3. Recherchez une entrée qui possède une adresse inet (votre adresse IP) et qui est à l'état UP.

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:16:3e:01:be:b3 brd ff:ff:ff:ff:ff:ff
    altname enp0s5
    altname ens5
    inet 172.16.50.8/24 metric 100 brd 172.16.50.255 scope global dynamic eth0
       valid_lft 1892159786sec preferred_lft 1892159786sec
    inet6 fe80::216:3eff:fe01:beb3/64 scope link
       valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 02:42:8a:88:cd:da brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever

D'après l'exemple de sortie ci-dessus, le nom de l'interface est eth0. Notez le nom de votre interface spécifique, car vous en aurez besoin à l'étape suivante.

Démarrer une capture large et observer le trafic

Dans cette étape, vous allez commencer à capturer le trafic réseau en direct. L'unité fondamentale de données au niveau de la couche de liaison de données (couche 2) est la trame Ethernet. Chaque trame agit comme une enveloppe numérique, contenant non seulement les données envoyées, mais aussi des informations d'adressage cruciales comme les adresses MAC source et destination. Nous utiliserons tcpdump avec l'option -e pour visualiser spécifiquement ces détails de la couche 2. Cette capture initiale sera sans filtre pour vous donner une idée de toute l'activité sur votre réseau.

Maintenant, lançons le processus de capture. Vous aurez besoin du nom de l'interface que vous avez identifié à l'étape précédente (par exemple, eth0). La capture de paquets réseau nécessite des privilèges administratifs, c'est pourquoi nous utilisons sudo. Nous ajouterons également le drapeau -n pour empêcher tcpdump de résoudre les adresses IP en noms d'hôtes, et -q pour rendre la sortie plus propre.

Dans votre terminal, exécutez la commande tcpdump. N'oubliez pas de remplacer eth0 par le nom réel de votre interface.

## Remplacez eth0 par le nom réel de votre interface de l'étape 1
sudo tcpdump -i eth0 -e -n -q

Analysons cette commande :

  • sudo : Exécute la commande avec les privilèges de superutilisateur, nécessaires pour accéder aux interfaces réseau de cette manière.
  • tcpdump : L'outil de capture de paquets lui-même.
  • -i eth0 : Le drapeau -i spécifie l'interface réseau sur laquelle écouter.
  • -e : Cette option est cruciale pour notre laboratoire. Elle indique à tcpdump d'afficher l'en-tête de niveau liaison (Ethernet) pour chaque paquet, qui inclut les adresses MAC source et destination.
  • -n : Empêche la résolution des noms d'hôtes, affichant les adresses IP brutes.
  • -q : Mode "Quiet" (silencieux), qui réduit la quantité de sortie spécifique au protocole.

Après avoir exécuté la commande, tcpdump commencera à écouter. Vous verrez un message initial, puis votre terminal commencera à afficher tous les paquets qu'il capture. Selon votre réseau, vous pourriez voir beaucoup de trafic qui n'est pas pertinent pour ce que nous voulons faire. Cela pourrait inclure des requêtes ARP, des services en arrière-plan, etc.

tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
10:24:00.123456 ARP, Request who-has 172.16.50.1 tell 172.16.50.254, length 28
10:24:01.567890 IP6 fe80::... > ff02::...: ICMP6, router advertisement, length 80

Laissez cela s'exécuter pendant quelques secondes pour observer l'activité, puis arrêtez la capture en appuyant sur Ctrl+C. Cela démontre la difficulté de trouver des informations spécifiques dans un environnement chargé.

Affiner la capture avec un filtre ICMP

Comme vous l'avez vu à la dernière étape, une capture sans filtre peut être bruyante. Pour nous concentrer sur le trafic spécifique que nous voulons analyser, nous pouvons utiliser un filtre de capture. Étant donné que nous utiliserons la commande ping, qui utilise le protocole ICMP, nous allons indiquer à tcpdump de capturer uniquement les paquets ICMP. Nous ajouterons également le drapeau -n pour empêcher tcpdump de résoudre les adresses IP en noms d'hôtes et -q pour rendre la sortie plus propre. Cela rend la sortie beaucoup plus facile à analyser.

Maintenant, démarrez à nouveau tcpdump, mais cette fois ajoutez le filtre icmp et les nouveaux drapeaux.

## Remplacez eth0 par le nom réel de votre interface de l'étape 1
sudo tcpdump -i eth0 -e -n -q 'icmp'

La partie 'icmp' de la commande est le filtre. Elle indique à tcpdump d'ignorer tous les paquets sauf ceux utilisant le protocole ICMP.

Après avoir exécuté cette commande, tcpdump écoutera à nouveau, mais le terminal devrait maintenant être silencieux, car il attend spécifiquement le trafic ICMP.

tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes

Important : Laissez ce terminal en cours d'exécution ! tcpdump doit rester actif pour capturer le trafic que nous allons générer à l'étape suivante. Vous devrez ouvrir un nouvel onglet ou une nouvelle fenêtre de terminal pour les commandes suivantes. Vous pouvez le faire en cliquant sur l'icône + dans le panneau du terminal.

Générer du trafic unicast avec 'ping' et analyser les en-têtes de trame

Dans cette étape, vous allez générer et observer du trafic unicast. L'unicast est une méthode de communication un à un où une trame est envoyée d'une source unique à une destination unique sur le réseau. Pour ce faire, vous utiliserez l'utilitaire courant ping, qui envoie des paquets ICMP (Internet Control Message Protocol) à un hôte cible pour vérifier la connectivité. Ces paquets sont encapsulés dans des trames Ethernet pour la transmission.

Avec tcpdump (avec le filtre icmp) toujours en cours d'exécution dans votre premier terminal, vous devez générer une activité réseau.

Ouvrez un nouveau terminal en cliquant sur l'icône + dans le panneau du terminal. Dans ce nouveau terminal, utilisez la commande ping pour envoyer quelques paquets à google.com. Nous utiliserons l'option -c 4 pour envoyer automatiquement exactement quatre paquets, puis nous arrêterons.

ping -c 4 google.com

Vous verrez une sortie dans votre second terminal similaire à celle-ci, montrant les réponses du serveur de Google :

PING google.com (142.250.191.174) 56(84) bytes of data.
64 bytes from fra16s51-in-f14.1e100.net (142.250.191.174): icmp_seq=1 ttl=115 time=1.58 ms
64 bytes from fra16s51-in-f14.1e100.net (142.250.191.174): icmp_seq=2 ttl=115 time=1.55 ms
64 bytes from fra16s51-in-f14.1e100.net (142.250.191.174): icmp_seq=3 ttl=115 time=1.62 ms
64 bytes from fra16s51-in-f14.1e100.net (142.250.191.174): icmp_seq=4 ttl=115 time=1.51 ms

--- google.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3005ms
rtt min/avg/max/mdev = 1.510/1.565/1.621/0.040 ms

Maintenant, revenez à votre premier terminaltcpdump est en cours d'exécution. Vous verrez plusieurs nouvelles lignes de sortie qui ont été capturées pendant que vous faisiez le ping.

Analysons l'un des paquets "echo request" sortants. Il ressemblera à ceci (les adresses MAC et IP différeront sur votre système) :

10:25:01.123456 00:16:3e:01:be:b3 > de:ad:be:ef:00:01, ethertype IPv4 (0x0800), length 98: 172.16.50.8 > 142.250.191.174: ICMP echo request, id 123, seq 1, length 64

Voici ce que signifie cette ligne :

  • 10:25:01.123456 : L'horodatage du moment où la trame a été capturée.
  • 00:16:3e:01:be:b3 : L'adresse MAC source (l'adresse MAC de votre VM).
  • > : Un séparateur indiquant la direction du trafic (de la source à la destination).
  • de:ad:be:ef:00:01 : L'adresse MAC destination. Notez qu'il s'agit probablement de la passerelle (routeur) de votre réseau local, et non du serveur de Google. Votre VM envoie la trame à la passerelle, qui la transmet ensuite vers Internet.
  • ethertype IPv4 : Ce champ indique que la charge utile de la trame Ethernet est un paquet IPv4.
  • 172.16.50.8 > 142.250.191.174 : Il s'agit des informations de la couche 3 (IP), montrant les adresses IP source et destination.
  • ICMP echo request : Ceci identifie le paquet comme faisant partie d'une requête ping.

Vous verrez également les trames correspondantes "echo reply" revenir. Notez comment les adresses MAC source et destination sont inversées.

Enfin, retournez au terminal tcpdump et appuyez sur Ctrl+C pour arrêter la capture.

Générer du trafic de diffusion via ARP et identifier l'adresse MAC de diffusion

Dans cette étape, vous allez contraster le trafic unicast avec le trafic broadcast. Alors que l'unicast est un message un à un, le broadcast est un message un à tous, envoyé à chaque appareil sur le segment de réseau local. Un exemple principal en est le Address Resolution Protocol (ARP), qui est utilisé pour découvrir l'adresse MAC associée à une adresse IP spécifique. Pour ce faire, un appareil envoie une trame broadcast demandant : "Qui a cette adresse IP ?"

Tout d'abord, lançons une nouvelle capture tcpdump. Cette fois, nous ajouterons un filtre pour ne nous montrer que les paquets ARP. Nous utiliserons également le drapeau -n pour empêcher tcpdump de résoudre les adresses IP en noms d'hôtes, et -q pour rendre la sortie plus propre.

Dans un terminal, exécutez la commande suivante, en vous souvenant de remplacer eth0 par le nom de votre interface de l'étape 1.

## Remplacez eth0 par le nom réel de votre interface
sudo tcpdump -i eth0 -e -n -q 'arp'

tcpdump écoute maintenant, mais uniquement le trafic ARP.

Ensuite, nous devons déclencher une requête ARP. Une méthode fiable pour ce faire est de vider le cache ARP de votre système, puis d'essayer de contacter un autre appareil sur le réseau local, comme votre routeur passerelle. Vider le cache force votre système à redécouvrir l'adresse MAC de la passerelle en utilisant ARP.

Ouvrez un nouveau terminal. Tout d'abord, trouvez l'adresse IP de votre passerelle avec la commande ip route.

ip route | grep default

La sortie affichera votre route par défaut, et l'adresse IP indiquée après "via" est votre passerelle.

default via 172.16.50.1 dev eth0

Note : Votre adresse IP de passerelle sera probablement différente. Il est essentiel d'utiliser l'adresse IP de cette commande dans les étapes suivantes. Une erreur courante est d'utiliser une adresse IP différente comme 172.17.0.1, qui est souvent la passerelle d'un réseau Docker local et ne produira pas le résultat correct pour cet exercice.

Dans cet exemple, la passerelle est 172.16.50.1. Maintenant, videz votre cache ARP en utilisant la commande ip neigh flush. Cela supprimera les mappages d'adresses MAC connus, forçant votre système à utiliser ARP pour les retrouver.

sudo ip -s -s neigh flush dev eth0

Vous pourriez voir une sortie confirmant que des entrées ont été supprimées. Enfin, faites un ping de la passerelle une seule fois pour déclencher la recherche ARP.

## Remplacez 172.16.50.1 par l'adresse IP réelle de votre passerelle
ping -c 1 172.16.50.1

Maintenant, revenez à votre premier terminaltcpdump est en cours d'exécution. Vous verrez le trafic ARP qui a été généré. Recherchez la ligne "Request" :

10:30:01.123456 00:16:3e:01:be:b3 > ff:ff:ff:ff:ff:ff, ethertype ARP (0x0806), length 42: ARP, Request who-has 172.16.50.1 tell 172.16.50.8, length 28

Analysons cette trame broadcast :

  • 00:16:3e:01:be:b3 : L'adresse MAC source (votre VM).
  • ff:ff:ff:ff:ff:ff : C'est l'adresse MAC broadcast spéciale. Lorsqu'un commutateur voit une trame avec cette adresse de destination, il la transmet par tous ses ports à chaque appareil connecté.
  • ethertype ARP : Ceci indique que la charge utile de la trame est un paquet ARP.
  • ARP, Request who-has 172.16.50.1 tell 172.16.50.8 : C'est le message ARP lui-même, une question broadcast à tout le réseau demandant l'adresse MAC de 172.16.50.1.

Vous verrez également le paquet "Reply", qui est une trame unicast renvoyée directement de la passerelle à l'adresse MAC de votre VM.

Vous pouvez maintenant arrêter la capture tcpdump en appuyant sur Ctrl+C dans son terminal.

Résumé

Dans ce laboratoire, vous avez appris le processus fondamental d'analyse des trames Ethernet à l'aide de tcpdump dans un environnement Linux. Vous avez commencé par préparer votre système, ce qui a impliqué l'installation de l'utilitaire tcpdump avec le gestionnaire de paquets apt et l'identification de votre interface réseau principale à l'aide de la commande ip addr. Vous avez ensuite appris à initier une capture de paquets, d'abord en exécutant une capture non filtrée pour observer tout le trafic réseau et apprécier la nécessité du filtrage. Après avoir arrêté la capture initiale, vous avez appris à appliquer un filtre icmp avec sudo tcpdump -i eth0 -e -n -q 'icmp' pour vous concentrer spécifiquement sur le trafic que vous souhaitiez analyser.

Le laboratoire vous a ensuite guidé dans la génération et l'analyse de deux types principaux de trafic réseau. Vous avez utilisé la commande ping pour créer du trafic unicast et examiné la sortie filtrée de tcpdump pour identifier les adresses MAC source et destination spécifiques dans les en-têtes des trames Ethernet. Par la suite, vous avez généré du trafic broadcast en initiant une requête ARP avec une capture séparée, filtrée sur arp, et appris à reconnaître l'adresse MAC broadcast distincte, ff:ff:ff:ff:ff:ff, qui signifie une trame destinée à tous les appareils du segment de réseau local.