htg-content/content/posts/sniffer-le-reseau-sous-gnu-...

218 lines
9.2 KiB
Markdown
Raw Normal View History

2020-04-30 23:07:15 +02:00
---
2020-12-02 16:36:09 +01:00
title: "Sniffer le réseau sous GNU/Linux 1"
2020-05-11 16:47:51 +02:00
date: 2015-11-14
2020-04-30 23:07:15 +02:00
author: motius
template: post
2020-05-12 16:08:52 +02:00
tags: dompter sa machine,internet,linux,planet libre,réseau,tcp/ip,tcpdump,tutoriels,wireshark
2020-12-21 14:17:57 +01:00
comments: true
2020-04-30 23:07:15 +02:00
---
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](http://wireshark.org). Si vous êtes sous Debian/Ubuntu, vous pouvez l'installer à l'aide de la commande :
2020-05-05 23:23:26 +02:00
```
2020-04-30 23:07:15 +02:00
sudo apt install wireshark tcpdump
2020-05-05 23:23:26 +02:00
```
2020-04-30 23:07:15 +02:00
ou
2020-05-05 23:23:26 +02:00
```
2020-04-30 23:07:15 +02:00
sudo apt-get install wireshark tcpdump
2020-05-05 23:23:26 +02:00
```
2020-04-30 23:07:15 +02:00
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 :
2020-05-05 23:23:26 +02:00
![wireshark_dark](%assets_url%/2015/11/wireshark_d-1024x711.png)
Wireshark thème dark sous Debian GNU/Linux 8, machine de test
2020-04-30 23:07:15 +02:00
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 :
2020-05-05 23:23:26 +02:00
```
2020-04-30 23:07:15 +02:00
dpkg -S getcap
2020-05-05 23:23:26 +02:00
```
2020-04-30 23:07:15 +02:00
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 :
2020-05-05 23:23:26 +02:00
```
2020-04-30 23:07:15 +02:00
getcap /usr/sbin/tcpdump
2020-05-05 23:23:26 +02:00
```
2020-04-30 23:07:15 +02:00
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 :
2020-05-05 23:23:26 +02:00
```
setcap cap_net_admin,cap_net_raw+eip /usr/sbin/tcpdump
```
2020-04-30 23:07:15 +02:00
Voilà, le binaire a les bonnes capacités.
Pour deux types de capacités :
2020-05-05 23:23:26 +02:00
- cap_net_admin
- cap_net_raw
2020-04-30 23:07:15 +02:00
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 :
2020-05-05 23:23:26 +02:00
```
2020-04-30 23:07:15 +02:00
chmod 754 /usr/sbin/tcpdump
2020-05-05 23:23:26 +02:00
```
2020-04-30 23:07:15 +02:00
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` :
2020-05-05 23:23:26 +02:00
```
2020-04-30 23:07:15 +02:00
addgroup wireshark
2020-05-05 23:23:26 +02:00
```
2020-04-30 23:07:15 +02:00
Supposons que l'utilisateur qui va utiliser Wireshark/`tcpdump` ait le login UNIX `toto`. La commande
2020-05-05 23:23:26 +02:00
```
2020-04-30 23:07:15 +02:00
usermod -aG wireshark toto
2020-05-05 23:23:26 +02:00
```
2020-04-30 23:07:15 +02:00
permet de mettre `toto` dans le groupe `wireshark` et
2020-05-05 23:23:26 +02:00
```
2020-04-30 23:07:15 +02:00
chown root:wireshark /usr/sbin/tcpdump
2020-05-05 23:23:26 +02:00
```
2020-04-30 23:07:15 +02:00
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 :
2020-05-05 23:23:26 +02:00
```
2020-04-30 23:07:15 +02:00
ln -s /usr/sbin/tcpdump /usr/local/bin/
2020-05-05 23:23:26 +02:00
```
2020-04-30 23:07:15 +02:00
Ç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 :
2020-05-05 23:23:26 +02:00
```
2020-04-30 23:07:15 +02:00
tcpdump -i wlan0
2020-05-05 23:23:26 +02:00
```
2020-04-30 23:07:15 +02:00
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 :
2020-05-05 23:23:26 +02:00
```
tcpdump -i lo > ./mes_paquets_captures
```
2020-04-30 23:07:15 +02:00
(interface loopback, ici). Sinon utilisez la commande :
2020-05-05 23:23:26 +02:00
```
tcpdump -i eth0 -w ./mes_paquets_capturés
```
2020-04-30 23:07:15 +02:00
pour capturer les paquets dans un format lisible pour Wireshark. Lancer **Contrôle-C** pour arrêter la capture.
Vos captures devraient ressembler à ceci :
2020-05-05 23:23:26 +02:00
![tcpdump](%assets_url%/2015/11/tcpdump.png)
Capture réseau avec tcpdump, machine de test.
2020-04-30 23:07:15 +02:00
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 :
2020-05-05 23:23:26 +02:00
![wireshark](%assets_url%/2015/11/wireshark-1024x742.png)
Paquets capturés avec tcpdump, puis chargés sous Wireshark. machine de test.
2020-04-30 23:07:15 +02:00
# 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 :
2020-05-05 23:23:26 +02:00
Le script pour permettre la capture : `enable_tcpdump.sh`
2020-04-30 23:07:15 +02:00
2020-05-05 23:23:26 +02:00
```
2020-04-30 23:07:15 +02:00
#!/bin/bash
2020-05-05 23:23:26 +02:00
/sbin/setcap cap_net_admin,cap_net_raw+eip /usr/sbin/tcpdump
```
2020-04-30 23:07:15 +02:00
2020-05-05 23:23:26 +02:00
Le script pour l'empêcher : `disable_tcpdump.sh`
2020-04-30 23:07:15 +02:00
2020-05-05 23:23:26 +02:00
```
2020-04-30 23:07:15 +02:00
#!/bin/bash
/sbin/setcap -r /usr/sbin/tcpdump
2020-05-05 23:23:26 +02:00
```
2020-04-30 23:07:15 +02:00
2020-05-05 23:23:26 +02:00
Le script qui paramètre tout pour vous (à ne lancer qu'une fois, en tant que `root`) : `setup_tcpdump.sh`
2020-04-30 23:07:15 +02:00
2020-05-05 23:23:26 +02:00
```
2020-04-30 23:07:15 +02:00
#!/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
2020-05-05 23:23:26 +02:00
```
2020-04-30 23:07:15 +02:00
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 !
2020-05-05 23:23:26 +02:00
![NSA_PR](%assets_url%/2015/11/NSA_PR.png)
Touitte de NSA_PR, 22 juillet 2014 ;)
2020-04-30 23:07:15 +02:00
Sur ce petit troll de la NSA, je vous quitte !
_Motius_
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.