Introduction à tcpdump

Quoi, tu fais du réseau et tu connais pas tcpdump, nan mais allo quoi !!! En effet, tout admin réseau qui se respecte connait cet outil, et pour cause, il s’agit d’un de ses meilleurs amis.

Tcpdump est un puissant outil de capture réseau (sniffer) en ligne de commande. Il permet l’analyse des trames réseau en temps réel. Grâce à l’utilisation de la librairie libpcap, il est possible de sauvegarder et d’exporter les captures vers des analyseurs compatibles comme le très célèbre wireshark.

Tcpdump s’installe sur GNU/Linux, on va donc faire nos tests sur un raspberry.

Pour l’installation, bah tout simplement, en root :

#apt-get install -y tcpdump

Voilà c’est tout, vous pouvez dès à présent l’utiliser. On verra différent cas de figure tout au long de l’article pour que vous vous fassiez une idée des possibilités, mais tout d’abord on va simplement lancer la commande telle quelle et attendre que quelques paquets soient capturés. Pour arrêter la capture il suffit de faire la combinaison Ctrl+c.

Note : Il faut que vous ayez les droit root pour pouvoir exécuter la commande.

root@lisa:~# tcpdump
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
00:16:11.725924 IP 192.168.1.200.ssh > 192.168.1.134.42427: Flags [P.], seq 1973231107:1973231303, ack 1754903922, win 261, options [nop,nop,TS val 504988689 ecr 13909606], length 196
00:16:11.926845 IP 192.168.1.134.42427 > 192.168.1.200.ssh: Flags [.], ack 196, win 16329, options [nop,nop,TS val 13909666 ecr 504988689], length 0
00:16:12.688998 IP 192.168.1.200.56150 > 192.168.1.254.domain: 35653+ PTR? 200.1.168.192.in-addr.arpa. (44)
00:16:12.689374 IP 192.168.1.254.domain > 192.168.1.200.56150: 35653 NXDomain* 0/0/0 (44)
00:16:12.689839 IP 192.168.1.200.45436 > 192.168.1.254.domain: 60543+ PTR? 134.1.168.192.in-addr.arpa. (44)
00:16:12.690129 IP 192.168.1.254.domain > 192.168.1.200.45436: 60543 NXDomain* 0/0/0 (44)
00:16:12.690807 IP 192.168.1.200.ssh > 192.168.1.134.42427: Flags [P.], seq 196:584, ack 1, win 261, options [nop,nop,TS val 504988786 ecr 13909666], length 388
00:16:12.892844 IP 192.168.1.134.42427 > 192.168.1.200.ssh: Flags [.], ack 584, win 16652, options [nop,nop,TS val 13909763 ecr 504988786], length 0
00:16:13.687136 IP 192.168.1.200.43805 > 192.168.1.254.domain: 29254+ PTR? 254.1.168.192.in-addr.arpa. (44)
00:16:13.687495 IP 192.168.1.254.domain > 192.168.1.200.43805: 29254 NXDomain* 0/0/0 (44)
00:16:13.688159 IP 192.168.1.200.ssh > 192.168.1.134.42427: Flags [P.], seq 584:828, ack 1, win 261, options [nop,nop,TS val 504988886 ecr 13909763], length 244
00:16:13.688343 IP 192.168.1.200.ssh > 192.168.1.134.42427: Flags [P.], seq 828:1072, ack 1, win 261, options [nop,nop,TS val 504988886 ecr 13909763], length 244
00:16:13.688499 IP 192.168.1.200.ssh > 192.168.1.134.42427: Flags [P.], seq 1072:1428, ack 1, win 261, options [nop,nop,TS val 504988886 ecr 13909763], length 356
00:16:13.690622 IP 192.168.1.134.42427 > 192.168.1.200.ssh: Flags [.], ack 1072, win 16530, options [nop,nop,TS val 13909843 ecr 504988886], length 0
00:16:13.889848 IP 192.168.1.134.42427 > 192.168.1.200.ssh: Flags [.], ack 1428, win 16441, options [nop,nop,TS val 13909863 ecr 504988886], length 0
00:16:14.687497 IP 192.168.1.200.ssh > 192.168.1.134.42427: Flags [P.], seq 1428:2472, ack 1, win 261, options [nop,nop,TS val 504988986 ecr 13909863], length 1044
00:16:14.889042 IP 192.168.1.134.42427 > 192.168.1.200.ssh: Flags [.], ack 2472, win 16652, options [nop,nop,TS val 13909963 ecr 504988986], length 0
^C
17 packets captured
21 packets received by filter
0 packets dropped by kernel

