Introduction

TShark 是一个开源命令行网络流量分析器。它由 Wireshark 开发人员创建,具有 Wireshark 的大部分功能。它通常用作 Wireshark 的命令行版本。但是,它也可以像 tcpdump 一样使用。因此,它是进行全面数据包评估的首选。

学习目标

使用 TShark 过滤流量
在 TShark 中实现 Wireshark 过滤器
使用 TShark 扩展和自动化数据包过滤

Command-Line Packet Analysis Hints | TShark and Supplemental CLI Tools

命令行数据包分析提示

TShark 是一种基于文本的工具,适用于数据雕刻、深入的数据包分析和使用脚本的自动化。这种优势和灵活性源自 CLI 工具的本质,因为生成/处理的数据可以流水线传输到其他工具。数据包分析中最常用的工具如下。

工具/实用程序 目的和好处
capinfos 提供指定捕获文件详细信息的程序。建议在开始调查之前查看捕获文件的摘要。
grep 帮助搜索纯文本数据。
cut 帮助从指定数据源剪切部分行。
uniq 过滤重复的行/值。
nl 查看显示的行数。
sed 流编辑器。
awk 有助于模式搜索和处理的脚本语言。

注意:这些工具的示例用法在 Zeek 房间 中介绍。

打开终端并按照给出的说明进行操作。您可以通过切换到以下目录来跟随交互式材料。

  • cd Desktop/exercise-files/

Capinfos 演示

           user@ubuntu$ capinfos demo.pcapng 
File name: demo.pcapng
File type: Wireshark/tcpdump/... - pcap
File encapsulation: Ethernet
File timestamp precision: microseconds (6)
Packet size limit: file hdr: 65535 bytes
Number of packets: 4...
File size: 25 kB
Data size: 25 kB
Capture duration: 30.393704 seconds
First packet time: 2004-05-13 10:17:07.311224
Last packet time: 2004-05-13 10:17:37.704928
Data byte rate: 825 bytes/s
Data bit rate: 6604 bits/s
Average packet size: 583.51 bytes
Average packet rate: 1 packets/s
SHA256: 25a72bdf10339...
RIPEMD160: 6ef5f0c165a1d...
SHA1: 3aac91181c3b7...
Strict time order: True
Number of interfaces in file: 1
Interface #0 info:
Encapsulation = Ethernet (1 - ether)
Capture length = 65535
Time precision = microseconds (6)
Time ticks per second = 1000000
Number of stat entries = 0
Number of packets = 4...
..

TShark Fundamentals I | Main Parameters I

命令行界面和参数

TShark 是一个基于文本(命令行)的工具。因此,对获得的结果进行深入和连续的分析很容易。多个内置选项随时可用,帮助分析师进行此类调查。但是,学习参数是必不可少的;您将需要内置选项和相关参数来控制输出,而不会被 TShark 的详细输出淹没。下表解释了最常用的参数。请注意,TShark 需要超级用户权限才能嗅探实时流量并列出所有可用接口。

参数 目的
-h 显示包含最常用功能的帮助页面。tshark -h
-v 显示版本信息。tshark -v
-D 列出可用的嗅探接口。tshark -D
-i 选择一个接口来捕获实时流量。tshark -i 1 or tshark -i ens55
无参数 像 tcpdump 一样嗅探流量。tshark

让我们查看给定 VM 中 TShark 实例的版本信息。打开终端并按照给定的说明进行操作。

查看版本

           user@ubuntu$ tshark -v                           
TShark (Wireshark) 3 (Git v3. packaged as 3.)

Copyright 1998-2020 Gerald Combs and contributors. License GPLv2+: GNU GPL version 2 or later.
This is free software; see the source for copying conditions.
..

嗅探

嗅探是 TShark 的基本功能之一。计算机节点可以有多个网络接口,允许主机通过网络进行通信和嗅探流量。特定接口可能与特定任务/作业相关联。因此,选择嗅探接口的能力有助于用户决定和设置适当的嗅探接口。

让我们查看给定 VM 中的可用接口。

列出接口

           user@ubuntu$ sudo tshark -D
