检查数据包内容

WiresharkBeginner
立即练习

简介

在追踪实体包裹时,阅读快递单通常就足以知道它要去哪里。但有时,你需要知道盒子里装的到底是什么。

在网络分析中,查看 IP 地址和端口就像阅读快递单(数据包头)。然而,真正有价值的信息——比如网页文本、下载的文件,甚至是未加密的密码——都隐藏在数据包的负载(payload)中。

这种包头与负载的区别是网络安全的基础。包头回答了路由问题,例如流量来自哪里、要去哪里以及使用了什么协议。而负载则回答了内容问题,例如请求了什么、返回了什么,以及是否泄露了敏感数据。成熟的分析师会根据他们试图回答的问题,在这些视角之间灵活切换。

在本实验中,你将学习如何使用 tcpdump 打开这个“盒子”,检查网络数据包的实际内容。你将探索如何确保捕获的是完整的数据包而不仅仅是标签,以及如何以人类和计算机都能轻松读取的格式显示原始数据。最后,你将练习使用 Linux 文本工具直接从流动的网络流量中提取明文机密。

增加 Snaplen(捕获完整数据包)

要查看数据包内部,首先必须确保 tcpdump 确实捕获了整个数据包。默认情况下,旧版本的 tcpdump 和一些网络工具为了节省硬盘空间,会截断每个数据包的末尾,只捕获包头。

这种权衡解释了为什么数据包捕获总是在完整性和成本之间寻找平衡。捕获较短的数据包占用的存储空间更少,速度也更快,这在繁忙的网络中非常重要。而捕获完整的数据包则保留了更多证据,这在故障排查和取证时至关重要。没有一种通用的设置是永远正确的。分析师会根据问题、环境和性能预算做出选择。

从单个数据包中捕获的数据量称为“快照长度”(snapshot length),简称 snaplen。如果你想要获取负载,就必须告诉工具不要截断数据。你可以使用 -s 标志来控制这一点。将 snaplen 设置为 0 (-s 0) 是一个特殊的技巧,它指示 tcpdump 使用最大可能的长度,从而确保不会遗漏任何数据。

在你的后台环境中,我们已经在 8080 端口启动了一个简单的 Web 服务器。为了干净地捕获数据,我们将使用一个实用的 Linux 命令 timeout,让 tcpdump 自动运行整整 10 秒。

运行以下命令。它将在回环接口 (lo) 上开始捕获,过滤 8080 端口,确保抓取完整数据包 (-s 0),并将结果保存在后台的 ~/project/traffic.pcap 文件中(使用 & 符号):

sudo timeout 10 tcpdump -i lo port 8080 -s 0 -w ~/project/traffic.pcap &

当 tcpdump 在后台静默监视时,我们需要生成一些有趣的 Web 流量供其捕获。使用 curl 命令从本地 Web 服务器请求一个隐藏文件:

curl http://localhost:8080/secret.txt

你将看到打印出的文本 SecretPayloadData123,这是 Web 服务器对你请求的响应。稍等几秒钟,等待 10 秒的 timeout 计时器结束并关闭后台的 tcpdump 进程。你可以按几次 Enter 键,查看后台任务完成的消息弹出。

为了确保一切正常,列出目录内容以检查捕获文件:

ls -l ~/project/traffic.pcap

你应该能看到 traffic.pcap 文件,且文件大小大于零,这确认了我们完整、未被截断的数据包已被安全地捕获并存储。

打印 ASCII 负载

既然我们已经成功保存了完整的数据包,现在是时候打开并读取它们了。当基础网站、FTP 服务器或旧式 Telnet 系统等网络应用程序相互通信时,它们通常以简单的未加密文本形式发送负载数据。

这也是为什么在不受信任的网络上,未加密协议被认为具有风险的原因。如果人类可以读取捕获文件中的负载,那么拦截相同流量的攻击者也可以。换句话说,数据包检查不仅是一种分析技术,它也提醒了我们为什么现代系统更倾向于使用 HTTPS 和 SSH 等加密协议。

为了显示这些纯文本,tcpdump 提供了 -A 标志。这个便捷的选项将数据包内的原始二进制数据转换为人类可读的 ASCII 字符。这是快速扫描捕获文件以查找可读单词、错误消息或暴露的凭据的绝佳方法。

使用 -r 标志读取你刚创建的捕获文件,并配合 -A 标志显示 ASCII 内容:

sudo tcpdump -r ~/project/traffic.pcap -A

随着文本滚动,请仔细观察输出。你首先会看到技术性的数据包头,但在它们下方混合着实际可读的英文。

你应该能轻松发现 curl 命令发送的 GET /secret.txt 请求,随后是 Web 服务器返回的 HTTP/1.0 200 OK 消息。在服务器响应包的最底部,你将清楚地看到以明文形式暴露的隐藏负载:SecretPayloadData123。

