Sniffer le réseau sous GNU/Linux 1

Bonjour à tous !

Aujourd'hui on va détailler une pratique très courante pour le débug réseau, la compréhension de la pile TCP/IP et les mécanismes d'organisation des machines sur le réseau IP, ainsi que pour les interceptions et écoutes du trafic sur internet : le sniffage.

Le sniffage, qu'est-ce que c'est ?

Sniffer le réseau

Eh bien c'est une pratique très simple qui consiste à faire une capture et une copie des paquets et autres trames qu'on voit passer. Évidemment, c'est très différent si vous faites ça chez vous ou bien si c'est un fournisseur d'accès internet (FAI) qui fait ça sur un routeur de collecte. Donc restez dans la légalité (et n'oubliez pas d'être gentils ;)) : exercez-vous sur votre propre réseau local ! Ça fait moins de paquets --- quoique toujours pas mal --- et aussi moins d'ennuis.

C'est ce qu'on va faire dans la suite.

Quels logiciels ?

Eh bien il y a un super logiciel libre (en GPLv2 pour la majorité des sources) qui fait tout ça très bien : il s'agit de Wireshark. Si vous êtes sous Debian/Ubuntu, vous pouvez l'installer à l'aide de la commande :

sudo apt install wireshark tcpdump

ou

sudo apt-get install wireshark tcpdump

si votre Debian/Ubuntu n'est pas récente. Sur une distribution type CentOS/Fedora/Red Hat il faut utiliser yum. Vous pouvez aussi récupérer les sources et les recompiler.

Je vous ai aussi fait installer tcpdump. Il aurait été installé quand même par résolution de dépendances, mais je tenais à le marquer pour que vous sachiez que c'est tcpdump qui va effectuer la capture, tandis que Wireshark sert d'interface pour visualiser les paquets.

Lorsque vous le lancez, il ressemble à peu près à ça :

wireshark_dark

Wireshark thème dark sous Debian GNU/Linux 8, machine de test

Notez que les utilisateurs de Microsoft© Windows® peuvent aussi utiliser Wireshark, mais une partie de ce qui suit est pour les linuxiens.

Comment faire ?

Pour utiliser Wireshark il faut naturellement pouvoir capturer les paquets qui passent sur le réseau, et malheureusement, il s'agit d'un privilège réservé à root. Maintenant, vous pourriez lancer wireshark en tant que root, et l'utiliser tel quel, mais même si c'est à peu près ce que les utilisateurs font sous Windows (je ne connais pas le détail des droits et privilèges mis en œuvre), Wireshark gronde un peu sous GNU/Linux si vous faites ça. Je vous propose donc une autre méthode pour contourner ce problème.

Les capacité du kernel