1. ens5
2. lo (Loopback)
3. any
4. bluetooth-monitor
5. nflog
..

嗅探可以在选择或不选择特定接口的情况下进行。选择特定接口后,TShark 会使用该接口嗅探流量。未选择任何接口时,TShark 将使用第一个可用接口,通常在终端中列为 1。没有接口参数是 -i 1 的别名。您还可以使用参数 -i 设置不同的嗅探接口。TShark 总是在嗅探开始时回显使用的接口名称。

嗅探流量

           # Sniffing with the default interface.
user@ubuntu$ tshark
Capturing on 'ens5'
1 0.000000 aaa.aaa.aaa.aaa ? bbb.bbb.bbb.bbb TCP 3372 ? 80 [SYN] Seq=0 Win=8760 Len=0 MSS=1460 SACK_PERM=1
2 0.911310 aaa.aaa.aaa.aaa ? bbb.bbb.bbb.bbb TCP 80 ? 3372 [SYN, ACK] Seq=0 Ack=1 Win=5840 Len=0 MSS=1380 SACK_PERM=1
3 0.911310 aaa.aaa.aaa.aaa ? bbb.bbb.bbb.bbb TCP 3372 ? 80 [ACK] Seq=1 Ack=1 Win=9660 Len=0
...
100 packets captured

# Choosing an interface
user@ubuntu$ tshark -i 2
Capturing on 'Loopback: lo'
...

TShark Fundamentals I | Main Parameters II

命令行界面和参数 II

让我们继续探索 TShark 的主要参数。

参数 目的
-r 读取/输入功能。读取捕获文件。tshark -r demo.pcapng
-c 数据包计数。捕获指定数量的数据包后停止。例如,捕获/过滤/读取 10 个数据包后停止。tshark -c 10
-w 写入/输出功能。将嗅探到的流量写入文件。tshark -w sample-capture.pcap
-V 详细。为每个数据包提供详细信息。此选项将提供类似于 Wireshark 的“数据包详细信息窗格”的详细信息。tshark -V
-q 静默模式。抑制终端上的数据包输出。tshark -q
-x 显示数据包字节。以十六进制和 ASCII 转储形式显示每个数据包的详细信息。tshark -x

读取捕获文件

TShark 还可以处理 PCAP 文件。您可以使用 -r 参数来处理文件并调查数据包。您可以使用 -c 参数限制显示的数据包数量。

读取数据

           user@ubuntu$ tshark -r demo.pcapng
1 0.000000 145.254.160.237 ? 65.208.228.223 TCP 3372 ? 80 [SYN] Seq=0 Win=8760 Len=0 MSS=1460 SACK_PERM=1
2 0.911310 65.208.228.223 ? 145.254.160.237 TCP 80 ? 3372 [SYN, ACK] Seq=0 Ack=1 Win=5840 Len=0 MSS=1380 SACK_PERM=1
3 0.911310 145.254.160.237 ? 65.208.228.223 TCP 3372 ? 80 [ACK] Seq=1 Ack=1 Win=9660 Len=0

..

# Read by count, show only the first 2 packets.
user@ubuntu$ tshark -r demo.pcapng -c 2
1 0.000000 145.254.160.237 ? 65.208.228.223 TCP 3372 ? 80 [SYN] Seq=0 Win=8760 Len=0 MSS=1460 SACK_PERM=1
2 0.911310 65.208.228.223 ? 145.254.160.237 TCP 80 ? 3372 [SYN, ACK] Seq=0 Ack=1 Win=5840 Len=0 MSS=1380 SACK_PERM=1

写入数据

TShark 还可以将嗅探或过滤的数据包写入文件。您可以使用 -w 参数将嗅探到的流量保存到文件中。此选项可帮助分析师从文件/流量中分离出特定数据包并保存以供进一步分析。它还允许分析师仅与更高级别的调查人员共享可疑数据包/范围。

写入数据

           # Read the first packet of the demo.pcapng, create write-demo.pcap and save the first packet there.
user@ubuntu$ tshark -r demo.pcapng -c 1 -w write-demo.pcap

# List the contents of the current folder.
user@ubuntu$ ls
demo.pcapng write-demo.pcap

