User Tools

Site Tools


informatique:logiciels:tcpdump

This is an old revision of the document!


sniffer réseau

TCPdump

TCPdump est un outil d'analyse réseau qui permet de sniffer (en mode promiscuité ou non) les paquets que reçoit une interface réseau de la machine. Une version pour Windows existe : Windump.

Son utilisation classique est la suivante :

tcpdump <paramètre(s)> <filtre(s)>

Paramètres

  • -i <interface> (interface) pour spécifier de sniffer une interface réseau particulière (ex : -i eth1)
  • -s <nb> pour ne capturer que les <nb> premiers octets de chaque paquet.
  • -c <nb> (count) : pour stopper la capture après <nb> paquets
  • -e affiche les entêtes de niveau 2 OSI (état de lien)
  • -n (numeric) capturer au format numérique = ne résout pas les noms de machines
  • -nn ne résoud pas non plus les numéros de ports TCP/UDP
  • -v[v[v]] (verbose) résultat plus ou moins verbeux
  • -r <fichier> (read file) lire un fichier pcap
  • -w <fichier> (write file) pour enregistrer les paquets capturés dans un fichier plutôt que de les afficher sur le terminal. L'enregistrement se fait au format pcap

Filtres

  • par protocole : tcp, icmp, udp, arp, ip, ip6, ppp, …
  • par adresse Ethernet : ether <ether_address>
  • par IP : <IP_address>
  • par réseau IP : net <IP_address>/<masque>
  • par port : port <port>
  • par plage de ports : portrange <port_inf>-<port_sup>
  • par taille de paquet (égal ou inférieur/supérieur à) : [less|greater] <taille>
  • source ou destination (s'utilise avec les adresses, les ports) : src|dst
  • par vlan (dot1q) : vlan [<n° vlan>]
  • par label MPLS : mpls [<label>]

Modificateurs

  • négation : ! ou not
  • ET : && ou and
  • ET logique : &
  • OU : || ou or
  • OU logique : |

Divers

  • flags TCP
tcp-urg
tcp-ack
tcp-psh
tcp-rst
tcp-syn
tcp-fin

Exemple d'utilisation : capturer tous les paquets tcp SYN et FIN :

tcpdump 'tcp[tcpflags] & (tcp-syn|tcp-fin) != 0'
  • types ICMP
icmp-echoreply
icmp-routeradvert
icmp-tstampreply
icmp-unreach
icmp-routersolicit
icmp-ireq
icmp-sourcequench
icmp-timxceed
icmp-ireqreply
icmp-redirect
icmp-paramprob
icmp-maskreq
icmp-echo
icmp-tstamp
icmp-maskreply

Exemple : capturer les paquets icmp qui ne soient pas du PING (ni echo request ni echo reply).

tcpdump ’icmp[icmptype] != icmp-echo and icmp[icmptype] != icmp-echoreply’

Exemples

tcpdump -i eth0 not host toto
tcpdump -i eth0 host toto and net 192.168.0.0/24
tcpdump -i eth0 'ip[9] = 1'

qui permet d'inspecter l'octet n° 9 (le 10eme octet, car tcpdump compte à partir de 0) de l'entête IP ; équivalant à :

tcpdump -i eth0 icmp
 tcpdump -i eth1 'len > 1518'

permet de filtrer les jumbo frame

Filtrer les paquets fragmentés

L'exemple suivant, tiré du Misc n° 32, permet de détecter les paquets fragmentés = ceux qui ont le bit MF à 1. Ce bit est situé dans le 3ème bit du 7ème octet de l'entête IP. On va récupérer ip[6] et lui appliquer le masque 0010 0000 (0x20 en hexa) afin de ne sélectionner que le bit qui nous intéresse :

tcmpdump 'ip[6] & 0x20' = 32

Le résultat de cette addition logique peut être soit 0 soit 32 : en effet le masque ajouté avec un “ET” logique permet d'annuler (passer à 0) tous les autres bits ; il ne restera que le 3eme bit en partant de la gauche de l'octet, qui correspond au 6eme en partant de la droite, soit 2^6 = 32). Comme on le constate ici, tcpdump travaille par octet.

Port tcp < 1024

Cet exemple permet de sélectionner les paquets TCP ayant un port source < 1024 :

tcpdump 'tcp[0:2]' < 1024

Ici on débute à l'octet 0 de l'entête TCP et on lit 2 octets pour sélectionner le champ “src port”, que l'on peut comparer directement à 1024.

Filtrer les paquets TCP SYN

On veut filtrer uniquement les paquets SYN du protocole TCP, mais pas les SYN-ACK. On va donc sélectionner les paquet TCP ayant le flag “SYN” à 1 et pas le flag ACK. Ceci se voit dans l'entête TCP de chaque paquet. Il s'agit du 14ème octet de chaque paquet TCP ; et comme ils sont numérotés à partir de 0, on va regarder l'octet 13, structuré ainsi :

champ → CWR ECE URG ACK PSH RST SYN FIN
ce qu'on recherche x x x 0 x x 1 x

On ne fait attention qu'au flags ACK et SYN : on veut que le premier soit à 0 et le second à 1. Ceci se traduit par l'expression suivante (on utilise un masque binaire avec un ET logique sur l'octet 13 afin de ne sélectionner que ces 2 flags, et on vérifie la valeur de l'octet 13) :

<octet 13 de chaque paquet> ET <masque> = doit être égal à 00000010 (càd 2 en décimal)
tcp[13] ET 00010010 = 00000010

Soit, en décimal :

tcp[13] ET 18 = 2

Bref :

tcpdump -i eth1 -s 40 'tcp[13] & 18 == 2'

(l'option -s spécifie de ne capturer que les 40 premiers octets de chaque paquet : en effet on ne s'intéresse qu'aux entêtes des paquets.)

informatique/logiciels/tcpdump.1289308023.txt.gz · Last modified: 2013/10/14 20:55 (external edit)