Petites explications basiques sur le premier paquet capturé:

00:16:11.725924 : Correspond à l’heure.
IP : Correspond au type de protocole.
192.168.1.200.ssh : Correspond à l’ip et au port source. (Le port 22 étant associé au ssh, tcpdump préfère convertir le port 22 en « ssh ». Pour laisser le n° du port, il faut utiliser l’option -n).
192.168.1.134.42427 : Correspond à l’ip et au port destination.
Flags [P.] : Correspond au flag TCP. Ici, le flag PUSH et ACK.
seq 1973231107:1973231303 : Correspond au n° de séquence TCP.
ack 1754903922 : Correspond au n° d’acquittement TCP.
win 261 : Correspond à la taille de la fenêtre TCP.
options […] : Correspond aux options TCP.
length 196 : Correspond à la taille du paquet IP avec l’en-tête en Bytes.

C’est basique je vous l’accorde mais je ne vais pas m’étaler sur le protocole TCP/IP dans cet article. En revanche je vais vous donner quelques exemples concrets. Mais avant voyons les options les plus utiles :

-D : Lister les interfaces disponibles :
-i <interface> : Écoute sur une interface spécifique :
-n : Ne résous pas les ip et ports en noms.
-v | -vv | -vvv : Affiche plus ou moins d’informations.
-cx : Capture x paquets uniquement.
-x : Affiche le contenu du paquet en HEX.
-A : Affiche le contenu du paquet en ASCII.
-X : Affiche le contenu du paquet en HEX et ASCII.
-s <len>: Capture uniquement <len> bytes du paquet. s0 indique qu’on capture le paquet entier.
-w : Capture les paquets dans un fichier.

Maintenant voyons un peu les filtres :

host <host> : Capture les paquets ayant pour adresse source ou destination, l’ip (ou le nom) <host>.
src host <host> : Capture les paquets ayant pour adresse source l’ip (ou le nom) <host>.
dst host <host> : Capture les paquets ayant pour adresse destination l’ip (ou le nom) <host>.
src|dst port <port> : Idem que pour les host mais pour les ports.

Maintenant le but du jeu va être de combiner ces options pour en faire des utilisations plus concrètes :

Je veux capturer les paquets DNS (udp/53) de mon interface eth0 :

root@lisa:~# tcpdump -i eth0 udp port 53
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
21:26:28.240365 IP 192.168.1.200.43766 > 192.168.1.254.domain: 48866+ PTR? 254.1.168.192.in-addr.arpa. (44)
21:26:28.240696 IP 192.168.1.254.domain > 192.168.1.200.43766: 48866 NXDomain* 0/0/0 (44)
21:26:39.726446 IP 192.168.1.200.57946 > 192.168.1.254.domain: 32414+ A? www.google.fr. (31)
21:26:39.726917 IP 192.168.1.254.domain > 192.168.1.200.57946: 32414 1/0/0 A 64.233.166.94 (47)
21:26:39.744172 IP 192.168.1.200.58755 > 192.168.1.254.domain: 58563+ PTR? 94.166.233.64.in-addr.arpa. (44)
21:26:39.755492 IP 192.168.1.254.domain > 192.168.1.200.58755: 58563 1/0/0 PTR wm-in-f94.1e100.net. (77)
21:27:03.551733 IP 192.168.1.200.36250 > 192.168.1.254.domain: 48944+ A? lisa. (22)
21:27:03.551853 IP 192.168.1.200.36250 > 192.168.1.254.domain: 12334+ AAAA? lisa. (22)

Maintenant à l’inverse, je veux tous les paquets udp, sauf ceux concernant le DNS et sans les résolutions de nom. On peut cumuler les filtres grâce au opérateur « and » ou « or » :

root@lisa:~# tcpdump -i eth0 -n udp and port not 53
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
21:45:14.711203 IP 192.168.1.254.1900 > 239.255.255.250.1900: UDP, length 271
21:45:14.711336 IP 192.168.1.254.1900 > 239.255.255.250.1900: UDP, length 283
21:45:14.711424 IP 192.168.1.254.1900 > 239.255.255.250.1900: UDP, length 343
21:45:14.711531 IP 192.168.1.254.1900 > 239.255.255.250.1900: UDP, length 335

Je veux capturer les paquets ICMP qui sortent de mon interface :