# Read the write-demo.pcap and show the packet bytes/details.
user@ubuntu$ tshark -r write-demo.pcap
1 0.000000 145.254.160.237 ? 65.208.228.223 TCP 3372 ? 80 [SYN] Seq=0 Win=8760 Len=0 MSS=1460 SACK_PERM=1

显示数据包字节

TShark 可以以十六进制和 ASCII 格式显示数据包详细信息。您可以使用 -x 参数查看数据包的转储。一旦使用此参数,所有数据包都将以十六进制和 ASCII 格式显示。因此,可能很难一眼就发现异常,因此在减少数据包数量后使用此选项将更加有效。

显示数据包字节

           # Read the packets from write-demo.pcap
user@ubuntu$ tshark -r write-demo.pcap
1 0.000000 145.254.160.237 ? 65.208.228.223 TCP 3372 ? 80 [SYN] Seq=0 Win=8760 Len=0 MSS=1460 SACK_PERM=1

# Read the packets from write-demo.pcap and show the packet bytes/details.
user@ubuntu$ tshark -r write-demo.pcap -x
0000 fe ff 20 00 01 00 00 00 01 00 00 00 08 00 45 00 .. ...........E.
0010 00 30 0f 41 40 00 80 06 91 eb 91 fe a0 ed 41 d0 .0.A@.........A.
0020 e4 df 0d 2c 00 50 38 af fe 13 00 00 00 00 70 02 ...,.P8.......p.
0030 22 38 c3 0c 00 00 02 04 05 b4 01 01 04 02 "8............

详细程度

默认的 TShark 数据包处理和嗅探操作提供一行信息,并排除详细程度。默认方法可以轻松跟踪已处理/嗅探的数据包数量;但是,TShark 还可以在需要时为每个数据包提供详细程度。详细程度的提供方式与 Wireshark 的“数据包详细信息窗格”类似。由于详细程度提供了一长串数据包详细信息,因此建议对特定数据包使用该选项,而不是一系列数据包。

详细程度

           # Default view
user@ubuntu$ tshark -r demo.pcapng -c 1
1 0.000000 145.254.160.237 ? 65.208.228.223 TCP 3372 ? 80 [SYN] Seq=0 Win=8760 Len=0 MSS=1460 SACK_PERM=1

# Verbosity
user@ubuntu$ tshark -r demo.pcapng -c 1 -V
Frame 1: 62 bytes on wire (496 bits), 62 bytes captured (496 bits)
...
Ethernet II, Src: 00:00:01:00:00:00, Dst: fe:ff:20:00:01:00
...
Internet Protocol Version 4, Src: 145.254.160.237, Dst: 65.208.228.223
0100 .... = Version: 4
.... 0101 = Header Length: 20 bytes (5)
Total Length: 48
Identification: 0x0f41 (3905)
Flags: 0x4000, Don't fragment
Fragment offset: 0
Time to live: 128
Protocol: TCP (6)
Source: 145.254.160.237
Destination: 65.208.228.223
Transmission Control Protocol, Src Port: 3372, Dst Port: 80, Seq: 0, Len: 0
...

详细程度提供了完整的数据包详细信息,使得调查变得困难(每个数据包的终端输出很长且很复杂)。但是,它仍然有助于深入的数据包分析和脚本编写,使 TShark 脱颖而出。请记住,详细程度的最佳利用时间是在过滤数据包之后。您可以将上面的输出与下面的屏幕截图进行比较,看看您拥有的脚本编写、雕刻和关联机会!

TShark CLI vs Wireshark GUI

TShark Fundamentals II | Capture Conditions

捕获条件参数

作为网络嗅探器和数据包分析器,TShark 可以配置为计数数据包并在特定点停止或以循环结构运行。下面解释了最常见的参数。

