(modifié le 30 novembre 2021 à 16:23)

On a parfois besoin de sniffer des paquets sur sa passerelle faisant office de routeur/pare-feu, dans mon cas ça se passe avec un routeur Tomato (TomatoUSB plus précisément).

tomato-tcpdump

Le firmware alternatif ne contient pas l'utilitaire tcpdump, voici comment l'ajouter et l'exploiter avec des exemples de commandes.

Télécharger tcpdump

Avant tout je vous conseille d'utiliser une clé USB qui restera toujours connectée sur votre routeur, aujourd'hui ça ne coûte plus rien et cela évite d'user le JFFS pour rien (voir "principe de fonctionnement").

Dans mon cas c'est une clé 1G peu rapide qui ne me servait pas, je lui ai trouvé une seconde vie, ou plutôt une première. Cette clé me sert pour enregistrer la bande passante (download/upload) qui était effacée à chaque reboot du routeur, elle va désormais également nous servir à stocker des fichiers pcap. Formatez là comme bon vous semble : NTFS, EXT2/3 ou FAT, puis connectez-là sur le port USB derrière votre routeur.

Vérifiez dans l'interface de tomato :

  • USB and NAS > USB Support : tout est coché excepté USB Printer Support
    tomato-usb-support
  • Votre clé doit apparaître dans "attached devices" juste en dessous dans la même fenêtre :
    tomato-attached-devies
  • USB and NAS > File Sharing, activez ou non l'authentification (dépend si vous êtes tout seul sur votre réseau) puis sélectionner un montage en lecture/écriture (R/W) :
    tomato-files-sharing

Il faut utiliser un binaire compilé pour tourner sur le CPU de votre routeur :

Copiez le binaire après l'avoir extrait sur votre clé USB, via SCP ou via le partage de la clé créé par le routeur (\\ip-routeur\nom_cle).

note : pour en savoir plus sur l'architecture CPU de votre routeur passez par la bible des routeurs et plus particulièrement sur la page broadcom pour identifier l'architecture de votre CPU

note bis : vous pouvez aussi passer par entware-ng (sorte de fork de ipkg / opkg) pour installer le binaire automatiquement, plus d'info sur le wiki dédié

Reniflons

Pour renifler rien de plus simple !

Il suffit de se connecter en SSH sur le routeur (activez SSH dans l'interface web si ce n'est pas fait). Puis rendez vous à l'endroit où vous avez déposé le binaire tcpdump, sur la clé pour mon cas :

cd /tmp/mnt/CLE1GO/outils

Quelques exemples de commandes tcpdump que j'utilise la plupart du temps.

Paquets venant et à destination de 192.168.0.1, affichage human readable ASCII plus de lisibilité ("-A") :

tcpdump -s0 -w ecoute.pcap host 192.168.0.1 -A

Identique avec un timestamp plus lisible (-tttt) et plus verbeux (-vvv) :

tcpdump -s0 -w ecoute.pcap host 192.168.0.1 -A -tttt -vvv

Capture les paquets contenant des trames FTP ou SSH sur l'interface WAN (vlan2 chez moi) :

tcpdump -s0 -w ecoute.pcap port ftp or ssh -i vlan2

Capture les paquets provenant et à destination de 192.168.0.1 sur le port 8443 :

tcpdump -s0 -w ecoute.pcap host 192.168.0.1 and port 8443

Capture les paquets entre les hôtes A, B ou C :

tcpdump -s0 -w ecoupte.pcap host A and host \( B or C\)

Capture les paquets igmp (ping par ex), sans résoudre les IP en nom :

tcpdump -s0 -w -n ecoute.pcap igmp

Capture les paquets tcp sur le port 80 provenant de 192.168.0.1 :

tcpdump -s0 -w ecoute.pcap tcp port 80 and src 192.168.0.1

Capture les paquets provenant et à destination de 192.168.0.1, sauf les paquets ssh (pour s'exclure des traces):

tcpdump -s0 -w ecoute.pcap host 192.168.0.1 and port not 22
tcpdump -s0 -w ecoute.pcap host 192.168.0.1 and port !22

Capture les paquets provenant et à destination de 192.168.0.1 sur les ports de destination 80 et 443 :

tcpdump -s0 -w ecoute.pcap host 192.168.0.1 and "(dst port 80 or dst port 443)"

Capture les paquets à destination des réseaux suivants :

tcpdump -s0 -w ecoute.pcap dst net 192.168.0.0/24 or 10.0.2.0/24

le "-s0" permet de capture sans limite de taille ("-s0 200" capture les 200 premiers octets)
le "-n" ne résoud pas les IP en nom (nom de machine local / nom de domaine)

Capture les paquets ICMP (pour flasher une IP grâce à ping par exemple) :

tcpdump -nni vlan2 icmp

vlan2 = patte wan (vérifiez avec "ip a").

Alternative avec DNS :

tcpdump -ni vlan2 udp port 53

Pour connaître tous les paramètres j'utilise ce mémo tcpdump et ce mémo wireshark (et une doc pour combiner).

Sinon en résumé :

  • -i any : écoute sur toutes les interfaces
  • -i eth0 : écoute sur l'interface eth0
  • -D : affiche les interfaces disponibles
  • -n : sans résolutions des noms d'hôtes
  • -nn : sans résolution des noms d'hôtes et des ports
  • -q : moins verbeux (quiet)
  • -t : n'affiche pas le timestamp sur chaque ligne
  • -tttt : horodatage lisible par un humain (heure, min, sec, fractions)
  • -X : en plus des en-têtes affiche le contenu du paquet en hex et en ASCII
  • -XX : identique à-X avec l'en-tête ethernet en plus
  • -v, -vv, -vvv : augmente la versbosité
  • -c : arrête la capture après avoir capturé ce nombre de paquets
  • -s : taille de la capture (s0 pour illimité)
  • -e : affiche les en-têtes ethernet

Nous pouvons maintenant exploiter ces fichiers pcap dans wireshark et profiter de la puissance de l'outil pour cherche de façon très fine. Dans mon cas je voulais débusquer un dysfonctionnement sur un module Somfy :

capture_tomato

Conclusion

Vous n'êtes bien sûr pas forcés d'orienter les résultats vers un fichier de sortie si l'affichage dans le terminal vous suffit. C'est en tout cas bien pratique de pouvoir sniffer sur tous les équipements, y compris ceux en WiFi (smartphone, imprimante, tablette, alarme, etc). De nombreux logiciels utilisent des systèmes de type wget sans rien dire à l'utilisateur, c'est une excellente façon de savoir ce qui se trame dans votre dos (elle était facile...).

Même chose pour certains équipements propriétaires, on peut comprendre comment tout ça communique. Pour ma part j'ai investigué le matériel Somfy et je me suis aperçu que c'était plutôt blindé sur les échanges entre les équipements et les serveurs Somfy. Me voilà rassuré !

Auteur : Mr Xhark

Fondateur du blog et passionné par les nouvelles techno, suivez-moi sur twitter