root@lisa:~# tcpdump -i eth0 -n icmp and src host 192.168.1.200
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
21:52:42.381326 IP 192.168.1.200 > 8.8.8.8: ICMP echo request, id 22452, seq 1, length 64
21:52:43.383057 IP 192.168.1.200 > 8.8.8.8: ICMP echo request, id 22452, seq 2, length 64
21:52:44.386720 IP 192.168.1.200 > 8.8.8.8: ICMP echo request, id 22452, seq 3, length 64
21:52:45.388332 IP 192.168.1.200 > 8.8.8.8: ICMP echo request, id 22452, seq 4, length 64
21:52:46.389910 IP 192.168.1.200 > 8.8.8.8: ICMP echo request, id 22452, seq 5, length 64

J’aurais aussi pu réaliser cette capture qui va récupérer uniquement les paquets ICMP echo-reply (type 8) :

root@lisa:~# tcpdump -i eth0 -n icmp[0]=8
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
22:07:47.306643 IP 192.168.1.200 > 8.8.8.8: ICMP echo request, id 26647, seq 196, length 64
22:07:48.308459 IP 192.168.1.200 > 8.8.8.8: ICMP echo request, id 26647, seq 197, length 64
22:07:49.310009 IP 192.168.1.200 > 8.8.8.8: ICMP echo request, id 26647, seq 198, length 64

Si maintenant je veux exporter a capture dans un fichier pcap pour l’analyser avec wireshark ensuite

root@lisa:~# tcpdump -n -w capture.pcap
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
^C39 packets captured
44 packets received by filter
0 packets dropped by kernel

Dans le cas où on redirige dans un fichier on ne voit pas s’afficher les traces à l’écran pourtant comme vous le voyez dans le récapitulatif final, des paquets ont bien été capturés. Si je récupère le fichier, je peux bien l’analyser avec wireshark !

tcpdump_wireshark

Maintenant on va capturer l’intégralité (-s0) des paquets lors d’une connexion FTP et les afficher en HEXA et ASCII (-X) :

root@bart:[~] # tcpdump -n -s0 -X port ftp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
22:27:32.157993 IP 37.187.2.6.50106 > 212.27.63.3.21: Flags [S], seq 1786100466, win 14600, options [mss 1460,sackOK,TS val 1370348715 ecr 0,nop,wscale 7], length 0
    0x0000:  4500 003c 6659 4000 4006 9983 25bb 0206  E..<fY@.@...%...
    0x0010:  d41b 3f03 c3ba 0015 6a75 baf2 0000 0000  ..?.....ju......
    0x0020:  a002 3908 3b0e 0000 0204 05b4 0402 080a  ..9.;...........
    0x0030:  51ad dcab 0000 0000 0103 0307            Q...........
