TShark, l’autre TcpDump

Date: 8/03/2010 | Catégories: Open-source,Planet-libre,Reseau | Tags: ,,

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

===================================================================

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.

  • Maxime

    Bonjour,
    j’aimerai voir apparaître la taille des paquets échangés mais je n’arrive pas a trouver la bonne option

    J’ai bien pensé à -C mais je ne sais pas quoi mettre

    Merci très bon tuto

    • castor

      # — url
      http://www.google.fr/#hl=fr&source=hp&q=Ubuntu+Manpage+tshark+Dump+and+analyze+network+traffic

      # — NAME

      tshark – Dump and analyze network traffic

      SYNOPSYS

      tshark [ -a ] …
      [ -b ] …
      [ -B ]
      [ -c ] [ -C ]
      [ -d ==, ] [ -D ]
      [ -e ] [ -E ] [ -f ]
      [ -F ] [ -h ] [ -i |- ] [ -l ] [ -L ]
      [ -n ] [ -N ] [ -o ] …
      [ -p ] [ -q ] [ -r ] [ -R ]
      [ -s ] [ -S ] [ -t ad|a|r|d|e ]
      [ -T pdml|psml|ps|text|fields ] [ -v ] [ -V ] [ -w |- ] [ -x ]
      [ -X ] [ -y ] [ -z ]
      [ ]

      # — comment
      -s

  • Pingback: Installation et utilisation de LOIC sous GNU/Linux()

  • imen

    c un très bon tuto. Sauf que que je cherche à filtrer par l’@ip non pa par le port .

    • => sudo tshark -f « host http://www.nicolargo.com » -i eth0

      RTFM (définition wikipédia: read the fucking manual (« lis le put*** de manuel », sous-entendu lire la documentation avant de poser des questions de base).

  • Ben

    Bonjour,

    Merci pour ce tuto, utilisant wireshark quotidiennement, la découverte de tshark m’a été véritablement utile.

    Par ailleurs, savez-vous s’il est possible d’afficher que certains protocoles au sein d’un même packet?

    Pour vous donner une meilleure compréhension de ma question, je vous donne un context. Lorsque le traffic est important, tshark (ou wireshark) va identifier dans un même packet plusieurs messages qui sont en fait plusieurs packets. Si je veux donc filtrer sur un type de message envoyé vers une destination précise, je vais donc avoir le packet contenant ce que je veux mais polluer par d’autres messages. On pourrait dire que la sélection est « inclusive » et non « exclusive ». Comment faire en sorte de la rendre « exclusive »?

  • Geoffrey

    Bonjour,
    j’aurais souhaité réaliser des mesures de RTT avec le protocole TCP ( flux SQL ), cela est-il possible?
    J’ai essayé avec la commande: tshark -R « mon flitre » -z tcp,rtt -r monfichiertexte.txt
    Le résultat est que tcp,rtt n’est pas une commande correcte..
    Merci d’avance!

  • Pingback: OUTILS | Pearltrees()

  • bluesman13

    Bonjour, tout d’abord merci pour ce tutoriel sur tshark. Il m’a permis de comprendre (un peu) mieux l’analyse des trames réseaux. Toutefois, comme je ne suis qu’un amateur éclairé, je bloque sur un besoin. Voilà, j’ai mis en place un partage de répertoire (samba) sur mon réseau local personnel, qui peut être accédé depuis Internet par quelques amis (en SSH avec FileZilla). Je voudrais mettre en place un filtre « tshark » que je puisse lancer à un instant donné pour vérifier quelles sont les adresses IP externes à mon réseau local qui sont connectées ? Est-ce possible ? facilement ? Merci par avance.

  • Pingback: Installation & Utilisation de LOIC()