简介
网络流量分析通常需要从数以千计的数据包中提取特定的信息片段。虽然阅读数据包摘要对人类很有帮助,但自动化工具和脚本需要结构化的数据。
这就是数据包分析与数据工程产生交集的地方。人类可以直观地浏览几行数据包信息,但计算机在处理排列成稳定字段和列的数据时效率最高。一旦网络流量被转换为结构化输出,它就可以被搜索、统计、绘图、导入电子表格,或由 Python 和 SIEM 流水线进行处理。
在本实验中,你将学习如何使用 Wireshark 的命令行版本 tshark,将原始网络流量转换为结构化、易于解析的格式。你将练习禁用默认的人类可读输出,选择特定的协议字段(如 IP 地址、DNS 查询和 HTTP User-Agent),并将结果格式化为逗号分隔值(CSV)以供进一步分析。
禁用默认输出
在这一步中,你将学习如何更改 tshark 的默认输出行为。
默认情况下,当你使用 tshark 读取数据包捕获文件时,它会为每一个数据包打印一行摘要。此摘要旨在供人类阅读,但对于脚本解析或导入数据库来说非常困难。为了提取特定数据,我们首先需要告诉 tshark 停止打印此默认摘要,并准备输出特定的字段。
核心思想是:摘要是面向展示的,而字段是面向分析的。一行摘要对个人来说可能很方便,但微小的格式变化可能会破坏下游的自动化流程。提取命名字段可以为你提供可预测的输出,其他工具可以可靠地使用这些数据。
我们通过使用 -T fields 选项来实现这一点。-T 标志代表「文本输出格式」(Text output format),将其设置为 fields 告诉 tshark 我们只想看到我们指定的精确数据字段。
然而,如果你只使用 -T fields 而不指定你想要的字段,tshark 将不会输出任何内容。你必须将其与 -e 标志配对,该标志用于指定要提取的精确字段。
让我们从提取示例捕获文件中的帧编号开始。请确保你位于默认工作目录 /home/labex/project 中。
运行以下命令读取 sample.pcap 文件并仅提取帧编号:
tshark -r sample.pcap -T fields -e frame.number | head -n 5
-r 标志告诉 tshark 从文件读取,而不是捕获实时流量。命令中的 | head -n 5 部分将输出限制为前 5 行,这样你的终端就不会被数字淹没。
你应该看到类似以下的输出:
1
2
3
4
5
注意与标准 tshark 摘要相比,输出是多么整洁。这是从网络流量构建结构化数据集的基础。
使用自定义列格式
在这一步中,你将学习如何同时提取多个字段并将其格式化为逗号分隔值(CSV)。
当你使用多个 -e 标志时,tshark 将提取多个字段并将它们放置在不同的列中。默认情况下,tshark 使用「制表符」(Tab)字符分隔这些列。虽然制表符分隔的值很有用,但 CSV 是将数据导入电子表格、数据库和 Python Pandas 等分析工具的通用标准。
这看起来可能只是一个格式细节,但格式的选择决定了你后续能做什么。安全工作通常涉及在数据包分析器、Shell 流水线、电子表格、笔记本和仪表板之间移动数据。你的输出越容易导入到其他地方,就越容易将一次性命令扩展为可重复的工作流。
要更改分隔列的字符,我们使用 -E separator= 选项。
让我们提取帧编号、源 IP 地址和目标 IP 地址,并将它们格式化为 CSV。源 IP 和目标 IP 的字段名称分别为 ip.src 和 ip.dst。
为了确保我们查看的是确实具有 IP 地址的数据包(并跳过诸如不包含 IP 的底层 ARP 数据包),我们将在字段提取的同时使用 -Y "ip" 过滤器。
在终端中运行以下命令:
tshark -r sample.pcap -Y "ip" -T fields -e frame.number -e ip.src -e ip.dst -E separator=, | head -n 5
你应该看到类似以下的输出:
12,127.0.0.1,127.0.0.11
13,127.0.0.11,127.0.0.1
14,127.0.0.1,127.0.0.11
15,127.0.0.11,127.0.0.1
16,172.60.1.88,104.18.26.120
由于我们过滤掉了初始的 ARP 数据包,你会注意到帧编号可能不是从 1 开始的。有时,数据包可能不包含特定字段,在这种情况下,tshark 会简单地将该列留空,从而确保你的 CSV 结构保持完整。
提取 DNS 查询
在这一步中,你将结合字段提取和显示过滤器,从 DNS 流量中隔离并提取特定信息。
在分析网络流量时,你很少需要从「所有」数据包中提取字段。通常,你只对特定的协议感兴趣。你可以使用 -Y 标志在提取字段之前应用显示过滤器。
这是在解释结果之前缩小范围的另一个例子。如果你将不相关的协议混合在一个导出文件中,输出会变得稀疏且令人困惑,因为许多数据包将不包含你请求的字段。先进行过滤可以保持生成的数据集在语义上的一致性。
例如,如果我们想查看用户试图访问哪些网站,我们可以查看他们的 DNS 查询。DNS 流量的显示过滤器很简单,就是 dns。包含正在查询的域名的特定字段是 dns.qry.name。
让我们提取源 IP 地址和 DNS 查询名称,但仅针对确实是 DNS 请求或响应的数据包。
执行以下命令:
tshark -r sample.pcap -Y "dns" -T fields -e ip.src -e dns.qry.name -E separator=, | head -n 5
你的输出将类似于:
10.0.2.15,labex.io
168.63.129.16,labex.io
10.0.2.15,google.com
168.63.129.16,google.com
通过将 -Y "dns" 与 -T fields 结合使用,我们确保了 CSV 输出仅包含相关数据,过滤掉了其他网络协议的所有背景噪音。
提取 HTTP User-Agent
在最后一步中,你将从 HTTP 流量中提取详细信息,重点关注 User-Agent 字符串。
User-Agent 是 Web 浏览器或客户端发送给服务器的字符串,用于标识所使用的软件(例如 Chrome、Firefox 或自定义脚本)。安全分析师经常提取 User-Agent 来识别网络上的恶意自动化脚本或过时的浏览器。
像 User-Agent 这样的元数据非常有用,因为它提供了关于行为的线索,而无需你检查内容的每一个字节。在网络防御中,许多有用的判断来自于上下文字段,例如 User-Agent、Host 标头、TLS 服务器名称或 DNS 查询名称。它们帮助分析师将正常的应用程序流量与可疑的自动化行为区分开来。
为了隔离 HTTP 请求,我们可以使用显示过滤器 http.request。我们要提取的字段是源 IP (ip.src)、请求的主机域名 (http.host)、特定的 URI 路径 (http.request.uri) 以及 User-Agent 字符串 (http.user_agent)。
运行以下命令将此 HTTP 元数据提取为 CSV 格式:
tshark -r sample.pcap -Y "http.request" -T fields -e ip.src -e http.host -e http.request.uri -e http.user_agent -E separator=,
你应该看到类似以下的输出:
10.0.2.15,example.com,/,curl/7.81.0
10.0.2.15,neverssl.com,/,LabEx-Custom-Agent/1.0
注意我们是如何成功提取出在实验设置期间生成的自定义 User-Agent LabEx-Custom-Agent/1.0 的。这种技术对于创建自动化报告或将网络数据馈送到安全监控仪表板非常强大。
总结
在本实验中,你学习了如何使用 tshark 将原始网络数据包捕获转换为结构化的、可分析的数据。你首先通过 -T fields 禁用了默认的人类可读输出。然后,你学习了如何使用 -e 标志选择特定的数据点,并使用 -E separator=, 将其格式化为 CSV。最后,你将这些格式化技术与显示过滤器 (-Y) 相结合,以提取高度特定的信息,例如 DNS 查询名称和 HTTP User-Agent 字符串。这些技能对于自动化网络分析以及将数据包数据与其他安全工具集成至关重要。

