Filtres de paquets Berkeley (BPF)

WiresharkBeginner
Pratiquer maintenant

Introduction

Bienvenue dans ce laboratoire sur les filtres de paquets Berkeley (BPF) !

Imaginez que vous essayiez de trouver une conversation spécifique dans un stade bondé et bruyant. C'est exactement ce que l'on ressent lors de l'analyse du trafic réseau brut. Un serveur très sollicité peut traiter des milliers de paquets chaque seconde. Pour trouver les données précises dont vous avez besoin, il vous faut un tamis extrêmement fin.

C'est là qu'interviennent les filtres de paquets Berkeley (BPF). BPF est une technologie profondément intégrée et hautement efficace qui vous permet de définir des règles — tel un filet de pêche spécialisé — pour ne capturer que le trafic réseau qui vous intéresse, tout en laissant le reste passer inaperçu.

L'idée fondamentale est que le filtrage n'est pas qu'une simple question de confort. Il s'agit de réduire le bruit avant qu'il ne devienne un problème. Sans filtres, l'analyse de paquets se transforme rapidement en une surcharge d'informations. Avec des filtres, vous pouvez transformer un flux massif et chaotique en une question ciblée, telle que « montre-moi le trafic provenant de cet hôte » ou « montre-moi uniquement les requêtes web vers ce port ». Cette capacité est l'une des raisons principales pour lesquelles tcpdump reste un outil indispensable, même dans les environnements de production à grande échelle.

Dans ce laboratoire, vous utiliserez tcpdump pour vous entraîner à rédiger ces règles BPF. Vous apprendrez à filtrer le flux réseau chaotique par adresses IP spécifiques, à contrôler la direction du trafic (émission vs réception) et à cibler des ports d'application précis. À la fin, vous saurez comment combiner ces règles pour extraire chirurgicalement les événements exacts dont vous avez besoin.

Filtrer par adresse IP (Hôte/Réseau)

La manière la plus élémentaire de filtrer le trafic consiste à se concentrer sur une machine spécifique, identifiée par son adresse IP. Lorsque vous exécutez tcpdump sans aucun filtre, il capture inlassablement chaque paquet qu'il voit. Pour lui demander d'ignorer tout ce qui ne concerne pas une machine particulière, vous utilisez le mot-clé host suivi de l'adresse IP.

C'est le moment idéal pour distinguer deux concepts que les débutants confondent souvent : une interface est l'endroit où vous écoutez, tandis qu'un filtre IP décrit quelles conversations vous souhaitez extraire de ce point d'écoute. En d'autres termes, -i lo définit où votre microphone est placé, et host 127.0.0.1 définit quel interlocuteur dans la pièce vous intéresse.

Pour nous assurer d'avoir du trafic à observer, un script d'arrière-plan est déjà en cours d'exécution dans votre environnement. Il envoie continuellement des données à votre machine locale, qui possède toujours l'adresse IP interne 127.0.0.1 (également connue sous le nom de localhost).

Capturons 5 paquets impliquant cet hôte local. Nous utiliserons -i lo pour écouter sur l'interface de bouclage (loopback) locale et -c 5 pour arrêter automatiquement la capture.

Exécutez la commande suivante dans votre terminal :

sudo tcpdump -i lo -c 5 host 127.0.0.1

Votre écran affichera un résultat similaire à celui-ci :

tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on lo, link-type EN10MB (Ethernet), snapshot length 262144 bytes
10:15:32.123456 IP localhost.45678 > localhost.http-alt: Flags [S], seq 123456789, win 65495, options [mss 65495,sackOK,TS val 123456 ecr 0,nop,wscale 7], length 0
10:15:32.123489 IP localhost.http-alt > localhost.45678: Flags [S.], seq 987654321, ack 123456790, win 65483, options [mss 65495,sackOK,TS val 123456 ecr 123456,nop,wscale 7], length 0
10:15:32.124000 IP localhost > localhost: ICMP echo request, id 1234, seq 1, length 64
...
5 packets captured

Notez que dans chaque paquet listé, localhost (qui est le nom convivial pour 127.0.0.1) est présent. Le filtre host est très inclusif : il capture le paquet, que l'adresse IP spécifiée ait envoyé les données ou les ait reçues.

Si vous avez besoin de surveiller tout un voisinage d'ordinateurs plutôt qu'une seule maison, vous pouvez remplacer le mot-clé host par net (par exemple, net 192.168.1.0/24). Pour l'instant, nous nous contenterons d'explorer notre hôte unique.

Filtrer par direction (Source/Destination)

Savoir qu'un ordinateur spécifique est impliqué dans une conversation est utile, mais parfois, vous avez besoin de plus de précision. Imaginez un bureau de poste : vous pourriez vouloir examiner uniquement les lettres qu'une personne envoie, en ignorant totalement celles qu'elle reçoit.

