User Tools

Site Tools


informatique:logiciels:tcpdump

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
informatique:logiciels:tcpdump [2011/03/02 20:15] – édition externe 127.0.0.1informatique:logiciels:tcpdump [2023/02/07 10:46] (current) – [Filtrer les messages ICMP] pteu
Line 52: Line 52:
   * ''-w <fichier>'' (**w**rite 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   * ''-w <fichier>'' (**w**rite 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
   * ''-C <nb>'' utilisé avec ''-w'', permet diviser la sortie de la capture dans des fichiers de <nb> Mo maximum   * ''-C <nb>'' utilisé avec ''-w'', permet diviser la sortie de la capture dans des fichiers de <nb> Mo maximum
 +  * ''-S'' : pour afficher les numéros de séquence absolu ; cela permet de corréler une trace tcpdump avec des logs d'autres équipements (firewalls par exemple).
 +  * ''-Q|-P <direction>'' : capturer les paquets dans une direction, possible entre "in", "out" ou "inout"
  
  
Line 58: Line 60:
   * par protocole : ''tcp, icmp, udp, arp, ip, ip6, ppp, ...''   * par protocole : ''tcp, icmp, udp, arp, ip, ip6, ppp, ...''
   * par adresse Ethernet : ''ether <ether_address>''   * par adresse Ethernet : ''ether <ether_address>''
-  * par IP : ''<IP_address>''+  * par IP : ''host <IP_address>''
   * par réseau IP : ''net <IP_address>/<masque>''   * par réseau IP : ''net <IP_address>/<masque>''
   * par port : ''port <port>''   * par port : ''port <port>''
   * par plage de ports : ''portrange <port_inf>-<port_sup>''   * par plage de ports : ''portrange <port_inf>-<port_sup>''
 +  * source ou destination (s'utilise avec les adresses, les ports ; ex : ''scr host X.X.X.X'') : ''src|dst''
   * par taille de paquet (égal ou inférieur/supérieur à) : ''[less|greater] <taille>''   * 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 vlan (dot1q) : ''vlan [<n° vlan>]''
   * par label MPLS : ''mpls [<label>]''   * par label MPLS : ''mpls [<label>]''
Line 74: Line 76:
   * OU : ''||'' ou ''or''   * OU : ''||'' ou ''or''
   * OU logique : ''|''   * OU logique : ''|''
 +
 +====Analyse avancée des entêtes====
 +
 +On peut préciser à tcpdump d'analyser un bout d'entête spécifique ; la syntaxe est la suivante :
 +<code bash>
 +proto[x:y]
 +</code>
 +On analyse à partir de l'octet x et on lit y octets. Si '':y'' n'est pas renseigné on ne considère que l'octet x.
 +
 +C'est important de connaitre le format des entêtes du protocole analysé ; par exemple pour IPv4 :
 +<code>
 +0                                                         
 +0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 
 ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 +|Version|  IHL  |Type of Service|          Total Length         |
 ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 +|         Identification        |Flags|      Fragment Offset    |
 ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 +|  Time to Live |    Protocol           Header Checksum       |
 ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 +|                       Source Address                          |
 ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 +|                    Destination Address                        |
 ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 +|                    Options                    |    Padding    | <-- optional
 ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 +|                            DATA ...                           |
 ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 +</code>
 +
 +... ou TCP :
 +<code>
 +0                                                         
 +0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 
 ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 +|          Source Port          |       Destination Port        |
 ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 +|                        Sequence Number                        |
 ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 +|                    Acknowledgment Number                      |
 ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 +|  Data |           |U|A|P|R|S|F|                               |
 +| Offset| Reserved  |R|C|S|S|Y|I|            Window             |
 +|                 |G|K|H|T|N|N|                               |
 ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 +|           Checksum            |         Urgent Pointer        |
 ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 +|                    Options                    |    Padding    |
 ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 +|                             data                              |
 ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 +</code>
  
 ====Divers==== ====Divers====
Line 134: Line 188:
 D'autres exemples : D'autres exemples :
  
-  tcpdump -i eth0 not host toto+<code bash> 
 +tcpdump -i eth0 not host toto 
 +tcpdump -i eth0 host toto and net 192.168.0.0/24 
 +</code>
  
-  tcpdump -i eth0 host toto and net 192.168.0.0/24+2 équivalents qui permettent d'inspecter l'octet n° 9 (le 10<sup>ème</sup> octet, car tcpdump compte à partir de 0) de l'entête IP 
 +<code bash> 
 +tcpdump -i eth0 'ip[9] = 1' 
 +tcpdump -i eth0 icmp 
 +</code>
  
-  tcpdump -i eth0 'ip[9] = 1' +2 équivalents pour filtrer les //jumbo frame// (les paquets de taille supérieure à 1518 octet, le standard Ethernet) 
-qui permet d'inspecter l'octet n° 9 (le 10<sup>ème</sup> octet, car tcpdump compte à partir de 0) de l'entête IP ; équivalant à : +<code bash> 
-  tcpdump -i eth0 icmp +tcpdump -i eth1 'len > 1518' 
- +tcpdump -i eth1 'ip[2:2] > 600' 
-   tcpdump -i eth1 'len > 1518' +</code>
-permet de filtrer les //jumbo frame// (les paquets de taille supérieure à 1518 octet, le standard Ethernet)+
  
 +Filtrer les trames Ethernet (''-e'') dont l'adresse MAC source est ''00:11:11:00:11:22'' :
 +<code bash>
 +tcpdump -e -nni eth0 ether src 00:11:11:00:11:22
 +</code>
 +NB : l'option ''-nn'' permet d'activer le format numérique pour la sortie, c'est-à-dire pas de résolution de port (service) ni d'IP (DNS).
  
 ====Filtrer les paquets fragmentés==== ====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 : +L'exemple suivant, tiré du Misc n° 32, permet de détecter les paquets fragmentés = ceux qui ont le bit MF (more fragment) à 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+<code> 
 +tcmpdump 'ip[6] & 0x20' = 32 
 +</code>
 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. 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.
 +
 +Cependant cette méthode ne tient pas compte des derniers paquets fragmentés qui ont le bit MF = 0. En revanche ceux-ci possèdent un champ //fragment offset// non nul :
 +<code>
 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 + |Flags|      Fragment Offset    |
 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 +
 +Bit 0: reserved, must be zero
 +Bit 1: (DF) 0 = May Fragment, 1 = Don't Fragment.
 +Bit 2: (MF) 0 = Last Fragment, 1 = More Fragments.
 +</code>
 +
 +Une autre façon de faire est donc de chercher les paquets dont ces champs ne sont pas vide ET dont le bit DF (Don't Fragment) n'est pas égal à 1.
 +<code bash>
 +tcpdump -i eth1 '((ip[6:2] > 0) and (not ip[6] = 64))'
 +</code>
 +
 +====Paquet DF====
 +
 +Pour filtrer les paquets "non fragmentables" (ayant le bit DF = 1, cf entêtes IP) :
 +<code bash>
 +tcpdump -nnv 'ip[6] = 64'
 +</code>
 +
 +En effet on regarde le 7e octet de l'entête IP (7e octet => le n°6 puisqu'on commence à 0) ; cet octet contient les champs suivants : (cf //[[informatique:logiciels:tcpdump#filtrer_les_paquets_fragmentes|Filtrer les paquets fragmentés]]//).
 +
 +Donc, les paquets non fragmentables doivent avoir cet octet égal à "01000000" (binaire) càd 64 en décimal.
  
 ====Port tcp < 1024==== ====Port tcp < 1024====
Line 166: Line 260:
  
 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) : 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) :
-<code>+ 
 +<code bash>
 <octet 13 de chaque paquet> ET <masque> = doit être égal à 00000010 (càd 2 en décimal) <octet 13 de chaque paquet> ET <masque> = doit être égal à 00000010 (càd 2 en décimal)
 tcp[13] ET 00010010 = 00000010 tcp[13] ET 00010010 = 00000010
Line 180: Line 275:
 </code> </code>
 (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.) (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.)
 +
 +====Filtrer les paquets TCP FIN====
 +
 +On procède de la même façon que pour les TCP SYNs, mais on filtre sur le bit FIN (le bit de poids faible du 13e octet) et on ne tient pas compte du flag ACK car il est (presque ?) toujours activé de toute façon.
 +
 +^  champ ->          ^ CWR ^ ECE ^ URG ^ ACK ^ PSH ^ RST ^ SYN ^ FIN ^
 +| ce qu'on recherche |  x  |  x  |  x  |  x  |  x  |  x  |  x  |  1  |
 +
 +Ce qui nous donne :
 +<code>
 +tcpdump -i eth1 -s 40 'tcp[13] & 1 == 1'
 +</code>
 +
 +====Filtrer les messages ICMP====
 +
 +La balise "icmp" permet de filtrer tous les paquets ICMP, mais on peut filtrer des messages particulier, par exemple les ICMP redirect (type=5) :
 +<code bash>
 +tcpdump -nni eth0 icmp[0] == 5
 +</code>
 +Pour connaitre la liste exhaustive des différents messages ICMP, go [[https://fr.wikipedia.org/wiki/Internet_Control_Message_Protocol#Les_diff%C3%A9rents_messages_de_contr%C3%B4le|Wikipedia fr]]
informatique/logiciels/tcpdump.1299096910.txt.gz · Last modified: 2013/10/14 20:55 (external edit)