TShark, l’autre TcpDump
Date: 8/03/2010 | Catégories: Open-source,Planet-libre,Reseau | Tags: cli,tshark,wireshark
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 8)
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.