La direction est importante car le trafic émis et reçu répond souvent à des questions d'enquête différentes. Le trafic sortant peut révéler ce qu'un hôte tente de contacter, ce qui est utile pour traquer les rappels de logiciels malveillants ou l'exfiltration de données. Le trafic entrant peut révéler quels services sont ciblés, ce qui est utile lors de l'enquête sur des scans ou des attaques contre un serveur.

BPF vous offre les modificateurs src (source) et dst (destination) pour dicter la direction exacte du trafic.

Affinons notre filtre pour ne capturer que les paquets provenant de 127.0.0.1. En combinant le modificateur src avec notre mot-clé host précédent, nous indiquons précisément à tcpdump ce qu'il doit rechercher.

Exécutez la commande suivante :

sudo tcpdump -i lo -c 3 src host 127.0.0.1

Une petite astuce : écrire src 127.0.0.1 fonctionne également car le mot host est implicite, mais l'écrire explicitement sous la forme src host est considéré comme une bonne pratique, car cela rend votre commande incroyablement facile à lire.

Votre résultat ressemblera à ceci :

tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on lo, link-type EN10MB (Ethernet), snapshot length 262144 bytes
10:20:15.555111 IP localhost.54321 > localhost.http-alt: Flags [P.], seq 1:85, ack 1, win 512, options [nop,nop,TS val 234567 ecr 234567], length 84
10:20:15.555888 IP localhost.http-alt > localhost.54321: Flags [.], ack 85, win 512, options [nop,nop,TS val 234568 ecr 234567], length 0
10:20:16.111222 IP localhost > localhost: ICMP echo request, id 5678, seq 1, length 64
3 packets captured

Si vous regardez attentivement le résultat, la première partie de la description du paquet (la section avant le symbole >) représente l'expéditeur (source). Comme nous capturons sur l'interface de bouclage interne, les deux côtés indiquent localhost, mais dans un scénario réel impliquant plusieurs ordinateurs, src garantit que vous ne visualisez que le trafic sortant de cette adresse spécifique.

Inversement, si vous vouliez agir en tant que récepteur et ne surveiller que le trafic entrant arrivant sur la machine, vous utiliseriez simplement dst host 127.0.0.1.

Filtrer par port et protocole

Le filtrage par adresses IP nous permet d'atteindre la bonne machine, mais les serveurs modernes effectuent énormément de tâches simultanées. Un seul serveur peut agir simultanément comme serveur web, serveur de messagerie et point d'accès sécurisé. Ces différents services sont maintenus séparés en utilisant des « portes » numérotées appelées ports.

Les ports ne sont pas des prises physiques. Ce sont des numéros logiques utilisés par le système d'exploitation pour garder de nombreuses conversations séparées en même temps. C'est pourquoi « même hôte » ne signifie pas nécessairement « même application ». Une machine peut être impliquée dans de nombreuses activités réseau sans rapport, et le filtrage par port vous aide à isoler le service exact que vous souhaitez étudier.

Par exemple, le trafic web classique transite presque toujours par le port 80. Pour zoomer sur un service spécifique et ignorer le reste, nous utilisons le mot-clé port.

Notre script d'arrière-plan génère discrètement du trafic web sur le port 8080. Configurons tcpdump pour ne capturer que les données passant par cette porte spécifique.

Exécutez la commande suivante :

sudo tcpdump -i lo -c 4 port 8080

Exemple de résultat :

tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on lo, link-type EN10MB (Ethernet), snapshot length 262144 bytes
10:25:10.123456 IP localhost.34567 > localhost.http-alt: Flags [S], seq 1122334455, win 65495, options [mss 65495,sackOK,TS val 345678 ecr 0,nop,wscale 7], length 0
10:25:10.123489 IP localhost.34567 > localhost.34567: Flags [S.], seq 5544332211, ack 1122334456, win 65483, options [mss 65495,sackOK,TS val 345678 ecr 345678,nop,wscale 7], length 0
10:25:10.123501 IP localhost.34567 > localhost.http-alt: Flags [.], ack 1, win 512, options [nop,nop,TS val 345678 ecr 345678], length 0
10:25:10.124111 IP localhost.34567 > localhost.http-alt: Flags [P.], seq 1:85, ack 1, win 512, options [nop,nop,TS val 345679 ecr 345678], length 84
4 packets captured

Vous vous souvenez peut-être des étapes précédentes qu'il y avait des paquets ICMP (ping) qui circulaient. Cependant, dans ce résultat, il n'y a absolument aucune trace d'eux. Le filtre port 8080 a réussi à ignorer tout le bavardage non pertinent, offrant une vue claire du service web uniquement.

En plus des ports, vous pouvez également filtrer par protocole réseau global en le nommant simplement, en utilisant des mots-clés comme tcp, udp ou icmp. Testons cela en capturant uniquement les paquets ICMP (ping), ignorant ainsi le trafic web chargé.

