Outils pour utilisateurs

Outils du site


systeme:tcpdump

Sources : http://www.tux-planet.fr/blog/?2007/10/05/189-sniffer-des-connexions-reseaux-avec-la-commande-tcpdump-sous-linux

Autre : http://okki666.free.fr/docmaster/articles/linux084.htm

Tcpdump est un logiciel en ligne de commande sous Linux, qui permet de capturer et d'analyser tous les paquets qui transitent par une carte réseau. Cet article explique son fonctionnement et est illustré de quelques exemples.

Exemples d'utilisation simple

Dans les exemples donnés ici, la carte réseau utilisée est identifiée par eth0. Il faut savoir également que cette commande n'est accessible que pour l'utilisateur root.

Capturer toutes les connexions, qui ont pour source une adresse IP commençant par 192.168. :

$ tcpdump -i eth0 src net 192.168

Capturer toutes les connexions, qui ont pour destination une adresse IP bien précise :

$ tcpdump -i eth0 dst net 192.168.0.175

Isoler toutes les connexions qui utilisent le port 80 (http) :

$ tcpdump -i eth0 port 80

On pourra également isoler la source ou la destination. Ici on ne souhaite capturer que les envois de mails (port 25 en destination) :

$ tcpdump -i eth0 dst port 25

Exemples d'utilisation avancée

La commande tcpdump permet également d'utiliser des expressions logiques, afin d'affiner les captures. Pour cela, on peut utiliser les opérateurs logiques suivants :

  • Négation : ! ou not
  • Opérateur et : && ou and
  • Opérateur ou : || ou or

Si je souhaite capturer toutes les connexions réseaux qui vont de l'adresse IP 192.168.0.175 vers l'adresse 192.168.0.1, utilisant le protocole TCP et le port 80, je pourrais utiliser une expression comme celle-ci :

$ tcpdump -i eth0 src 192.168.0.175 and dst 192.168.0.1 and port 80 and tcp

Vous l'avez peut-être remarqué, mais toutes ces commandes n'affichent que le dialogue effectué par la carte réseau. Pour afficher le contenu même des paquets qui transitent au format hexadécimal et ascii, on pourra utiliser les options -XX (ascii + hexa) et -s0 (= pour full content).

Voici un exemple de capture, lorsque q'un navigateur web se connecte à l'adresse www.tux-planet.fr :

0x0040: d775 4745 5420 2f73 7479 6c65 2e63 7373 .uGET./style.css
0x0050: 2048 5454 502f 312e 310d 0a48 6f73 743a .HTTP/1.1..Host:
0x0060: 2077 7777 2e74 7578 2d70 6c61 6e65 742e .www.tux-planet.
0x0070: 6672 0d0a 5573 6572 2d41 6765 6e74 3a20 fr..User-Agent:.

La commande tcpdump permet également une utilisation mal intentionnée, comme le montrent ces exemples :

  • capturer un mot de passe FTP :
$ tcpdump -XX -s0 -i eth0 tcp and port 21 | grep -A1 PASS
  • Récupérer un cookie de session, d'un utilisateur authentifié sur un site web :
$ tcpdump -XX -s0 -i eth0 port 80 | grep -i -A5 Cookie
  • Capturer des emails envoyés sur le réseau (ici on prend une longueur de 20 lignes, à adapter selon la taille du message):
$ tcpdump -XX -s0 -i eth0 port 25 | grep -i -A20 From
  • capturer des conversations msn (longueur de 10 lignes à adapter aussi selon la taille du message) :
$ tcpdump -XX -s0 -i eth0 port 1863 | grep -A10 "text/plain"

On comprend ici très rapidement l'utilité d'utiliser des connexions sécurisées (https, ftps, ssh, smtps …) lorsque l'on est sur Internet, afin de rendre les informations sensibles, illisibles via ce procédé.

Aller plus loin : man tcpdump Logiciel équivalent proposant une interface graphique : WireShark (anciennement appelé Ethereal)

Filtrage suivant les flags TCP

Il est possible aussi de filtrer en fonction des flags contenus dans l’entête TCP. Ces flags sont:

    * SYN-ACK ‘tcp[13] = 18′
    * FIN ‘tcp[13] & 1 != 0′
    * SYN ‘tcp[13] & 2 != 0′
    * RST ‘tcp[13] & 4 != 0′
    * PSH ‘tcp[13] & 8 != 0′
    * ACK ‘tcp[13] & 16 != 0′
    * URG ‘tcp[13] & 32 != 0′

Ceci signifie qu’on prend le 13ième octet dans l’entête TCP (tcp[13]). Chaque bit de cet octet représente un flag. On effectue ensuite une opération logique pour obtenir la valeur de ce bit et on le test par rapport à 0.

exemple:

$ sudo tcpdump 'tcp[13] & 2 != 0'

Exploitation des paquets avec Wireshark

Il est possible d’enregistrer les paquets capturés dans un fichier et ainsi de les analyser plus tard, sur une autre machine éventuellement, avec Wireshark et de bénéficier des avantages d’une représentation graphique des paquets. On utilisera cette méthode, par exemple, lorsque l’on doit analyser les paquets arrivant sur un serveur ne disposant pas d’interface graphique permettant de faire tourner Wireshark.

L’enregistrement des paquets se fait en utilisant l’option -w qui dit à tcpdump d’enregister les paquets bruts dans un fichier. Par exemple:

$ sudo tcpdump -Xvvnns0 port 80 -w dump.cap

Ensuite il ne reste plus qu’à analyser le fichier dump.cap dans Wireshark en le lançant avec le nom de fichier en argument:

$ wireshark -r dump.cap

Décoder les paquets CDP ou LLDP packets

Cela permet entre autre de voir sur quel numéro de port de quel switch est branché notre serveur :

$ tcpdump -i eth0 -v -s 1500 -c 1 '(ether[12:2]=0x88cc or ether [20:2]=0x2000)'
systeme/tcpdump.txt · Dernière modification : 2015/08/16 08:55 de root