参数 目的
定义单次运行/循环的捕获条件。完成条件后STOP。也称为“自动停止”。
-a 持续时间:嗅探流量并在 X 秒后停止。创建一个新文件并将输出写入其中。tshark -w test.pcap -a duration:1 文件大小:定义最大捕获文件大小。达到 X 文件大小(KB)后停止。tshark -w test.pcap -a filesize:10 文件:定义最大输出文件数。达到 X 文件后停止。tshark -w test.pcap -a filesize:10 -a files:3
环形缓冲区控制选项。定义多次运行/循环的捕获条件。(无限循环)
-b 持续时间:嗅探流量 X 秒,创建一个新文件并将输出写入其中。tshark -w test.pcap -b duration:1文件大小:定义最大捕获文件大小。在达到文件大小 X(KB)后创建一个新文件并将输出写入其中。tshark -w test.pcap -b filesize:10文件:定义输出文件的最大数量。在创建 X 个文件后重写第一个/最旧的文件。tshark -w test.pcap -b filesize:10 -b files:3

捕获条件参数仅在“捕获/嗅探”模式下有效。如果您尝试读取 pcap 文件并应用捕获条件参数,您将收到一条错误消息。这个想法是在实时捕获期间将捕获文件保存为特定大小以用于不同目的。如果您需要从特定捕获文件中提取各种数据包,则需要使用上一个任务中讨论的读写选项。

提示: TShark 支持将自动停止(-a)参数与环形缓冲区控制参数(-b)相结合。您可以根据需要组合参数。谨慎使用无限循环选项;请记住,您必须使用至少一个自动停止参数来停止无限循环。

自动停止查询示例

           # Start sniffing the traffic and stop after 2 seconds, and save the dump into 5 files, each 5kb.

user@ubuntu$ tshark -w autostop-demo.pcap -a duration:2 -a filesize:5 -a files:5
Capturing on 'ens5'
13

# List the contents of the current folder.
user@ubuntu$ ls
-rw------- 1 ubuntu ubuntu autostop-demo_..1_2022.pcap
-rw------- 1 ubuntu ubuntu autostop-demo_..2_2022.pcap
-rw------- 1 ubuntu ubuntu autostop-demo_..3_2022.pcap
-rw------- 1 ubuntu ubuntu autostop-demo_..4_2022.pcap
-rw------- 1 ubuntu ubuntu autostop-demo_..5_2022.pcap

TShark Fundamentals III | Packet Filtering Options: Capture vs. Display Filters

数据包过滤参数 | 捕获和显示过滤器

TShark 中的数据包过滤有两个维度:实时(捕获)和捕获后(显示)过滤。这两个维度可以用两种不同的方法进行过滤:使用预定义语法或 Berkeley 数据包过滤器 (BPF)。TShark 支持这两种方法,因此您可以使用 Wireshark 过滤器和 BPF 来过滤流量。如前所述,TShark 是 Wireshark 的命令行版本,因此我们需要使用不同的过滤器来捕获和过滤数据包。Wireshark:数据包操作 房间的快速回顾:

捕获过滤器 实时过滤选项。目的是仅保存流量的特定部分。它是在捕获流量之前设置的,在实时捕获期间不可更改。
显示过滤器 捕获后过滤选项。目的是通过减少可见数据包的数量来调查数据包,这在调查过程中是可以改变的。

捕获过滤器用于在捕获文件中包含特定类型的流量,而不是包含所有内容。捕获过滤器具有有限的过滤功能,目的是实现按范围、协议和方向过滤的范围。这听起来可能像批量/原始过滤,但它仍然提供具有合理文件大小的有组织的捕获文件。显示过滤器会深入调查捕获文件,而无需修改数据包。

参数 目的
-f 捕获过滤器。与 BPF 语法和Wireshark 的捕获过滤器相同。
-Y 显示过滤器。与Wireshark 的显示过滤器相同。

如果您想查看数据包过滤的原理,请查看 Wireshark:数据包操作 房间(任务 4 和 5)。

TShark Fundamentals IV | Packet Filtering Options: Capture Filters

捕获过滤器

此处使用 Wireshark 的捕获过滤器语法。捕获/BPF 过滤器的基本语法如下所示。您可以在 此处此处 了解有关捕获过滤器语法的更多信息。布尔运算符也可用于这两种类型的过滤器。

