TShark, l'autre TcpDump
TShark est un logiciel avec une interface de type ligne de commande permettant d'analyser les protocoles réseaux capturé depuis une interface (en utilisant la librairie libpcap) ou depuis un fichier de capture au format Wireshark. Développé en parallèle de Wireshark, il est distribué sous licence GNU GPL.
Installation de TShark
Sous Ubuntu, il suffit de l'installer à partir des dépôts avec la commande suivante:
sudo aptitude install tshark
Remarque: il est également possible de faire l'installation depuis les sources.
Définir la source du trafic à analyser
Deux solutions sont envisageables. La première est de capturer le trafic à partir d'une interface physique compatible. Pour avoir la liste de ces interfaces, on utilisera l'option -D de TShark:
sudo tshark -D 1. eth0 2. wmaster0 3. wlan0 4. usbmon1 (USB bus number 1) 5. usbmon2 (USB bus number 2) 6. usbmon3 (USB bus number 3) 7. usbmon4 (USB bus number 4) 8. usbmon5 (USB bus number 5) 9. usbmon6 (USB bus number 6) 10. usbmon7 (USB bus number 7) 11. usbmon8 (USB bus number 12. any (Pseudo-device that captures on all interfaces) 13. lo
Ainsi si l'on souhaite analyser les protocoles des flux transitant par l'interface ethernet par défaut (eth0), il suffit de saisir la commande suivante:
sudo tshark -i eth0 Running as user "root" and group "root". This could be dangerous. Capturing on eth0 0.000000 Xensourc_8b:f0:9e -> Broadcast ARP Who has 192.168.29.161? Tell 192.168.29.171 0.021079 Netgear_b7:46:4a -> Spanning-tree-(for-bridges)_00 STP RST. Root = 32768/0/00:12:a9:81:5f:e0 Cost = 200000 Port = 0x8001 0.182159 HewlettP_64:6e:2c -> Broadcast ARP Who has 192.168.29.161? Tell 192.168.29.1 0.325894 HewlettP_64:6e:a0 -> Broadcast ARP Who has 192.168.29.161? Tell 192.168.29.2 ...
Il est également possible d'analyser les flux de manière "off-line". Pour cela, il faut dans un premier temps capturer le trafic dans un fichier à l'aide d'un logiciel comme Wireshark, TShark (ou tout autre logiciel dont le format est pris en charge, voir la liste de ces formats avec la commande "sudo tshark -F"), puis fournir ce fichier en entrée de TShark avec l'option -r:
sudo tshark -r capture.cap 1 0.000000 HewlettP_64:6e:a0 -> Broadcast ARP Who has 192.168.29.161? Tell 192.168.29.2 2 0.020195 HewlettP_64:6e:2c -> Broadcast ARP Who has 192.168.29.161? Tell 192.168.29.1 3 0.576826 192.168.29.75 -> 255.255.255.255 UDP Source port: 17500 Destination port: 17500 4 0.577044 192.168.29.75 -> 192.168.29.255 UDP Source port: 17500 Destination port: 17500 5 0.585752 Xensourc_8b:f0:9e -> Broadcast ARP Who has 192.168.29.120? Tell 192.168.29.171 6 0.589851 HewlettP_64:6e:2c -> Broadcast ARP Who has 192.168.29.120? Tell 192.168.29.1 ...
Les options de capture
De base (c'est à dire si aucune option complémentaire est donnée), TShark analyse le trafic jusqu'à ce que l'utilisateur presse les touches CTRL-C. Dans le cadre d'un processus automatisé, il est possible de définir quand la capture doit s'arrêter en utilisant l'option -a. Quelques exemples:
Capture et analyse le trafic pendant 10 secondes:
sudo tshark -i eth0 -a duration:10
Capture et analyse 100 paquets (si un filtre de capture est utilisé, on capturera 100 paquets filtrés):
sudo tshark -i eth0 -c 100
Si on capture vers un fichier, on peut fixer la taille maximale de ce dernier à 5 Ko:
sudo tshark -i eth0 -a filesize:5 -w /tmp/capture.cap
Les options d'affichage
TShark affiche par défaut les informations au format texte (c'est à dire lisible par un humain geek).
sudo tshark -i eth0 2.536745 192.168.29.148 -> 192.168.29.1 DNS Standard query A safebrowsing-cache.google.com 2.537232 192.168.29.1 -> 192.168.29.148 DNS Standard query response CNAME safebrowsing.cache.l.google.com A 74.125.10.151 2.537347 192.168.29.148 -> 74.125.10.151 TCP 38883 > http [SYN] Seq=0 Win=5840 Len=0 MSS=1460 TSV=171324902 TSER=0 WS=6 2.568103 74.125.10.151 -> 192.168.29.148 TCP http > 38883 [SYN, ACK] Seq=0 Ack=1 Win=1460 Len=0 MSS=1460 TSV=966567702 TSER=171324902 WS=6 2.568140 192.168.29.148 -> 74.125.10.151 TCP 38883 > http [ACK] Seq=1 Ack=1 Win=5888 Len=0 TSV=171324910 TSER=966567702 2.568243 192.168.29.148 -> 74.125.10.151 TCP [TCP segment of a reassembled PDU] 2.568253 192.168.29.148 -> 74.125.10.151 HTTP GET /safebrowsing/rd/ChNnb29nLW1hbHdhcmUtc2hhdmFyEAEY9-oBIPvqASoFenUAAAMyBXd1AAAH HTTP/1.1 2.578253 HewlettP_64:6e:2c -> Broadcast ARP Who has 192.168.29.161? Tell 192.168.29.1 2.601627 HewlettP_64:6e:a0 -> Broadcast ARP Who has 192.168.29.161? Tell 192.168.29.2 2.605201 74.125.10.151 -> 192.168.29.148 TCP http > 38883 [ACK] Seq=1 Ack=731 Win=7296 Len=0 TSV=966567739 TSER=171324910 2.605226 74.125.10.151 -> 192.168.29.148 TCP http > 38883 [ACK] Seq=1 Ack=1045 Win=8768 Len=0 TSV=966567739 TSER=171324910 2.607870 74.125.10.151 -> 192.168.29.148 TCP [TCP segment of a reassembled PDU] 2.607885 192.168.29.148 -> 74.125.10.151 TCP 38883 > http [ACK] Seq=1045 Ack=269 Win=6912 Len=0 TSV=171324920 TSER=966567741 2.612201 74.125.10.151 -> 192.168.29.148 TCP [TCP segment of a reassembled PDU] ...
Il est possible de modifier et customiser cet affichage. Par exemple, TShark embarque deux modules permettant d'afficher les paquets au format XML: PDML ou PSML.
Affichage au format PDML:
sudo tshark -i eth0 -T pdml <?xml version="1.0"?> <pdml version="0" creator="wireshark/1.2.2"> Running as user "root" and group "root". This could be dangerous. Capturing on eth0 <packet> <proto name="geninfo" pos="0" showname="General information" size="60"> <field name="num" pos="0" show="1" showname="Number" value="1" size="60"/> <field name="len" pos="0" show="60" showname="Frame Length" value="3c" size="60"/> <field name="caplen" pos="0" show="60" showname="Captured Length" value="3c" size="60"/> <field name="timestamp" pos="0" show="Mar 8, 2010 15:43:33.098604000" showname="Captured Time" value="1268059413.098604000" size="60"/> </proto> <proto name="frame" showname="Frame 1 (60 bytes on wire, 60 bytes captured)" size="60" pos="0"> <field name="frame.time" showname="Arrival Time: Mar 8, 2010 15:43:33.098604000" size="0" pos="0" show="Mar 8, 2010 15:43:33.098604000"/> <field name="frame.time_delta" showname="Time delta from previous captured frame: 0.000000000 seconds" size="0" pos="0" show="0.000000000"/> <field name="frame.time_delta_displayed" showname="Time delta from previous displayed frame: 0.000000000 seconds" size="0" pos="0" show="0.000000000"/> <field name="frame.time_relative" showname="Time since reference or first frame: 0.000000000 seconds" size="0" pos="0" show="0.000000000"/> <field name="frame.number" showname="Frame Number: 1" size="0" pos="0" show="1"/> <field name="frame.len" showname="Frame Length: 60 bytes" size="0" pos="0" show="60"/> <field name="frame.cap_len" showname="Capture Length: 60 bytes" size="0" pos="0" show="60"/> <field name="frame.marked" showname="Frame is marked: False" size="0" pos="0" show="0"/> <field name="frame.protocols" showname="Protocols in frame: eth:arp" size="0" pos="0" show="eth:arp"/> </proto> <proto name="eth" showname="Ethernet II, Src: HewlettP_64:6e:2c (00:1f:29:64:6e:2c), Dst: Broadcast (ff:ff:ff:ff:ff:ff)" size="14" pos="0"> <field name="eth.dst" showname="Destination: Broadcast (ff:ff:ff:ff:ff:ff)" size="6" pos="0" show="ff:ff:ff:ff:ff:ff" value="ffffffffffff"> <field name="eth.addr" showname="Address: Broadcast (ff:ff:ff:ff:ff:ff)" size="6" pos="0" show="ff:ff:ff:ff:ff:ff" value="ffffffffffff"/> <field name="eth.ig" showname=".... ...1 .... .... .... .... = IG bit: Group address (multicast/broadcast)" size="3" pos="0" show="1" value="1" unmaskedvalue="ffffff"/> <field name="eth.lg" showname=".... ..1. .... .... .... .... = LG bit: Locally administered address (this is NOT the factory default)" size="3" pos="0" show="1" value="1" unmaskedvalue="ffffff"/> </field> <field name="eth.src" showname="Source: HewlettP_64:6e:2c (00:1f:29:64:6e:2c)" size="6" pos="6" show="00:1f:29:64:6e:2c" value="001f29646e2c"> <field name="eth.addr" showname="Address: HewlettP_64:6e:2c (00:1f:29:64:6e:2c)" size="6" pos="6" show="00:1f:29:64:6e:2c" value="001f29646e2c"/> <field name="eth.ig" showname=".... ...0 .... .... .... .... = IG bit: Individual address (unicast)" size="3" pos="6" show="0" value="0" unmaskedvalue="001f29"/> <field name="eth.lg" showname=".... ..0. .... .... .... .... = LG bit: Globally unique address (factory default)" size="3" pos="6" show="0" value="0" unmaskedvalue="001f29"/> </field> <field name="eth.type" showname="Type: ARP (0x0806)" size="2" pos="12" show="0x0806" value="0806"/> <field name="eth.trailer" showname="Trailer: 000000000000000000000000000000000000" size="18" pos="42" show="00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00" value="000000000000000000000000000000000000"/> </proto> <proto name="arp" showname="Address Resolution Protocol (request)" size="28" pos="14"> <field name="arp.hw.type" showname="Hardware type: Ethernet (0x0001)" size="2" pos="14" show="0x0001" value="0001"/> <field name="arp.proto.type" showname="Protocol type: IP (0x0800)" size="2" pos="16" show="0x0800" value="0800"/> <field name="arp.hw.size" showname="Hardware size: 6" size="1" pos="18" show="6" value="06"/> <field name="arp.proto.size" showname="Protocol size: 4" size="1" pos="19" show="4" value="04"/> <field name="arp.opcode" showname="Opcode: request (0x0001)" size="2" pos="20" show="0x0001" value="0001"/> <field name="arp.isgratuitous" showname="Is gratuitous: False" size="2" pos="20" show="0" value="0001"/> <field name="arp.src.hw_mac" showname="Sender MAC address: HewlettP_64:6e:2c (00:1f:29:64:6e:2c)" size="6" pos="22" show="00:1f:29:64:6e:2c" value="001f29646e2c"/> <field name="arp.src.proto_ipv4" showname="Sender IP address: 192.168.29.1 (192.168.29.1)" size="4" pos="28" show="192.168.29.1" value="c0a81d01"/> <field name="arp.dst.hw_mac" showname="Target MAC address: 00:00:00_00:00:00 (00:00:00:00:00:00)" size="6" pos="32" show="00:00:00:00:00:00" value="000000000000"/> <field name="arp.dst.proto_ipv4" showname="Target IP address: 192.168.29.161 (192.168.29.161)" size="4" pos="38" show="192.168.29.161" value="c0a81da1"/> </proto> </packet> ...
La dernière méthode permet de customiser soit même les informations à afficher:
sudo tshark -i eth0 -T fields -e ip.addr -e tcp.port Running as user "root" and group "root". This could be dangerous. Capturing on eth0 209.172.41.53 80 209.172.41.53 80 192.168.29.1 192.168.29.148 209.172.41.53 80 192.168.29.148 34521 209.172.41.53 80 192.168.29.148 34522 209.172.41.53 80 192.168.29.148 34523 209.172.41.53 80 209.172.41.53 80 209.172.41.53 80 224.0.0.251 192.168.29.148 34523 ...
Les filtres de base
Selon ou le logiciel TShark sera lancé, le nombre de paquets à analyser peut devenir très important. Heureusement, TShark propose un système de filtre permettant de se focaliser sur les protocoles utiles à notre analyse.
TShark propose deux types de filtres:
- les filtres de capture: permettant de filtrer le capture au moment de la capture
- les filtres d'affichage: permet de filtrer avant l'affichage
Le seul hic est que les deux syntaxes ne sont pas les mêmes. Les filtres de capture obéissent à une syntaxe propre à libpcap (faire un "man pcap-filter" pour une description exhaustive) tandis que les filtres d'affichage sont définie par le projet Wireshark (voir le manuel en ligne ici).On peut remarquer la richesse des filtres d'affichage qui permettent de remonter très haut dans la couche OSI.
Par exemple pour filtrer le trafic HTTP (TCP port 80) avant la capture:
sudo tshark -i eth0 port 80 Running as user "root" and group "root". This could be dangerous. Capturing on eth0 0.000000 192.168.29.148 -> 67.228.110.120 TCP 47593 > http [SYN] Seq=0 Win=5840 Len=0 MSS=1460 TSV=171057533 TSER=0 WS=6 0.182873 67.228.110.120 -> 192.168.29.148 TCP http > 47593 [SYN, ACK] Seq=0 Ack=1 Win=1460 Len=0 MSS=1460 TSV=154345319 TSER=171057533 WS=9 0.182924 192.168.29.148 -> 67.228.110.120 TCP 47593 > http [ACK] Seq=1 Ack=1 Win=5888 Len=0 TSV=171057578 TSER=154345319 0.183029 192.168.29.148 -> 67.228.110.120 HTTP GET /docs/man-pages/tshark.html HTTP/1.1
Alors quer pour capturer l'ensemble du trafic et afficher seulement le trafic HTTP:
sudo tshark -i eth0 -R tcp.port==80 Running as user "root" and group "root". This could be dangerous. Capturing on eth0 3.127743 192.168.29.148 -> 67.228.110.120 TCP 47599 > http [SYN] Seq=0 Win=5840 Len=0 MSS=1460 TSV=171071304 TSER=0 WS=6 3.308054 67.228.110.120 -> 192.168.29.148 TCP http > 47599 [SYN, ACK] Seq=0 Ack=1 Win=1460 Len=0 MSS=1460 TSV=154350827 TSER=171071304 WS=9 3.308096 192.168.29.148 -> 67.228.110.120 TCP 47599 > http [ACK] Seq=1 Ack=1 Win=5888 Len=0 TSV=171071349 TSER=154350827 3.308182 192.168.29.148 -> 67.228.110.120 HTTP GET /docs/man-pages/tshark.html HTTP/1.1
Affichage au format PSML:
sudo tshark -i eth0 -T psml <?xml version="1.0"?> <psml version="0" creator="wireshark/1.2.2"> Running as user "root" and group "root". This could be dangerous. Capturing on eth0 <structure> <section>No.</section> <section>Time</section> <section>Source</section> <section>Destination</section> <section>Protocol</section> <section>Info</section> </structure> <packet> <section>1</section> <section>0.000000</section> <section>Netgear_b7:46:4a</section> <section>Spanning-tree-(for-bridges)_00</section> <section>STP</section> <section>RST. Root = 32768/0/00:12:a9:81:5f:e0 Cost = 200000 Port = 0x8001</section> </packet> ...
Les filtres avancées
Via l'option -z, TShark donne l'accès à des statistiques intéressants selon le protocole que vous avez à analyser.
Le premier d'entre eux permet de générer un rapport avec la hiérarchie des protocoles capturés:
sudo tshark -i eth0 -z io,phs =================================================================== Protocol Hierarchy Statistics Filter: frame frame frames:206 bytes:79513 eth frames:206 bytes:79513 llc frames:11 bytes:660 stp frames:11 bytes:660 arp frames:77 bytes:4584 ip frames:118 bytes:74269 tcp frames:59 bytes:22417 ssl frames:11 bytes:11280 http frames:2 bytes:502 data-text-lines frames:1 bytes:264 tcp.segments frames:8 bytes:5607 ssl frames:8 bytes:5607 msnms frames:2 bytes:145 rtsp frames:12 bytes:3283 udp frames:54 bytes:51342 data frames:45 bytes:47992 cflow frames:2 bytes:2484 dns frames:4 bytes:590 rtp frames:3 bytes:276 icmp frames:5 bytes:510 ===================================================================
Associé à un filtre il est possible d'afficher une répartition dans le temps des paquets et de la taille associée;
sudo tshark -i eth0 -z io,stat,1,tcp.port==80 =================================================================== IO Statistics Interval: 1.000 secs Column #0: | Column #0 Time |frames| bytes 000.000-001.000 4 240 001.000-002.000 5 312 002.000-003.000 6 1146 003.000-004.000 61 18627 004.000-005.000 76 30832 005.000-006.000 45 16263 006.000-007.000 95 40326 007.000-008.000 107 50010 008.000-009.000 81 30109 009.000-010.000 125 58044 010.000-011.000 75 46597 011.000-012.000 236 155959 012.000-013.000 32 15852 013.000-014.000 2 531 ===================================================================
On peut également afficher une table de trafic IP (source <-> destination). Il est également possible de faire de même seulment sur le trafic TCP (-z conv,tcp) ou UDP (-z conv,udp):
sudo tshark -i eth0 -z conv,ip ================================================================================ IPv4 Conversations Filter:<No Filter> | <- | | -> | | Total | | Frames Bytes | | Frames Bytes | | Frames Bytes | 192.168.29.148 <-> 74.125.39.18 79 39420 93 36753 172 76173 192.168.29.148 <-> 74.125.39.17 45 27618 45 17223 90 44841 192.168.29.148 <-> 74.125.39.83 30 18291 26 11999 56 30290 192.168.29.148 <-> 74.125.39.106 6 751 11 8970 17 9721 192.168.29.148 <-> 74.125.39.101 7 2954 9 3012 16 5966 192.168.29.148 <-> 74.125.39.189 6 968 8 2382 14 3350 192.168.29.148 <-> 192.168.29.1 4 1198 4 311 8 1509 209.85.137.125 <-> 192.168.29.148 2 132 2 750 4 882 192.168.29.148 <-> 65.54.49.141 1 74 2 137 3 211 192.168.254.2 <-> 192.168.29.148 0 0 1 1506 1 1506 193.48.73.22 <-> 192.168.29.148 1 46 0 0 1 46 ================================================================================
Si vous devez faire une analyse d'un flux multimédia basé sur RTP, alors l'option suivante va vous permettre d'afficher un rapport sur ces flux:
sudo tshark -i eth0 -z rtp,streams ========================= RTP Streams ======================== Src IP addr Port Dest IP addr Port SSRC Payload Pkts Lost Max Delta(ms) Max Jitter(ms) Mean Jitter(ms) Problems? 192.168.200.100 50013 192.168.29.148 55373 0x83AAE473 Unknown (72) 1 0 (0.0%) 0.00 0.00 0.00 X 192.168.29.148 55373 192.168.200.100 55372 0x16AE7E09 Unknown (73) 11 -10 (-1000.0%) 0.00 0.00 0.00 X 192.168.200.100 50013 192.168.29.148 55373 0x83AAE477 Unknown (72) 1 0 (0.0%) 0.00 0.00 0.00 X 192.168.200.100 50013 192.168.29.148 55373 0x83AAE47D Unknown (72) 1 0 (0.0%) 0.00 0.00 0.00 X 192.168.200.100 50013 192.168.29.148 55373 0x83AAE483 Unknown (72) 1 0 (0.0%) 0.00 0.00 0.00 X 192.168.200.100 50013 192.168.29.148 55373 0x83AAE488 Unknown (72) 1 0 (0.0%) 0.00 0.00 0.00 X 192.168.200.100 50013 192.168.29.148 55373 0x83AAE48E Unknown (72) 1 0 (0.0%) 0.00 0.00 0.00 X 192.168.200.100 50013 192.168.29.148 55373 0x83AAE492 Unknown (72) 1 0 (0.0%) 0.00 0.00 0.00 X 192.168.200.100 50013 192.168.29.148 55373 0x83AAE498 Unknown (72) 1 0 (0.0%) 0.00 0.00 0.00 X 192.168.200.100 50013 192.168.29.148 55373 0x83AAE49D Unknown (72) 1 0 (0.0%) 0.00 0.00 0.00 X 192.168.200.100 50013 192.168.29.148 55373 0x83AAE4A1 Unknown (72) 1 0 (0.0%) 0.00 0.00 0.00 X 192.168.200.100 50013 192.168.29.148 55373 0x83AAE4A5 Unknown (72) 1 0 (0.0%) 0.00 0.00 0.00 192.168.200.100 50013 192.168.29.148 55373 0x83AAE4AB Unknown (72) 1 0 (0.0%) 0.00 0.00 0.00 X 192.168.200.100 50013 192.168.29.148 55373 0x81CB0001 Unknown (73) 1 0 (0.0%) 0.00 0.00 0.00 ==============================================================
Si vous devez analyser les flux SMB (partage de fichier Samba ou Windows) alors TShark vous apporte les informations suivantes au niveau des délais:
sudo tshark -i eth0 -z smb,rtt =================================================================== SMB RTT Statistics: Filter: Commands Calls Min RTT Max RTT Avg RTT Close 1 0.00034 0.00034 0.00034 Open AndX 1 0.01968 0.01968 0.01968 Read AndX 3 0.00032 0.46561 0.15541 Negotiate Protocol 1 0.00079 0.00079 0.00079 Session Setup AndX 2 0.00071 0.00201 0.00136 Tree Connect AndX 1 0.00063 0.00063 0.00063 Transaction2 Commands Calls Min RTT Max RTT Avg RTT FIND_FIRST2 12 0.00073 0.01845 0.00520 QUERY_FS_INFO 1 0.00043 0.00043 0.00043 QUERY_PATH_INFO 174 0.00045 0.01445 0.00154 NT Transaction Commands Calls Min RTT Max RTT Avg RTT ===================================================================
Enfin il est possible d'analyser les flux de type VoIP SIP:
tshark -i em0 -z sip,stat =================================================================== SIP Statistics Number of SIP messages: 30 Number of resent SIP messages: 4 * SIP Status Codes in reply packets SIP 401 Unauthorized : 5 Packets SIP 200 OK : 5 Packets SIP 100 Trying : 10 Packets * List of SIP Request methods REGISTER : 10 Packets * Average setup time 0 ms Min 0 ms Max 0 ms ===================================================================
Conclusion
TShark est donc une très bonne alternative à tcpdump, l'outil standard des distributions GNU/Linux et BSD. Il apporte un lot impressionnant de filtres d'affichage et une gestion de rapport qui peut être d'une grande utilité pour certaines analyse réseau.