Là on va aller à la limite de ma connaissance du noyau linux (aussi appelé kernel, les mathématiciens n'auront pas de problème à utiliser les deux termes) avec la notion de capacité.

Normalement vous avez installé les commandes getcap et setcap que root peut utiliser. Elles se trouvent dans le paquet libpcap2-bin, comme en témoigne la commande :

dpkg -S getcap

qui permet de chercher dans quel paquet se trouve la commande getcap.

Donc les commandes getcap et setcap permettent respectivement de voir et modifier les capacités d'un binaire sur le noyau linux. Il faut donc faire attention à ce que vous faites, mais il n'y aura aucun problème puisque les opérations sont réversibles, et que je mettrai un petit script exécutable par root pour gérer tout ça automatiquement.

GetCap, SetCap

Je suppose que vous êtes devenu root, soit avec la commande su, si vous connaissez la phrase de passe root, soit avec sudo su et votre phrase de passe, si vous êtes un sudoer. Voilà les fameuses commandes tant attendues :

getcap /usr/sbin/tcpdump

permet de voir les capacités du binaire tcpdump qui est dans /usr/sbin/.

Le binaire tcpdump a besoin des capacités suivantes pour fonctionner en utilisateur simple :

setcap cap_net_admin,cap_net_raw+eip /usr/sbin/tcpdump

Voilà, le binaire a les bonnes capacités.

Pour deux types de capacités :

  • cap_net_admin
  • cap_net_raw

on a donné les attributs suivants :

  • e : effective
  • p : permitted
  • i : inheritable

Si vous avez fait une bêtise, la commande setcap -r <binaire> permet de retirer les capacités attribuées.

Mais attention ! Ce n'est pas tout !

Droits UNIX

Le binaire tcpdump est dans /usr/sbin et c'est normal, puisqu'il ne devrait être exécuté que par root par défaut. On va donc faire en sorte d'avoir une configuration optimale.

Pour pouvoir lancer le binaire, il faut pouvoir l'exécuter. tcpdump appartient à root:root, et a les droits UNIX suivants : -rwxr-xr-x ce qui veut dire que n'importe qui peut faire de la capture réseau ! Eh oui, il est exécutable par o=other. Changeons ça immédiatement à l'aide de la commande :

chmod 754 /usr/sbin/tcpdump

Donc root peut lire-écrire-exécuter le binaire, les personnes dans le groupe root peuvent lire-exécuter le binaire, et les autres peuvent seulement le lire.

Personnellement, je n'aime pas mettre des gens dans le groupe root, donc on va en créer un autre, qu'on va appeler wireshark :

addgroup wireshark

Supposons que l'utilisateur qui va utiliser Wireshark/tcpdump ait le login UNIX toto. La commande

usermod -aG wireshark toto

permet de mettre toto dans le groupe wireshark et

chown root:wireshark /usr/sbin/tcpdump

pour mettre tcpdump dans le groupe wireshark.

Le PATH et /usr/sbin

Maintenant seul les membres du groupe wireshark (dont toto), et root peuvent utiliser le binaire tcpdump.

Le problème c'est que l'exécutable tcpdump est dans /usr/sbin, qui n'est pas dans le PATH de l'utilisateur toto. Il y a donc deux options, une mauvase et une bonne. La mauvaise, c'est de rajouter /usr/sbin au PATH de toto. La bonne, c'est de faire un lien symbolique de l'exécutable tcpdump vers /usr/local/bin à l'aide de la commande :

ln -s /usr/sbin/tcpdump /usr/local/bin/

Ça n'est pas un problème en terme de sécurité puisqu'on s'est assurés que seuls les membres du groupe wireshark pouvaient exécuter tcpdump. Ça y est. toto peut utiliser tcpdump. À partir de maintenant, les commmandes ne sont plus exécutées en tant que root. Vous pouvez soit faire une capture simple que vous lisez avec un éditeur de texte (pas un traitement de texte !), l'avantage, c'est de pouvoir travailler sur des fichiers distants, l'inconvénient, c'est que vous ne pourrez pas utiliser Wireshark pour les visualiser. Utiliser la commande :

tcpdump -i wlan0

si wlan0 est l'interface sur laquelle vous voulez capturer des paquets. Il s'agit chez moi de mon interface Wi-Fi. L'interface ethernet s'appelle souvent eth0. Utiliser Contrôle-C pour arrêter la capture. vous pouvez rediriger ça vers un ficher ainsi :

tcpdump -i lo > ./mes_paquets_captures

(interface loopback, ici). Sinon utilisez la commande :

tcpdump -i eth0 -w ./mes_paquets_capturés

pour capturer les paquets dans un format lisible pour Wireshark. Lancer Contrôle-C pour arrêter la capture.

Vos captures devraient ressembler à ceci :

tcpdump

Capture réseau avec tcpdump, machine de test.

Puis il vous suffit de lancer Wireshark, et d'ouvrir le fichier de capture (raccourci Contrôle-O).

Enfin les paquets vus avec Wireshark ressemblent à ça :

wireshark

Paquets capturés avec tcpdump, puis chargés sous Wireshark. machine de test.

Le script !

Alors. Puisque vous avez été sages, je veux bien. Mais c'est vraiment pas grand chose. Je le mets là parce que j'ai ça dans mon /root/ pour rapidement permettre la capture puis la retirer :

Le script pour permettre la capture : enable_tcpdump.sh

#!/bin/bash
/sbin/setcap cap_net_admin,cap_net_raw+eip /usr/sbin/tcpdump

Le script pour l'empêcher : disable_tcpdump.sh

#!/bin/bash
/sbin/setcap -r /usr/sbin/tcpdump

Le script qui paramètre tout pour vous (à ne lancer qu'une fois, en tant que root) : setup_tcpdump.sh

#!/bin/bash
/usr/sbin/adduser toto
/usr/sbin/addgroup wireshark
/usr/sbin/usermod -aG wireshark toto
/bin/chmod 754 /usr/sbin/tcpdump
/bin/ln -s /usr/sbin/tcpdump /usr/local/bin/
/bin/chown root:wireshark /usr/sbin/tcpdump

Voilà. L'utilisateur toto (ou autre, si vous avez changé le script) peut facilement intercepter le trafic sur le réseau, à l'aide des deux scripts setup_tcpdump.sh et enable_tcpdump.sh.

Je ferai peut-être une suite où l'on étudiera plus avant les fonctionnalités de Wireshark plutôt que la seule mise en place de l'écoute réseau, en attendant bonne écoute !

NSA_PR

Touitte de NSA_PR, 22 juillet 2014 ;)

Sur ce petit troll de la NSA, je vous quitte !

Motius

PS : pour réaliser ce tuto, je me suis inspiré de cette page de la doc. Je vous recommande d'aller voir la doc pour résoudre d'éventuels problèmes, et comprendre les valeurs affichées par Wireshark.