Capture de trames à distance via SSH avec tcpdump et Wireshark
Aujourd’hui petit trick pour faire du debug réseau : capture de trames sur les interfaces d’une machine distante, tout en ayant le confort de Wireshark en local.
Pour cela on va se servir de notre outil de capture favori en terminal, à savoir tcpdump. Ce dernier nous donne la possibilité d’enregistrer les trames brutes au format pcap avec le switch -w . En combinant ce switch et un petit bricolage bash, on peut donc transférer la sortie de tcpdump directement à un Wireshark sur un autre poste.
Sans plus attendre, voici la ligne magique :
ssh root@host "tcpdump -s0 -U -n -w - -i tun0 'not port 22'" | wireshark -i - | | | \___________/ | | | | | | | +-> uniquement si vous capturez sur la même interface que celle où vous SSH-ez la machine | | +-----------> interface à utiliser pour la capture | +-------------------------------------------> hôte SSH +-----------------------------------------------> peut être un utilisateur non privilégié, voir plus bas
Vous pourrez consulter le fonctionnement de chaque switch dans les manuels respectifs, mais voici grosso modo comment fonctionne le montage:
- Il s’agit de demander à SSH de ne pas lancer un shell, mais à la place d’exécuter directement tcpdump,
- La partie -w – demande à tcpdump d’envoyer la capture brute sur la sortie standard,
- Demandons à Wireshark d’écouter sur l’entrée standard avec | wireshark -i – .
Capture avec un utilisateur non privilégié
Avec sudo (facile)
Il est possible de préfixer tcpdump de sudo, mais cette technique a un défaut majeur (toutefois facilement réglé) :
sudo: no tty present and no askpass program specified
Si vous avez configuré sudo pour vous demander un mot de passe, c’est mort pour vous et vous aurez ce message. Cependant, vous pouvez configurer sudo pour ne pas demander de mot de passe pour tcpdump, ajoutez alors la ligne suivante à /etc/sudoers :
sudo ALL=(root) NOPASSWD:/usr/sbin/tcpdump | | | +---> "which tcpdump" pour connaître le chemin exact de tcpdump chez vous +--------------------------------> remplacez par le groupe ou l'utilisateur ayant le droit de capture
Sans sudo (moins facile)
Vous pouvez suivre ce petit guide pour capturer sans sudo. A noter que cette manipulation ne fonctionne pas partout. J’ai pu me servir de cette technique capturer sur des serveurs sous Debian Jessie, mais pas sous Wheezy (ou bien je ne l’ai pas fait correctement).