在 Tshark 中转储十六进制数据

WiresharkBeginner
立即练习

介绍

在本次实验中,你将学习使用 Wireshark 的 tshark 命令行工具以十六进制输出的方式分析网络数据包。你将练习使用 -r 标志读取数据包捕获文件(capture.pcap),并使用 -x 以十六进制格式显示原始数据包数据。

这些练习将指导你执行 tshark 命令、解读数据包摘要以及查看十六进制转储。你将分析一个 TCP 握手示例,以了解这种技术如何有助于网络故障排除和安全调查。

使用 -r capture.pcap 读取文件

在这一步中,你将学习如何使用 Wireshark 的命令行工具 tshark 结合 -r 选项来读取数据包捕获文件。这是分析预先捕获的网络流量数据的基本方法。

在开始之前,了解 PCAP 文件包含从网络接口捕获的原始网络流量数据非常重要。-r 标志允许你指定要读取的数据包捕获文件,这类似于使用文本编辑器打开文档。我们将使用位于 ~/project 目录下名为 capture.pcap 的示例文件。

  1. 首先,确保你处于正确的目录中。这很关键,因为 tshark 需要知道在哪里找到捕获文件:
cd ~/project
  1. 现在,使用 tshark 读取捕获文件。不使用任何过滤器的基本命令将显示文件中的所有数据包:
tshark -r capture.pcap

此命令将显示捕获文件中每个数据包的基本信息,包括:

  • 数据包编号(显示捕获顺序)
  • 时间戳(数据包被捕获的时间)
  • 源 IP 地址和目标 IP 地址(发送和接收数据包的对象)
  • 协议(这是哪种类型的网络通信)
  • 数据包长度(数据包的大小)
  • 基本协议信息(每种协议的具体细节)

示例输出(你的实际输出可能会有所不同):

1 0.000000 192.168.1.1 → 192.168.1.2 TCP 66 443 → 49234 [SYN] Seq=0 Win=64240 Len=0
2 0.000123 192.168.1.2 → 192.168.1.1 TCP 66 49234 → 443 [SYN, ACK] Seq=0 Ack=1 Win=65535 Len=0
3 0.000234 192.168.1.1 → 192.168.1.2 TCP 54 443 → 49234 [ACK] Seq=1 Ack=1 Win=64240 Len=0

此输出显示了两个主机之间的基本 TCP 握手过程。第一个带有 [SYN] 的数据包表示连接请求,第二个带有 [SYN, ACK] 的数据包是响应,第三个 [ACK] 数据包完成握手。每行代表一个网络数据包及其基本细节,让你按时间顺序了解网络通信情况。

使用 -x 启用十六进制转储

在这一步中,我们将探讨如何使用 Wireshark 的命令行工具 tshark 来查看网络数据包的原始二进制内容。-x 选项特别强大,因为它能展示构成每个数据包的实际十六进制数据,这对于深入的数据包分析至关重要。

在处理网络流量时,数据包本质上只是字节序列。-x 标志会让 tshark 显示以下内容:

  1. 标准的数据包头部信息(如源/目标地址)
  2. 数据包原始数据的完整十六进制表示
  3. 该数据的 ASCII 解释(在适用的情况下)

在继续操作之前,确保我们处于存储数据包捕获文件的正确工作目录中:

cd ~/project

现在,我们将启用十六进制输出,对数据包捕获文件(capture.pcap)进行分析:

tshark -r capture.pcap -x

此命令为每个数据包生成的输出分为三个主要部分:

  1. 显示基本数据包信息的摘要行
  2. 显示原始数据包字节的十六进制转储
  3. 这些字节的 ASCII 表示(显示可打印字符)

以下是一个典型输出部分的样子(为演示而缩短):

1 0.000000 192.168.1.1 → 192.168.1.2 TCP 66 443 → 49234 [SYN] Seq=0 Win=64240 Len=0
0000  00 1a 4b 12 34 56 00 1b 11 22 33 44 08 00 45 00   ..K.4V..."3D..E.
0010  00 34 12 34 00 00 80 06 78 9a c0 a8 01 01 c0 a8   .4.4....x.......
0020  01 02 01 bb c0 52 00 00 00 00 00 00 00 00 50 02   .....R........P.
0030  fa f0 00 00 00 00 00 00 00 00                     ..........

十六进制显示的组织方式如下:

  • 最左侧的列(0000、0010 等)以十六进制显示字节偏移量
  • 中间部分每行以十六进制格式显示 16 字节的数据包数据
  • 右侧部分显示 ASCII 字符表示(不可打印字符显示为点号)

当你需要逐字节检查协议头部或验证网络传输的确切内容时,这种视图非常有用。

使用 --hexdump frames 限制显示帧

在这一步中,你将学习如何使用 Wireshark 的 --hexdump 选项结合帧过滤功能,精确控制哪些数据包会出现在十六进制输出中。当处理包含大量数据包的大型捕获文件时,这种技术能帮助你在查看原始十六进制数据时,专注于特定的网络数据包,非常实用。

--hexdump 选项比基本的 -x 标志能提供更精确的控制。-x 会显示所有数据包的十六进制转储,而 --hexdump 允许你精确指定要显示的帧编号。这就像有一个放大镜,只显示你想要仔细检查的数据包。

  1. 首先,确保我们处于存储捕获文件的正确工作目录中。这能确保 Tshark 可以找到我们要分析的文件:
cd ~/project
  1. 现在,我们将使用 Tshark 显示特定帧的十六进制数据。命令结构如下:
    • -r capture.pcap 用于读取我们的数据包捕获文件
    • --hexdump frame=1-3 告诉 Tshark 我们只需要第 1 到第 3 帧
    • 等号 (=) 用于将帧过滤器与十六进制转储选项关联起来

运行以下命令,以十六进制形式查看第 1 到第 3 帧:

tshark -r capture.pcap --hexdump frame=1-3

此命令生成的输出将显示:

  • 仅显示我们请求的三帧(第 1、2 和 3 帧)
  • 每一帧的完整十六进制表示
  • 原始字节数据,不包含通常的数据包摘要信息

示例输出(为演示而缩短):

Frame 1: 66 bytes on wire
0000  00 1a 4b 12 34 56 00 1b 11 22 33 44 08 00 45 00   ..K.4V..."3D..E.
0010  00 34 12 34 00 00 80 06 78 9a c0 a8 01 01 c0 a8   .4.4....x.......
0020  01 02 01 bb c0 52 00 00 00 00 00 00 00 00 50 02   .....R........P.
0030  fa f0 00 00 00 00 00 00 00 00                     ..........

Frame 2: 66 bytes on wire
0000  00 1b 11 22 33 44 00 1a 4b 12 34 56 08 00 45 00   ..."3D..K.4V..E.
0010  00 34 ab cd 00 00 80 06 12 34 c0 a8 01 02 c0 a8   .4.......4......
0020  01 01 c0 52 01 bb 00 00 00 00 00 00 00 01 50 12   ...R..........P.
0030  ff ff 00 00 00 00 00 00 00 00                     ..........

注意与之前输出的关键区别:

  • 仅显示你指定的帧(没有额外的数据包)
  • 每一帧都显示其完整的十六进制表示
  • 输出跳过了通常的数据包摘要行,为你提供更简洁的十六进制数据进行分析

查看十六进制输出

在这最后一步,你将分析和解读数据包捕获的十六进制输出。理解十六进制转储对于网络分析至关重要,因为它能精确展示在网络中传输的原始二进制数据。这项技能对于理解网络协议、调试通信问题以及进行底层数据包检查必不可少。

  1. 首先,让我们生成前 3 帧的完整十六进制转储。在项目目录中使用以下命令:
cd ~/project
tshark -r capture.pcap --hexdump frame=1-3

此命令读取 capture.pcap 文件,并显示第 1 到第 3 帧的十六进制表示。--hexdump 选项会让 Tshark 并排显示十六进制和 ASCII 表示。

  1. 仔细检查输出结构。十六进制转储的组织方式有助于你直观了解数据包结构:
  • 每一帧开头都会显示其大小(例如,“Frame 1: 66 bytes on wire”),表明数据包的总长度。
  • 左列显示字节偏移量(0000、0010 等),有助于定位特定字节。
  • 中间部分每行显示 16 字节的十六进制数据,展示实际的数据包内容。
  • 右列显示可打印字符的 ASCII 表示,有助于识别文本协议。
  1. 现在,让我们在十六进制转储中识别关键的协议头部。网络数据包遵循分层结构,我们可以在十六进制输出中看到这一点:
## Ethernet header (first 14 bytes)
0000 00 1a 4b 12 34 56 00 1b 11 22 33 44 08 00

## IP header (next 20 bytes)
0010 45 00 00 34 12 34 00 00 80 06 78 9a c0 a8 01 01
0020 c0 a8 01 02

## TCP header (next 20 bytes)
0020 01 bb c0 52 00 00 00 00 00 00 00 00 50 02
0030 fa f0 00 00 00 00 00 00 00 00

以太网头部位于最前面,接着是 IP 头部,然后是 TCP 头部。每个协议头部在固定位置包含特定字段,我们可以对这些字段进行解码。

  1. 让我们练习解读在网络数据包中常见的一些值:
  • 08 00 表示 IPv4(以太网类型)——这告知网卡接下来使用的协议。
  • 45 表示 IPv4,头部长度为 5 个字(‘4’是 IP 版本,‘5’是以 32 位字为单位的头部长度)。
  • c0 a8 01 01 是十六进制形式的 192.168.1.1(每一对表示 IP 地址的一个字节)。
  • 01 bb 十进制表示为端口 443(第一个字节 01 代表 256,加上 bb 即 187,总和为 443)。

请记住,网络协议采用大端字节序,这意味着在解读多字节字段时,最高有效字节排在最前面。

总结

在本次实验中,你学习了如何使用 Wireshark 的 tshark 命令行工具来分析数据包捕获文件并查看十六进制数据。这些练习展示了如何使用 -r 选项读取 PCAP 文件以查看基本的数据包信息,以及如何使用 -x 标志进行详细的十六进制转储。

你了解了这些技术如何实现全面的网络流量分析,从观察 TCP 握手到逐字节检查原始数据包数据。将数据包摘要与十六进制和 ASCII 表示相结合,为网络故障排除和协议检查提供了强大的功能。