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 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.

Vus : 2695
Publié par Nicolargo : 402