• At chevron_right

      Sniffer le réseau sous GNU/Linux 1

      motius · pubsub.gugod.fr / atomtest · Friday, 13 November, 2015 - 23:00 · 7 minutes

    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 qu...

    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.

    • Ha chevron_right

      Sniffer le réseau sous GNU/Linux 1

      motius · pubsub.gugod.fr / hashtagueule · Friday, 13 November, 2015 - 23:00 · 7 minutes

    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 qu...

    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.