informatique:logiciels:tcpdump
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revisionLast revisionBoth sides next revision | ||
informatique:logiciels:tcpdump [2009/06/08 20:15] – édition externe 127.0.0.1 | informatique:logiciels:tcpdump [2020/10/07 14:36] – [Paramètres] pteu | ||
---|---|---|---|
Line 3: | Line 3: | ||
======TCPdump====== | ======TCPdump====== | ||
- | **TCPdump** est un outil d' | + | **TCPdump** est un outil d' |
- | C'est un outil en mode texte qui permet de filtrer les résultats d'un sniff sur une interface spécifiée par l' | + | Son utilisation classique |
+ | < | ||
+ | tcpdump < | ||
+ | </ | ||
- | Par exemple pour n'afficher que le trafic depuis/vers la machine toto : | + | A la fin d'une capture, on a le retour suivant : |
+ | <code bash> | ||
+ | 0 packets captured | ||
+ | 130 packets received by filter | ||
+ | 35 packets dropped by kernel | ||
+ | </code> | ||
+ | * **packets captured** indique le nombre de paquet capturés | ||
+ | * **packets received by filter** apparemment sa signification dépend de l'OS ; en général cela semble indiquer les paquets qui sont arrivés sur l' | ||
+ | * **packets dropped by kernel** sont les paquets supprimés par manque de ressources. Cela vient du fait que le processeur n' | ||
+ | * utiliser des filtres pour baisser la charge CPU | ||
+ | * augmenter le buffer de réception des sockets : | ||
+ | Pour connaitre la taille du buffer (taille par défaut et taille max) de réception d'une socket : | ||
+ | <code bash> | ||
+ | sysctl net.core.rmem_default | ||
+ | net.core.rmem_default = 110592 | ||
+ | sysctl net.core.rmem_max | ||
+ | net.core.rmem_max = 131071 | ||
+ | </ | ||
- | tcpdump -i eth0 host toto | + | On peut l' |
+ | <code bash> | ||
+ | sysctl net.core.rmem_max=1013760 | ||
+ | sysctl net.core.rmem_default=1013760 | ||
+ | </ | ||
- | D' | + | =====Paramètres===== |
- | tcpdump -i eth0 not host toto | + | |
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
- | | + | |
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
- | tcpdump -i eth0 'ip[9] = 1' | ||
- | qui permet d' | ||
- | tcpdump -i eth0 icmp | ||
- | L' | + | =====Filtres===== |
- | tcmpdump 'ip[6] & 0x20' = 32 | + | |
+ | * par protocole : '' | ||
+ | * par adresse Ethernet : '' | ||
+ | * par IP : '' | ||
+ | * par réseau IP : '' | ||
+ | * par port : '' | ||
+ | * par plage de ports : '' | ||
+ | * source ou destination (s' | ||
+ | * par taille de paquet (égal ou inférieur/ | ||
+ | * par vlan (dot1q) : '' | ||
+ | * par label MPLS : '' | ||
+ | |||
+ | ====Modificateurs==== | ||
+ | |||
+ | * négation : '' | ||
+ | * ET : ''&&'' | ||
+ | * ET logique : ''&'' | ||
+ | * OU : '' | ||
+ | * OU logique : '' | ||
+ | |||
+ | ====Analyse avancée des entêtes==== | ||
+ | |||
+ | On peut préciser à tcpdump d' | ||
+ | <code bash> | ||
+ | proto[x: | ||
+ | </ | ||
+ | On analyse à partir de l' | ||
+ | |||
+ | C'est important de connaitre le format des entêtes du protocole analysé ; par exemple pour IPv4 : | ||
+ | < | ||
+ | 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| | ||
+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||
+ | | | ||
+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||
+ | | Time to Live | Protocol | ||
+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||
+ | | | ||
+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||
+ | | Destination Address | ||
+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||
+ | | Options | ||
+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||
+ | | DATA ... | | ||
+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||
+ | </ | ||
+ | |||
+ | ... ou TCP : | ||
+ | < | ||
+ | 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 | | ||
+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||
+ | | Sequence Number | ||
+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||
+ | | Acknowledgment Number | ||
+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||
+ | | Data | | ||
+ | | Offset| Reserved | ||
+ | | | ||
+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||
+ | | | ||
+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||
+ | | Options | ||
+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||
+ | | | ||
+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||
+ | </ | ||
+ | |||
+ | ====Divers==== | ||
+ | |||
+ | * flags TCP | ||
+ | <code bash> | ||
+ | tcp-ack | ||
+ | tcp-psh | ||
+ | tcp-rst | ||
+ | tcp-syn | ||
+ | tcp-fin | ||
+ | </ | ||
+ | |||
+ | Exemple d' | ||
+ | <code bash> | ||
+ | tcpdump ' | ||
+ | </ | ||
+ | |||
+ | * types ICMP | ||
+ | <code bash> | ||
+ | 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). | ||
+ | <code bash> | ||
+ | tcpdump ’icmp[icmptype] != icmp-echo and icmp[icmptype] != icmp-echoreply’ | ||
+ | </ | ||
+ | |||
+ | |||
+ | =====Exemples d' | ||
+ | |||
+ | Pour être lisible, le maître mot dans une capture est de restreindre la sortie au maximum. La première chose est donc de n' | ||
+ | <code bash> | ||
+ | tcpdump -D | ||
+ | | ||
+ | | ||
+ | 3.any (Pseudo-device that captures on all interfaces) | ||
+ | | ||
+ | </ | ||
+ | |||
+ | Puis, pour ne capturer que les trames issues ou à destination de la machine 192.168.0.1 sur l' | ||
+ | <code bash> | ||
+ | tcpdump -i eth0 host 192.168.0.1 | ||
+ | </ | ||
+ | |||
+ | D' | ||
+ | |||
+ | <code bash> | ||
+ | tcpdump -i eth0 not host toto | ||
+ | tcpdump -i eth0 host toto and net 192.168.0.0/ | ||
+ | </ | ||
+ | |||
+ | 2 équivalents qui permettent d' | ||
+ | <code bash> | ||
+ | tcpdump -i eth0 'ip[9] = 1' | ||
+ | tcpdump -i eth0 icmp | ||
+ | </ | ||
+ | |||
+ | 2 équivalents pour filtrer les //jumbo frame// (les paquets de taille supérieure à 1518 octet, le standard Ethernet) : | ||
+ | <code bash> | ||
+ | tcpdump -i eth1 'len > 1518' | ||
+ | tcpdump -i eth1 ' | ||
+ | </ | ||
+ | |||
+ | Filtrer les trames Ethernet ('' | ||
+ | <code bash> | ||
+ | tcpdump -e -nni eth0 ether src 00: | ||
+ | </ | ||
+ | NB : l' | ||
+ | |||
+ | ====Filtrer les paquets fragmentés==== | ||
+ | |||
+ | L' | ||
+ | < | ||
+ | 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 " | Le résultat de cette addition logique peut être soit 0 soit 32 : en effet le masque ajouté avec un " | ||
- | Ce dernier | + | 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 : |
+ | < | ||
+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||
+ | |Flags| | ||
+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||
+ | |||
+ | 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. | ||
+ | </ | ||
+ | |||
+ | 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 ' | ||
+ | </ | ||
+ | |||
+ | ====Paquet DF==== | ||
+ | |||
+ | Pour filtrer les paquets "non fragmentables" | ||
+ | <code bash> | ||
+ | tcpdump -nnv 'ip[6] = 64' | ||
+ | </ | ||
+ | |||
+ | En effet on regarde le 7e octet de l' | ||
+ | |||
+ | Donc, les paquets non fragmentables doivent avoir cet octet égal à " | ||
+ | |||
+ | ====Port tcp < 1024==== | ||
+ | |||
+ | Cet exemple permet de sélectionner les paquets TCP ayant un port source < 1024 : | ||
tcpdump ' | tcpdump ' | ||
Ici on débute à l' | Ici on débute à l' | ||
+ | |||
+ | ====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 " | ||
+ | |||
+ | ^ 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' | ||
+ | |||
+ | <code bash> | ||
+ | <octet 13 de chaque paquet> ET < | ||
+ | tcp[13] ET 00010010 = 00000010 | ||
+ | </ | ||
+ | Soit, en décimal : | ||
+ | < | ||
+ | tcp[13] ET 18 = 2 | ||
+ | </ | ||
+ | |||
+ | Bref : | ||
+ | < | ||
+ | tcpdump -i eth1 -s 40 ' | ||
+ | </ | ||
+ | (l' | ||
+ | |||
+ | ====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 : | ||
+ | < | ||
+ | tcpdump -i eth1 -s 40 ' | ||
+ | </ |
informatique/logiciels/tcpdump.txt · Last modified: 2023/02/07 10:46 by pteu