...
E..e..@.@.............Q...P.P...P...*......
GET /secret.txt HTTP/1.1
Host: localhost:8080
User-Agent: curl/7.81.0
Accept: */*

...
E.....@.@.............P...Q.P...P...*......
HTTP/1.0 200 OK
Server: SimpleHTTP/0.6 Python/3.10.12
...

SecretPayloadData123
...

你无疑会注意到输出中散布着许多随机的点 (.)。这是完全正常的。计算机试图将底层的机器代码(如 TCP/IP 头部)显示为文本,当它发现一个与标准键盘字符不匹配的二进制值时,它就会简单地打印一个点来代替。

打印十六进制和 ASCII(十六进制转储)

虽然 ASCII 视图 (-A) 非常适合浏览纯文本,但在处理复杂的计算机逻辑时,它就显得力不从心了。由于二进制协议(如 DNS 请求或加密流量)在 ASCII 模式下显示为一片混乱的点,网络工程师需要一种更精确的工具。

十六进制在底层安全工作中频繁出现,因为它是一种表示原始字节的紧凑方式。计算机以二进制存储数据,但二进制对人类来说直接阅读非常繁琐。十六进制充当了一个实用的中间地带:每个十六进制数字都能整齐地映射到四个二进制位,因此分析师可以在不被长串的 0 和 1 淹没的情况下,检查字节级的结构。

为了获得最准确的数据包剖析视图,你可以使用 -X 标志。这会将输出转换为一种称为十六进制转储(Hexdump)的结构化格式。它将数据的精确十六进制(基数为 16)值与 ASCII 文本并排显示,让你同时获得两者的优势。

运行以下命令来读取你的捕获文件并显示更深入的十六进制转储视图:

sudo tcpdump -r ~/project/traffic.pcap -X

检查屏幕上呈现的结构化数据块。

...
0x0000:  4500 0065 1419 4000 4006 28b4 7f00 0001  E..e..@.@.(.....
0x0010:  7f00 0001 8152 1f90 50b9 1017 5018 0200  .....R..P...P...
0x0020:  fe59 0000 4745 5420 2f73 6563 7265 742e  .Y..GET./secret.
0x0030:  7478 7420 4854 5450 2f31 2e31 0d0a 486f  txt.HTTP/1.1..Ho
0x0040:  7374 3a20 6c6f 6361 6c68 6f73 743a 3830  st:.localhost:80
...

输出被仔细排列成三列。

最左侧的列(以 0x0000: 开头)基本上是一个标尺,告诉你数据包内精确的字节位置。

中间宽大的部分以十六进制格式显示原始、未经处理的数据包数据,并整齐地分为双字节组,方便安全分析师阅读。

最后,最右侧的部分尝试将那一行十六进制数据转换回熟悉的 ASCII 字符,作为快速参考指南。

通过并排呈现数据,你可以精确定位任何异常字符的二进制值,这对于逆向工程复杂的网络攻击来说是绝对必要的。

提取明文 HTTP 头部

对于小型测试,手动搜索原始 ASCII 或十六进制转储输出是可以接受的,但在分析包含数千个数据包的真实捕获文件时,这很快就会变成一项不可能完成的任务。

这一步引入了另一个核心工程理念:强大的工作流通常来自于组合小型工具,而不是依赖一个庞大的工具来完成所有事情。tcpdump 擅长读取数据包,grep 擅长搜索文本。通过管道将它们连接起来,你可以创建一个既快速又易于调整的工作流。这种可组合性是 Linux 命令行环境的决定性优势之一。

为了解决这个问题,Linux 允许你组合工具。通过将 tcpdump 的 ASCII 输出通过管道 (|) 直接传输到名为 grep 的文本搜索工具中,你可以立即过滤海量的文本流,只显示你在大海捞针中寻找的特定内容。

例如,如果你正在调查 Web 流量,你可能希望快速列出正在访问哪些网站(Host 头部),以及用户正在运行什么样的 Web 浏览器(User-Agent 头部)。

运行以下命令。它以 ASCII 模式读取文件,将文本通过管道传输到 grep,并使用 -E 标志启用扩展搜索,查找包含 "Host:"、"User-Agent:" 或 "HTTP" 的行:

sudo tcpdump -r ~/project/traffic.pcap -A | grep -E "Host:|User-Agent:|HTTP"

瞬间,混乱的输出被替换为简洁、高度组织的 Web 事务摘要:

GET /secret.txt HTTP/1.1
Host: localhost:8080
User-Agent: curl/7.81.0
HTTP/1.0 200 OK
Server: SimpleHTTP/0.6 Python/3.10.12

这种工作流对于网络安全事件响应来说极其强大。通过替换搜索词,你可以使用完全相同的技术,毫不费力地扫描整个网络捕获文件,以查找泄露的密码(例如 grep -i "password")、机密文件名或已知的恶意命令字符串。

总结

恭喜!你已成功完成了“检查数据包内容”实验。

你已经提升了自己的技能,从仅仅观察网络数据包的外部,深入到了正在传输的实际数据中。你练习了使用 snaplen 选项 (-s 0) 禁用数据包截断,以确保完整捕获。然后,你通过 -A 标志解锁了内容以获得可读的 ASCII 视图,并使用 -X 标志进行了精确、专业的十六进制转储分析。最后,你通过将 tcpdump 与标准的 Linux 文本工具相结合,提升了工作流,能够自动从噪声中搜寻并提取特定的应用程序数据。

这些核心技能是深度数据包检查的基石。无论你是在排查晦涩的应用程序错误,还是在对安全漏洞进行详细的网络取证,你现在都拥有了揭示网络线路上传输内容的工具。