限定符 详细信息和可用选项
类型 目标匹配类型。您可以过滤 IP 地址、主机名、IP 范围和端口号。请注意,如果您未设置限定符,则默认使用“host”限定符。host | net | port | portrange过滤主机tshark -f "host 10.10.10.10"过滤网络范围tshark -f "net 10.10.10.0/24"过滤端口tshark -f "port 80"过滤端口范围tshark -f "portrange 80-100"
方向 目标方向/流。请注意,如果不使用方向运算符,它将等于“either”并覆盖两个方向。src | dst过滤源地址tshark -f "src host 10.10.10.10"过滤目标地址tshark -f "dst host 10.10.10.10"
协议 目标协议。arp | ether | icmp | ip | ip6 | tcp | udp过滤 TCPtshark -f "tcp"过滤 MAC 地址tshark -f "ether host F8:DB:C5:A2:5D:81"您还可以使用 IANA 分配的 IP 协议号过滤协议。过滤 IP 协议 1 (ICMP)tshark -f "ip proto 1"已分配的 Internet 协议号

我们需要创建流量噪声来测试和模拟捕获过滤器。我们将使用“terminator”终端实例在单个终端中拥有分屏视图。“terminator”将帮助您使用单个终端界面制作和嗅探数据包。现在,运行 terminator 命令并使用新的终端实例按照说明进行操作。

  • 首先,在终端 1 中运行给定的 TShark 命令以开始嗅探流量。
  • 然后,在终端 2 中运行给定的 cURL 命令以创建网络噪声。
  • 在 Terminal-1 中查看嗅探数据包的结果。

“终结者”终端仿真器应用程序

Terminal-1

            user@ubuntu$ tshark -f "host 10.10.10.10"
Capturing on 'ens5'
1 0.000000000 YOUR-IP → 10.10.10.10 TCP 74 36150 → 80 [SYN] Seq=0 Win=62727 Len=0 MSS=8961 SACK_PERM=1 TSval=2045205701 TSecr=0 WS=128
2 0.003452830 10.10.10.10 → YOUR-IP TCP 74 80 → 36150 [SYN, ACK] Seq=0 Ack=1 Win=62643 Len=0 MSS=8961 SACK_PERM=1 TSval=744450747 TSecr=2045205701 WS=64
3 0.003487830 YOUR-IP → 10.10.10.10 TCP 66 36150 → 80 [ACK] Seq=1 Ack=1 Win=62848 Len=0 TSval=2045205704 TSecr=744450747
4 0.003610800 YOUR-IP → 10.10.10.10 HTTP 141 GET / HTTP/1.1

Terminal-2

            user@ubuntu$ curl -v 10.10.10.10
