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](http://wireshark.org). Si vous êtes sous Debian/Ubuntu, vous pouvez l'installer à l'aide de la commande :
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 :
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 :
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 :
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 :
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` :
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 :
Ç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 :
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 :
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 :
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 !
PS : pour réaliser ce tuto, je me suis inspiré de [cette page](https://wiki.wireshark.org/CaptureSetup/CapturePrivileges) de la doc. Je vous recommande d'aller voir [la doc](https://www.wireshark.org/docs/) pour résoudre d'éventuels problèmes, et comprendre les valeurs affichées par Wireshark.