Exécutez cette commande :

sudo tcpdump -i lo -c 2 icmp

Exemple de résultat :

tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on lo, link-type EN10MB (Ethernet), snapshot length 262144 bytes
10:28:05.999111 IP localhost > localhost: ICMP echo request, id 9012, seq 1, length 64
10:28:05.999133 IP localhost > localhost: ICMP echo reply, id 9012, seq 1, length 64
2 packets captured

L'utilisation des mots-clés port et de protocole vous permet de trancher à travers le bruit et de vous concentrer exactement sur l'application que vous essayez d'étudier.

Combiner les filtres avec la logique (AND/OR)

Pour vraiment maîtriser les filtres de paquets Berkeley, nous devons apprendre à combiner plusieurs règles. Les enquêtes réelles sont rarement simples ; vous devez souvent définir des scénarios très spécifiques.

C'est là que BPF commence à ressembler moins à une liste de mots-clés et plus à un petit langage de requête pour les paquets. Vous décrivez le trafic que vous souhaitez de manière structurée et logique. Plus tard dans ce cours, cette façon de penser réapparaîtra dans de nombreux outils : les recherches SIEM, les règles de détection d'intrusion et même les requêtes de journaux de type base de données reposent toutes sur la même habitude de réduire un vaste ensemble de données à une condition précise.

BPF vous permet de lier des conditions entre elles à l'aide d'opérateurs logiques standards :

  • and (les deux règles doivent être vraies)
  • or (au moins une règle doit être vraie)
  • not (la règle doit explicitement être fausse)

Un conseil important : lorsque vous utilisez de tels opérateurs logiques dans le terminal Linux, il est très recommandé d'entourer toute votre expression BPF de guillemets (comme "port 80 and tcp"). Cela garantit que le shell Linux ne confond pas accidentellement vos commandes de filtrage avec des commandes système.

Testons cela. Nous voulons capturer le trafic qui utilise strictement le protocole TCP et qui est activement dirigé vers le port de destination 8080.

Exécutez la commande suivante :

sudo tcpdump -i lo -c 4 "tcp and dst port 8080"

Exemple de résultat :

tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on lo, link-type EN10MB (Ethernet), snapshot length 262144 bytes
10:32:15.111222 IP localhost.45678 > localhost.http-alt: Flags [S], seq 2233445566, win 65495, options [mss 65495,sackOK,TS val 456789 ecr 0,nop,wscale 7], length 0
10:32:15.111255 IP localhost.45678 > localhost.http-alt: Flags [.], ack 3344556678, win 512, options [nop,nop,TS val 456789 ecr 456789], length 0
...
4 packets captured

Dans ce résultat sur mesure, localhost.http-alt n'apparaît que du côté droit de la flèche >, prouvant que nous n'avons capturé que les paquets destinés à ce port exact.

Enfin, examinons l'opérateur not. Il est incroyablement utile pour filtrer le « bruit connu » afin que vous puissiez vous concentrer sur l'inconnu. Imaginez que nous voulions surveiller tout le trafic sur l'interface de bouclage, à l'exception de notre trafic web bruyant sur le port 8080.

Exécutez cette commande :

sudo tcpdump -i lo -c 2 "not port 8080"

Exemple de résultat :

tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on lo, link-type EN10MB (Ethernet), snapshot length 262144 bytes
10:35:22.333444 IP localhost > localhost: ICMP echo request, id 3456, seq 1, length 64
10:35:22.333466 IP localhost > localhost: ICMP echo reply, id 3456, seq 1, length 64
2 packets captured

Parce que nous avons explicitement dit à tcpdump de bannir le port 8080 des résultats, il a paisiblement capturé les paquets ping ICMP d'arrière-plan à la place. En enchaînant stratégiquement and, or et not, vous pouvez forger une lentille incroyablement précise pour voir exactement ce dont vous avez besoin sur n'importe quel réseau.

Résumé

Félicitations ! Vous avez fait vos premiers pas dans le monde du filtrage de paquets avancé.

Vous avez appris à passer au crible un flux réseau chaotique pour trouver exactement ce dont vous avez besoin. Vous vous êtes exercé à cibler des ordinateurs spécifiques à l'aide du mot-clé host et à contrôler la direction du flux avec src et dst. Vous avez isolé des applications particulières en filtrant par port et par protocole. Plus important encore, vous avez appris à combiner tous ces éléments individuels à l'aide d'opérateurs logiques (and, or, not) pour construire des recherches chirurgicales et hautement spécifiques.

Ces compétences sont indispensables. Que vous soyez un administrateur système traquant une connexion suspecte ou un analyste en sécurité suivant une attaque sophistiquée, la maîtrise des filtres de paquets Berkeley vous garantit de ne plus jamais être submergé par le bruit du réseau. Continuez à expérimenter avec différentes combinaisons !