* Trying 10.10.10.10:80...
* TCP_NODELAY set
* Connected to 10.10.10.10 (10.10.10.10) port 80 (#0)
> GET / HTTP/1.1
> Host: 10.10.10.10
> User-Agent: curl/7.68.0
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Accept-Ranges: bytes
< Content-Length: 1220
< Content-Type: text/html; charset=utf-8

熟悉命令行和 TShark 过滤器需要时间和练习。您可以使用下表来练习 TShark 捕获过滤器。

捕获过滤器类别 详细信息
主机过滤 捕获往返于特定主机的流量。使用 cURL 生成流量。此命令将默认 HTTP 查询发送到指定地址。curl tryhackme.com主机的 TShark 捕获过滤器tshark -f "host tryhackme.com"
IP 过滤 捕获往返于特定端口的流量。我们将使用 Netcat 工具在特定端口上创建噪声。使用 Netcat 生成流量。此处指示 Netcat 提供详细信息(详细程度),并将超时设置为 5 秒。nc 10.10.10.10 4444 -vw 5特定 IP 地址的 TShark 捕获过滤器tshark -f "host 10.10.10.10"
端口过滤 捕获往返于特定端口的流量。我们将使用 Netcat 工具在特定端口上创建噪声。使用 Netcat 生成流量。此处指示 Netcat 提供详细信息(详细程度),并将超时设置为 5 秒。nc 10.10.10.10 4444 -vw 5端口 4444 的 TShark 捕获过滤器tshark -f "port 4444"
协议过滤 捕获往返于特定协议的流量。我们将使用 Netcat 工具在特定端口上创建噪声。使用 Netcat 生成流量。此处指示 Netcat 使用 UDP、提供详细信息(详细程度),并将超时设置为 5 秒。nc -u 10.10.10.10 4444 -vw 5TShark 捕获过滤器tshark -f "udp"

TShark Fundamentals V | Packet Filtering Options: Display Filters

显示过滤器

这里使用Wireshark的显示过滤器语法。您可以使用官方的显示过滤器参考查找过滤的协议细分。此外,您可以使用Wireshark内置的“显示过滤器表达式”菜单来细分过滤器的协议。请注意,布尔运算符也可以在两种类型的过滤器中使用。下表显示了常见的过滤选项。

注意:建议对捕获过滤器使用单引号,以避免空格和bash扩展问题。再次,如果您想查看数据包过滤的原理,可以查看Wireshark:数据包操作房间(任务4和5)。

显示过滤器类别 详细信息和可用选项
协议:IP 过滤一个 IP 而不指定方向。tshark -Y 'ip.addr == 10.10.10.10'过滤一个网络范围tshark -Y 'ip.addr == 10.10.10.0/24'过滤一个源 IPtshark -Y 'ip.src == 10.10.10.10'过滤一个目标 IPtshark -Y 'ip.dst == 10.10.10.10'
协议:TCP 过滤 TCP 端口tshark -Y 'tcp.port == 80'过滤源 TCP 端口tshark -Y 'tcp.srcport == 80'
协议:HTTP 过滤 HTTP 数据包 tshark -Y 'http'过滤响应代码为“200”的 HTTP 数据包tshark -Y "http.response.code == 200"
协议:DNS 过滤 DNS 数据包 tshark -Y 'dns'过滤所有 DNS“A”数据包tshark -Y 'dns.qry.type == 1'

我们将使用“demo.pcapng”来测试显示过滤器。让我们看看过滤器的实际效果!

示例过滤查询

           user@ubuntu$ tshark -r demo.pcapng -Y 'ip.addr == 145.253.2.203'
13 2.55 145.254.160.237 ? 145.253.2.203 DNS Standard query 0x0023 A ..
17 2.91 145.253.2.203 ? 145.254.160.237 DNS Standard query response 0x0023 A ..

上面的终端演示了如何使用“IP 过滤”选项。TShark 会过滤数据包并在我们的终端中提供输出。值得注意的是,TShark 不会计算“过滤数据包的总数”;它根据捕获时间为数据包分配编号,但只显示与我们的过滤器匹配的数据包。

看看上面的例子。有两个匹配的数据包,但关联的编号不是从零或一开始的;这些过滤的数据包被分配了“13”和“17”。如果您的过滤器检索到的数据包不止一把,那么跟踪这些数字并计算“过滤数据包的总数”可能会令人困惑。下面显示了另一个示例。

示例过滤查询

          user@ubuntu$ tshark -r demo.pcapng -Y 'http'
4 0.911 145.254.160.237 ? 65.208.228.223 HTTP GET /download.html HTTP/1.1
18 2.984 145.254.160.237 ? 216.239.59.99 HTTP GET /pagead/ads?client...
27 3.955 216.239.59.99 ? 145.254.160.237 HTTP HTTP/1.1 200 OK (text/html)
38 4.846 65.208.228.223 ? 145.254.160.237 HTTP/XML HTTP/1.1 200 OK

您可以使用 nl 命令获取输出的编号列表。因此,您可以轻松计算“已过滤数据包的总数”,而不会与“已分配的数据包编号”混淆。nl 命令的用法如下所示。

示例过滤查询

           user@ubuntu$ tshark -r demo.pcapng -Y 'http' | nl
1 4 0.911 145.254.160.237 ? 65.208.228.223 HTTP GET /download.html HTTP/1.1
2 18 2.984 145.254.160.237 ? 216.239.59.99 HTTP GET /pagead/ads?client...
3 27 3.955 216.239.59.99 ? 145.254.160.237 HTTP HTTP/1.1 200 OK (text/html)
4 38 4.846 65.208.228.223 ? 145.254.160.237 HTTP/XML HTTP/1.1 200 OK