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/06/20 09:36] – Analyse avancée des entêtes pteuinformatique:logiciels:tcpdump [2023/02/07 10:46] (current) – [Filtrer les messages ICMP] pteu
Line 53: Line 53:
   * ''-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).   * ''-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 82: Line 83:
 proto[x:y] proto[x:y]
 </code> </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 protocle analysé ; par exmeple pour IPv4 :+C'est important de connaitre le format des entêtes du protocole analysé ; par exemple pour IPv4 :
 <code> <code>
 0                                                          0                                                         
Line 186: 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.
  
-====Paquet DF====+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    | 
 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  
-Pour filtrer les paquets "non fragmentables" (ayant le bit DF=1, cf entêtes IP:+Bit 0: reserved, must be zero 
 +Bit 1: (DF) 0 May Fragment, = Don't Fragment. 
 +Bit 2: (MF) 0 = Last Fragment1 = 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 Fragmentn'est pas égal à 1.
 <code bash> <code bash>
-tcpdump -nnv 'ip[6] = 64'+tcpdump -i eth1 '((ip[6:2] > 0) and (not ip[6] = 64))'
 </code> </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 : +====Paquet DF====
-<code> +
-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +
-|Flags|      Fragment Offset    | +
-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-++
  
-Bit 0: reserved, must be zero +Pour filtrer les paquets "non fragmentables" (ayant le bit DF = 1cf entêtes IP) 
-Bit 1: (DF) 0 May Fragment1 = Don't Fragment. +<code bash> 
-Bit 2 (MF) 0 = Last Fragment, 1 = More Fragments. +tcpdump -nnv 'ip[6] = 64'
- +
-The fragment offset field is only used when fragmentation occurs.+
 </code> </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. Donc, les paquets non fragmentables doivent avoir cet octet égal à "01000000" (binaire) càd 64 en décimal.
Line 255: 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.1308562597.txt.gz · Last modified: 2013/10/14 20:55 (external edit)