9.2 KiB
title | date | author | template | tags | comments |
---|---|---|---|---|---|
Sniffer le réseau sous GNU/Linux 1 | 2015-11-14 | motius | post | dompter sa machine,internet,linux,planet libre,réseau,tcp/ip,tcpdump,tutoriels,wireshark | true |
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 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 :
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 :
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 !
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.