22:27:32.163061 IP 212.27.63.3.21 > 37.187.2.6.50106: Flags [S.], seq 1245050853, ack 1786100467, win 4380, options [mss 1460], length 0
    0x0000:  4500 002c 0000 4000 3906 06ed d41b 3f03  E..,..@.9.....?.
    0x0010:  25bb 0206 0015 c3ba 4a35 f7e5 6a75 baf3  %.......J5..ju..
    0x0020:  6012 111c 20c7 0000 0204 05b4 0000       `.............
22:27:32.163130 IP 37.187.2.6.50106 > 212.27.63.3.21: Flags [.], ack 1, win 14600, length 0
    0x0000:  4500 0028 665a 4000 4006 9996 25bb 0206  E..(fZ@.@...%...
    0x0010:  d41b 3f03 c3ba 0015 6a75 baf3 4a35 f7e6  ..?.....ju..J5..
    0x0020:  5010 3908 3afa 0000                      P.9.:...
22:27:32.168929 IP 212.27.63.3.21 > 37.187.2.6.50106: Flags [P.], seq 1:87, ack 1, win 4380, length 86
    0x0000:  4500 007e 7e68 4000 3906 8832 d41b 3f03  E..~~h@.9..2..?.
    0x0010:  25bb 0206 0015 c3ba 4a35 f7e6 6a75 baf3  %.......J5..ju..
    0x0020:  5018 111c 2297 0000 3232 3020 5365 7276  P..."...220.Serv
    0x0030:  6575 7220 6465 206d 6973 6520 6120 6a6f  eur.de.mise.a.jo
    0x0040:  7572 2064 6573 2070 6167 6573 2070 6572  ur.des.pages.per
    0x0050:  736f 2064 6520 4672 6565 2e66 7220 7665  so.de.Free.fr.ve
    0x0060:  7273 696f 6e20 5b41 7072 2032 3720 3230  rsion.[Apr.27.20
    0x0070:  3131 2031 313a 3433 3a35 355d 0d0a       11.11:43:55]..
22:27:32.169010 IP 37.187.2.6.50106 > 212.27.63.3.21: Flags [.], ack 87, win 14600, length 0
    0x0000:  4510 0028 665b 4000 4006 9985 25bb 0206  E..(f[@.@...%...
    0x0010:  d41b 3f03 c3ba 0015 6a75 baf3 4a35 f83c  ..?.....ju..J5.<
    0x0020:  5010 3908 3afa 0000                      P.9.:...
22:27:36.816081 IP 37.187.2.6.50106 > 212.27.63.3.21: Flags [P.], seq 1:21, ack 87, win 14600, length 20
    0x0000:  4510 003c 665c 4000 4006 9970 25bb 0206  E..<f\@.@..p%...
    0x0010:  d41b 3f03 c3ba 0015 6a75 baf3 4a35 f83c  ..?.....ju..J5.<
    0x0020:  5018 3908 3b0e 0000 5553 4552 2061 726e  P.9.;...USER.arn
    0x0030:  6175 642e 6b75 6e74 7a31 0d0a            aud.kuntz1..
22:27:36.821048 IP 212.27.63.3.21 > 37.187.2.6.50106: Flags [.], ack 21, win 4380, length 0
    0x0000:  4500 0028 7e69 4000 3906 8887 d41b 3f03  E..(~i@.9.....?.
    0x0010:  25bb 0206 0015 c3ba 4a35 f83c 6a75 bb07  %.......J5.<ju..
    0x0020:  5010 111c 381a 0000 0000 0000 0000       P...8.........
22:27:36.827143 IP 212.27.63.3.21 > 37.187.2.6.50106: Flags [P.], seq 87:129, ack 21, win 4380, length 42
    0x0000:  4500 0052 7e6a 4000 3906 885c d41b 3f03  E..R~j@.9..\..?.
    0x0010:  25bb 0206 0015 c3ba 4a35 f83c 6a75 bb07  %.......J5.<ju..
    0x0020:  5018 111c dfc4 0000 3333 3120 5061 7373  P.......331.Pass
    0x0030:  776f 7264 2072 6571 7569 7265 6420 666f  word.required.fo
    0x0040:  7220 6172 6e61 7564 2e6b 756e 747a 312e  r.arnaud.kuntz1.
    0x0050:  0d0a                                     ..
22:27:36.827193 IP 37.187.2.6.50106 > 212.27.63.3.21: Flags [.], ack 129, win 14600, length 0
    0x0000:  4510 0028 665d 4000 4006 9983 25bb 0206  E..(f]@.@...%...
    0x0010:  d41b 3f03 c3ba 0015 6a75 bb07 4a35 f866  ..?.....ju..J5.f
    0x0020:  5010 3908 3afa 0000                      P.9.:...
22:27:44.170608 IP 37.187.2.6.50106 > 212.27.63.3.21: Flags [P.], seq 21:44, ack 129, win 14600, length 23
    0x0000:  4510 003f 665e 4000 4006 996b 25bb 0206  E..?f^@.@..k%...
    0x0010:  d41b 3f03 c3ba 0015 6a75 bb07 4a35 f866  ..?.....ju..J5.f
    0x0020:  5018 3908 3b11 0000 5041 5353 206d 6f6e  P.9.;...PASS.mon
    0x0030:  206d 6f74 2064 6520 7061 7373 650d 0a    .mot.de.passe..
22:27:44.176675 IP 212.27.63.3.21 > 37.187.2.6.50106: Flags [P.], seq 129:157, ack 44, win 4380, length 28
    0x0000:  4500 0044 7e6b 4000 3906 8869 d41b 3f03  E..D~k@.9..i..?.
    0x0010:  25bb 0206 0015 c3ba 4a35 f866 6a75 bb1e  %.......J5.fju..
    0x0020:  5018 111c 028d 0000 3533 3020 4c6f 6769  P.......530.Logi
    0x0030:  6e20 696e 636f 7272 6563 742e 205b 3637  n.incorrect..[67
    0x0040:  315d 0d0a                                1]..

Vous voyez le contenu des paquets en HEXA et ASCII. Ca peut faire vormir certes mais on peut voir des choses interessantes. Si vous faites attention vous verrez les commandes USER et PASS envoyées au serveur FTP et on voit que les données transitent en clair… Bon vous remarquerez aussi que j’ai mis un mot de passe bidon hein 😉

Voilà, je vous encourage vivement à creuser cet outil car très puissant. N’hésitez pas à essayer des combinaisons d’options et voir comment il réagi. A noter que tcpdump s’avère extrement puissant pour debugger des situations. Il permet de comprendre le comportement d’un point de vue réseau.

Si vous voulez un récapitulatif des commandes les plus courantes avec tcpdump, le site packetlife propose un document parfait à mettre sur votre chevet.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.