【THM】Tcpdump:The Basics(Tcpdump:基础知识)-学习
本文相关的TryHackMe实验房间链接:https://tryhackme.com/r/room/tcpdump
本文相关内容:了解如何使用 Tcpdump 保存、过滤和显示数据包。
介绍
研究网络协议时的主要挑战是我们没有机会看到具体的协议“对话”是如何发生的。所有的技术复杂性都隐藏在友好而优雅的用户界面背后。你可以访问本地网络上的资源,而不会看到背后的ARP查询。同样,你可能已经访问并使用了互联网服务多年,而没有实际看到三次握手过程,直到你开始查看与网络相关的书籍或者检查网络流量捕获情况。在这方面,最好的学习辅助工具是实际捕获网络流量并仔细研究相关的各种协议;这有助于我们更好地理解网络是如何工作的。
本文将介绍使用 Tcpdump 时所涉及到的一些基本命令行参数。 Tcpdump 工具及其libpcap
库是用 C 和 C++ 编写的,并在 20 世纪 80 年代末或 90 年代初针对类Unix系统发布,它们非常稳定并且能够提供最佳的访问速度。
libpcap
库是当今各种其他网络工具的基础;此外,它还已经作为winpcap
被移植到了Windows系统中。
学习目标
本文旨在为你提供使用tcpdump
所需的基础知识。特别是,你将学习到以下内容:
- 捕获数据包并将其保存到文件中
- 对捕获的数据包设置过滤器
- 控制捕获的数据包的显示方式
前置学习基础
在开始学习本文相关内容之前,建议先了解TCP /IP 模型以及相关的一些概念、相关的各种协议。以下TryHackMe实验房间能够为我们提供所需的前置知识:
- Networking Concepts 网络基础概念
- Networking Essentials 网络基本要点
- Networking Core Protocols 网络核心协议
- Networking Secure Protocols 网络安全协议
在与本文相关的TryHackMe实验房间中单击“启动计算机”按钮,等待目标机器启动,然后在目标机上打开一个终端界面。
请在需要的时候使用以下的SSH凭据来完成实验练习:
- Username:
user
- Password:
THM123
答题
与tcpdump
关联的库的名称是什么?
libpcap
基础的数据包捕获
你可以在不提供任何参数的情况下运行tcpdump
;但是,这仅用于测试你是否已安装它!在任何实际场景中,我们都必须明确要监听什么、要写入到哪里以及要如何显示数据包内容。
指定网络接口
首先要决定使用-i INTERFACE
监听哪个网络接口。你可以使用-i any
选择监听所有可用的接口;或者,你可以指定要侦听的接口,例如-i eth0
。
诸如ip address show
(或ip a s
)之类的命令将列出可用的网络接口。在下面的终端中,除了环回地址之外,我们还可以看到一张网卡ens5
。
user@TryHackMe$ ip a s
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
[...]
2: ens5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc mq state UP group default qlen 1000
[...]
保存已捕获的数据包
很多情况下,你应该稍后再检查捕获的数据包。这可以通过使用-w FILE
将数据包保存到文件来实现。相关文件的扩展名通常会设置为.pcap
。稍后可以使用其他程序(例如 Wireshark)来检查被保存的数据包。当你选择-w
选项时,你将不会看到数据包滚动信息。
从文件中读取已捕获的数据包
你可以使用 Tcpdump 通过-r FILE
从文件中读取数据包。这对于了解协议行为非常有用。你可以捕获特定时间段内的网络流量以检查特定协议,然后读取捕获的文件,同时应用过滤器来显示你感兴趣的数据包。此外,它还可能是一个包含已经发生的网络攻击的数据包捕获文件,你可以检查它来分析攻击行为。
限制捕获的数据包数量
你可以通过使用-c COUNT
指定计数来指定要捕获的数据包的总数量。如果不指定计数情况,那么数据包捕获将持续进行,直到你中断它为止,例如按CTRL+C键。根据你的任务目标,你通常只会需要有限数量的数据包。
不解析 IP 地址和端口号
Tcpdump会解析IP地址并且尽可能打印友好的域名。如果想避免进行这样的DNS查找(即解析IP地址),你可以使用-n
参数。同样,如果你不想解析端口号,例如将80
解析为http
,那么你可以使用-nn
参数选项来停止DNS查找以及端口号查找。查看下面终端中所显示的示例,我们捕获并显示了五个数据包,并且选择不解析 IP地址。
user@TryHackMe$ sudo tcpdump -i ens5 -c 5 -n
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens5, link-type EN10MB (Ethernet), capture size 262144 bytes
08:55:18.989213 IP 10.10.117.2.22 > 10.11.81.126.53378: Flags [P.], seq 2888580014:2888580210, ack 771262362, win 922, options [nop,nop,TS val 3216251159 ecr 33295823], length 196
08:55:18.989446 IP 10.10.117.2.22 > 10.11.81.126.53378: Flags [P.], seq 196:424, ack 1, win 922, options [nop,nop,TS val 3216251159 ecr 33295823], length 228
08:55:18.989576 IP 10.10.117.2.22 > 10.11.81.126.53378: Flags [P.], seq 424:620, ack 1, win 922, options [nop,nop,TS val 3216251159 ecr 33295823], length 196
08:55:18.989839 IP 10.10.117.2.22 > 10.11.81.126.53378: Flags [P.], seq 620:816, ack 1, win 922, options [nop,nop,TS val 3216251159 ecr 33295823], length 196
08:55:18.989958 IP 10.10.117.2.22 > 10.11.81.126.53378: Flags [P.], seq 816:1012, ack 1, win 922, options [nop,nop,TS val 3216251159 ecr 33295823], length 196
5 packets captured
6 packets received by filter
0 packets dropped by kernel
产生(更多的)详细输出
如果要打印有关数据包的更多详细信息,可以使用-v
选项来生成稍微详细一点的输出结果。根据 Tcpdump 手册页 ( man tcpdump
)的介绍,添加-v
选项将打印“IP 数据包中的生存时间、标识、总长度和选项”以及其他检查。 此外,-vv
选项将产生更加详细的输出; -vvv
选项将进一步提供更加详细的信息;我们可以查看相关的手册页来了解详细信息。
总结和命令示例
下表提供了本小节所涉及的命令行选项的摘要。
Command 命令 | Explanation 解释 |
---|---|
tcpdump -i INTERFACE |
捕获特定网络接口上的数据包 |
tcpdump -w FILE |
将捕获的数据包写入文件 |
tcpdump -r FILE |
从文件中读取已捕获的数据包 |
tcpdump -c COUNT |
捕获特定数量的数据包 |
tcpdump -n |
不解析 IP 地址 |
tcpdump -nn |
不解析 IP 地址,也不解析协议号(端口号) |
tcpdump -v |
详细显示;可以使用-vv 和-vvv 增加详细程度 |
请查看以下示例:
tcpdump -i eth0 -c 50 -v
通过监听eth0
接口(有线以太网)捕获并显示 50 个数据包,并详细显示它们。tcpdump -i wlo1 -w data.pcap
通过监听wlo1
接口(WiFi 接口)来捕获数据包并将数据包写入data.pcap
。它将持续运行,直到用户按下CTRL+C 键来中断捕获数据包的行为。tcpdump -i any -nn
捕获所有接口上的数据包并将其显示在屏幕上,不进行域名解析以及协议解析。
答题
你可以在命令中添加什么选项以仅以数字格式显示地址?
-n
过滤表达式
虽然你可以在不提供任何过滤表达式的情况下运行tcpdump
命令,但这没什么用。就像在社交聚会中一样,你不会试图同时听取所有人的意见;你更倾向于关注特定的人或对话。考虑到我们的网卡所能检测到的数据包数量,我们不可能一次性看到所有内容;我们需要具体化的内容并且会倾向于去捕获我们有兴趣检查的内容。
按主机(Host)过滤
假设你只对与网络打印机或特定游戏服务器发生交换的 IP 数据包感兴趣。你可以使用host IP
或host HOSTNAME
参数选项来轻松地将捕获的数据包限制到特定主机。在下面的终端输出中,我们将捕获与example.com
发生交换的所有数据包,并会将它们保存到http.pcap
。
tips:需要注意的是,在捕获数据包时还需要你以root
身份完成登录或使用sudo
来执行终端命令 。
user@TryHackMe$ sudo tcpdump host example.com -w http.pcap
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), snapshot length 262144 bytes
16:49:02.482295 IP 192.168.139.132.49480 > 93.184.215.14.http: Flags [S], seq 3330895816, win 32120, options [mss 1460,sackOK,TS val 621343956 ecr 0,nop,wscale 7], length 0
16:49:02.635087 IP 93.184.215.14.http > 192.168.139.132.49480: Flags [S.], seq 2231582859, ack 3330895817, win 64240, options [mss 1460], length 0
16:49:02.635125 IP 192.168.139.132.49480 > 93.184.215.14.http: Flags [.], ack 1, win 32120, length 0
16:49:02.635491 IP 192.168.139.132.49480 > 93.184.215.14.http: Flags [P.], seq 1:131, ack 1, win 32120, length 130: HTTP: GET / HTTP/1.1
16:49:02.635580 IP 93.184.215.14.http > 192.168.139.132.49480: Flags [.], ack 131, win 64240, length 0
[...]
^C
13 packets captured
25 packets received by filter
0 packets dropped by kernel
如果要将数据包限制为来自特定源 IP 地址或主机名的数据包,则必须使用src host IP
或src host HOSTNAME
参数选项 。同样,你还可以使用dst host IP
或dst host HOSTNAME
参数选项来将数据包限制为发送到特定目标的数据包。
按端口过滤
如果要捕获所有的DNS流量,你可以将捕获的数据包限制为port 53
上的数据包。请记住, DNS默认会使用UDP和TCP端口53。在下面的示例中,我们可以看到我们的网卡所能读取的所有DNS查询。下面的终端显示了两个DNS查询:第一个查询在请求example.org所使用的 IPv4 地址,第二个查询在请求与example.org关联的 IPv6地址。
user@TryHackMe$ sudo tcpdump -i ens5 port 53 -n
[sudo] password for strategos:
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), snapshot length 262144 bytes
17:26:33.591670 IP 192.168.139.132.47902 > 192.168.139.2.53: 47108+ A? example.org. (29)
17:26:33.591717 IP 192.168.139.132.47902 > 192.168.139.2.53: 5+ AAAA? example.org. (29)
17:26:33.593324 IP 192.168.139.2.53 > 192.168.139.132.47902: 47108 1/0/0 A 93.184.215.14 (45)
17:26:33.593325 IP 192.168.139.2.53 > 192.168.139.132.47902: 5 1/0/0 AAAA 2606:2800:21f:cb07:6820:80da:af6b:8b2c (57)
[...]
^C
12 packets captured
12 packets received by filter
0 packets dropped by kernel
在上面的示例中,我们捕获了所有发送到或来自特定端口号的数据包。你可以分别使用src port PORT_NUMBER
和dst port PORT_NUMBER
来将数据包限制为来自特定源端口号或发送至特定目标端口号的数据包。
按协议过滤
我们将介绍的最后一种过滤类型是按协议进行过滤。你可以将数据包捕获限制为特定协议,包括: ip
、 ip6
、 udp
、 tcp
和icmp
。在下面的示例中,我们将数据包捕获限制为 ICMP 数据包。我们可以看到 ICMP 回显请求和回复,这可能表明有人正在运行ping
命令。此外,还会出现 ICMP 超时消息,这可能是由于运行了traceroute
命令造成的(如Networking Essentials 网络基本要点实验房间中所述的那样)。
user@TryHackMe$ sudo tcpdump -i ens5 icmp -n
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), snapshot length 262144 bytes
18:11:00.624681 IP 192.168.139.132 > 93.184.215.14: ICMP echo request, id 47038, seq 1, length 64
18:11:00.781482 IP 93.184.215.14 > 192.168.139.132: ICMP echo reply, id 47038, seq 1, length 64
18:11:04.168792 IP 192.168.139.2 > 192.168.139.132: ICMP time exceeded in-transit, length 68
18:11:04.168815 IP 192.168.139.2 > 192.168.139.132: ICMP time exceeded in-transit, length 68
[...]
18:11:14.857188 IP 93.184.215.14 > 192.168.139.132: ICMP 93.184.215.14 udp port 33495 unreachable, length 68
^C
52 packets captured
52 packets received by filter
0 packets dropped by kernel
逻辑运算符
在此介绍三个很方便的逻辑运算符:
and
:捕获两个条件都成立的数据包。例如,tcpdump host 1.1.1.1 and tcp
表示 捕获host 1.1.1.1
的tcp
流量。or
:当其中一个条件为真(成立)时捕获数据包。例如,tcpdump udp or icmp
表示 捕获UDP流量或者ICMP流量。not
:当条件不成立时捕获数据包。例如,tcpdump not tcp
表示 捕获除TCP数据段之外的所有数据包;我们预期会在结果中找到UDP、ICMP和ARP数据包。
总结和命令示例
下表给出了我们在本小节中所介绍的命令行参数选项的摘要。
Command 命令 | Explanation 解释 |
---|---|
tcpdump host IP or tcpdump host HOSTNAME |
按 IP 地址或主机名(hostname)过滤数据包 |
tcpdump src host IP or tcpdump src host HOSTNAME |
按特定源主机(host)过滤数据包 |
tcpdump dst host IP |
按特定目标主机(host)过滤数据包 |
tcpdump port PORT_NUMBER |
按端口号过滤数据包 |
tcpdump src port PORT_NUMBER |
按指定源端口号过滤数据包 |
tcpdump dst port PORT_NUMBER |
按指定目的端口号过滤数据包 |
tcpdump PROTOCOL |
按协议过滤数据包;包括ip 、 ip6 和icmp 等协议 |
请查看以下示例:
tcpdump -i any tcp port 22
监听所有接口并捕获往返于port 22
的tcp
数据包,即SSH流量。tcpdump -i wlo1 udp port 123
监听wlo1(WiFi 网卡)并过滤到port 123
(Network Time Protocol-NTP-网络时间协议)的udp
流量。tcpdump -i eth0 host example.com and tcp port 443 -w https.pcap
will listen oneth0
, the wired Ethernet interface and filter traffic exchanged withexample.com
that usestcp
andport 443
. In other words, this command is filtering HTTPS traffic related toexample.com
.
tcpdump -i eth0 host example.com and tcp port 443 -w https.pcap
监听eth0
(有线以太网接口),并且将过滤与example.com
相关以及往返于port 443
的tcp
数据包;换句话说,这条命令会过滤与example.com
相关的 HTTPS 流量。
对于本小节中的问题,我们将从traffic.pcap
文件中读取已捕获的数据包并进行分析。如前所述,我们可以使用-r FILE
参数选项来从数据包捕获文件中读取内容。为了测试这一点,我们可以尝试执行tcpdump -r traffic.pcap -c 5 -n
命令,此命令应该会显示指定文件中的前五个数据包,并且不会显示IP地址的解析结果。
请记住,你可以通过wc
命令通过管道输出 来计算行数。在下面的终端示例中,我们可以看到有 910 个数据包,源IP地址将设置为192.168.124.1
。请注意,我们添加-n
是为了避免在尝试解析 IP 地址时出现不必要的延迟。在下面的示例中,我们没有使用sudo
,因为读取数据包捕获文件时 并不需要root
权限。
user@TryHackMe$ tcpdump -r traffic.pcap src host 192.168.124.1 -n | wc
reading from file traffic.pcap, link-type EN10MB (Ethernet)
910 17415 140616
答题
部署实验环境,在实验虚拟机上打开终端界面。
traffic.pcap
中有多少数据包使用了ICMP协议?
#Password: THM123
sudo tcpdump -r traffic.pcap icmp -n | wc
26
请求192.168.124.137的MAC 地址的主机的IP地址是什么?
tips:按 ARP 协议进行过滤
sudo tcpdump -r traffic.pcap arp and host 192.168.124.137
192.168.124.148
第一个 DNS 查询中出现的主机名(子域)是什么?
#sudo tcpdump -r traffic.pcap port 53 -A
sudo tcpdump -r traffic.pcap port 53
mirrors.rockylinux.org
高级过滤
除了上一小节中所介绍的过滤表达式之外,还有很多可以过滤数据包的方法。毕竟,在具体的实际工作场景中,我们需要过滤数千个甚至数百万个数据包。能够准确表达要显示的数据包是必不可少的一项技能。例如,我们可以将要显示的数据包限制为小于或大于特定长度的数据包:
greater LENGTH
:过滤长度大于或等于指定长度的数据包;less LENGTH
:过滤长度小于或等于指定长度的数据包。
我们建议你通过使用man pcap-filter
命令来查看pcap-filter
的手册页;然而,在本小节中,我们将重点介绍一个高级选项,它允许你根据TCP flags来过滤数据包。了解TCP flags将有助于你更好地理解本小节相关的知识,并且掌握更高级的过滤技术。
二元运算
在继续学习之前,我们可以先了解一下二元运算的概念。二元运算是在位(bits)上进行操作,即0和1。一个运算将接受一位或两位,然后返回一位。接下来,让我们更加深入地查看并理解以下三个二元运算操作符: &
、 |
和!
。
&
(And-与)接受两位输入并且会返回 0 作为输出结果,除非两个输入均为 1,如下表所示。
Input 1 | Input 2 | Input1 & Input 2 |
---|---|---|
0 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
|
(Or-或) 接受两位输入并且会返回 1 作为输出结果,除非两个输入均为 0。如下表所示。
| Input 1 | Input 2 | Input 1 |
Input 2 |
| ------- | ------- | ------------------- |
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 1 |
!
(Not-非)接受一位输入并会将其反转以作为输出;输入 1 将给出 0 作为输出,输入 0 将给出 1 作为输出,如下表所示。
Input 1 | ! Input 1 |
---|---|
0 | 1 |
1 | 0 |
标头字节
本小节的目的是介绍Tcpdump如何根据标头字节的内容来过滤数据包。主要会涉及以下协议的标头: ARP 、以太网(Ethernet)、ICMP、IP、TCP 和UDP 。这些都是我们已经学习过的一些网络协议。那么,如何让Tcpdump根据协议标头字节的内容来过滤数据包呢? (我们不会详细介绍每个协议的标头,因为这超出了本文的内容范围;在此,我们将重点介绍TCP flags)
使用 pcap-filter,Tcpdump允许你使用以下语法proto[expr:size]
来引用标头中任何字节的内容,其中:
proto
指的是协议,包括arp
、ether
、icmp
、ip
、ip6
、tcp
和udp
,分别指的是ARP、以太网、ICMP、 IPv4、 IPv6、 TCP和UDP协议。expr
表示字节偏移量,其中0
表示第一个字节。size
表示我们感兴趣的字节数,可以是 1、2 或 4;它是可选的,默认情况下是 1。
为了更好地理解这一点,请查看 pcap-filter 手册页中的以下两个示例(如果你发现它们很难理解,也请不要担心):
- ether[0] & 1 != 0:取 以太网标头 中的第一个字节并将其与十进制数 1(即二进制的
0000 0001
)进行&
(与)运算。如果结果不等于数字 0(即0000 0000
),它将返回 true。此过滤器的目的是显示发送到多播地址的数据包。多播以太网地址是一种特定地址,用于标识一组旨在接收相同数据的设备。 - ip[0] & 0xf != 5:取 IP 标头 中的第一个字节并将其与十六进制数 F(即二进制的
0000 1111
)进行&
(与)运算。如果结果不等于十进制数5(即二进制的0000 0101
),它将返回 true。此过滤器的目的是捕获所有带有选项的 IP 数据包。
Don’t worry if you find the above two examples complex. We included them so you know what you can achieve with this; however, fully understanding the above examples is not necessary to finish this task. Instead, we will focus on filtering TCP packets based on the set TCP flags.
如果你发现上面两个示例比较复杂,也不用担心。我们之所以将它们包括在本小节之内,是为了让你知道使用它们可以实现什么目标;然而,完成本小节的学习并不需要你完全理解以上示例。我们将重点介绍如何根据设置的TCP flags来过滤TCP数据包。
你可以使用tcp[tcpflags]
来引用TCP flags 字段,一些可供使用的TCP flags如下所示:
tcp-syn
TCP SYN(Synchronize-同步)tcp-ack
TCP ACK(Acknowledge-确认)tcp-fin
TCP FIN(Finish-完成)tcp-rst
TCP RST(Reset-重置)tcp-push
TCP Push(Push-推送)
基于以上内容,我们可以编写出类似于下面的过滤器:
tcpdump "tcp[tcpflags] == tcp-syn"
捕获仅设置了 SYN(Synchronize-同步)flag(而所有其他flag均未设置)的TCP数据包。tcpdump "tcp[tcpflags] & tcp-syn != 0"
捕获至少设置了 SYN(Synchronize-同步)flag的TCP数据包。tcpdump "tcp[tcpflags] & (tcp-syn|tcp-ack) != 0"
捕获至少设置了 SYN(Synchronize-同步)flag 或 ACK(Acknowledge-确认)flag的TCP数据包。
你可以根据你要查找的内容编写你自己的过滤器。
答题
有多少个数据包仅设置了 TCP Reset (RST) flag ?
sudo tcpdump -r traffic.pcap 'tcp[tcpflags] == tcp-rst' | wc -l
57
发送大于 15000 字节的数据包的主机的 IP 地址是什么?
sudo tcpdump -r traffic.pcap 'greater 15000' -n
185.117.80.53
显示数据包
Tcpdump 是一个功能丰富的程序,它具有多个参数选项来 自定义数据包的打印和显示方式。在此,我们将主要介绍以下五个选项:
-q
:快速输出;打印简短的数据包信息-e
:打印链接级标头(link-level header)-A
:以 ASCII 格式显示数据包数据-xx
:以十六进制格式显示数据包数据,hexadecimal(十六进制格式)的简称为hex-X
:以十六进制和ASCII两种格式来显示数据包标头和数据
为了演示上述参数选项会如何影响tcpdump命令的输出结果,我们将首先使用tcpdump命令来显示已捕获的数据包的内容,并且不附加任何其他参数选项。
user@TryHackMe$ tcpdump -r TwoPackets.pcap
reading from file TwoPackets.pcap, link-type EN10MB (Ethernet), snapshot length 262144
18:59:59.979771 IP 104.18.12.149.https > g5000.45248: Flags [P.], seq 2695955324:2695955349, ack 2856007037, win 16, options [nop,nop,TS val 412758285 ecr 3959057198], length 25
18:59:59.980574 IP g5000.45248 > 104.18.12.149.https: Flags [P.], seq 1:30, ack 25, win 2175, options [nop,nop,TS val 3959057384 ecr 412758285], length 29
简要地显示数据包信息
在使用tcpdump命令时,如果你希望得到较短的输出内容,那么你可以选择使用-q
来进行“快速-quick”输出。以下示例显示了时间戳、源和目标IP地址、源和目标端口号等信息。
user@TryHackMe$ tcpdump -r TwoPackets.pcap -q
reading from file TwoPackets.pcap, link-type EN10MB (Ethernet), snapshot length 262144
18:59:59.979771 IP 104.18.12.149.https > g5000.45248: tcp 25
18:59:59.980574 IP g5000.45248 > 104.18.12.149.https: tcp 29
显示链接级标头
如果你使用的是以太网或 WiFi 网络,并且希望在Tcpdump命令的输出中包含 MAC 地址,那么你所需要做的就是添加-e
参数选项 。这在你学习特定协议(例如ARP和DHCP)的工作原理时非常方便。此参数选项还可以帮助你追踪网络上任何异常数据包的来源。
user@TryHackMe$ tcpdump -r TwoPackets.pcap -e
reading from file TwoPackets.pcap, link-type EN10MB (Ethernet), snapshot length 262144
18:59:59.979771 44:df:65:d8:fe:6c (oui Unknown) > 02:83:1e:40:5d:17 (oui Unknown), ethertype IPv4 (0x0800), length 91: 104.18.12.149.https > g5000.45248: Flags [P.], seq 2695955324:2695955349, ack 2856007037, win 16, options [nop,nop,TS val 412758285 ecr 3959057198], length 25
18:59:59.980574 02:83:1e:40:5d:17 (oui Unknown) > 44:df:65:d8:fe:6c (oui Unknown), ethertype IPv4 (0x0800), length 95: g5000.45248 > 104.18.12.149.https: Flags [P.], seq 1:30, ack 25, win 2175, options [nop,nop,TS val 3959057384 ecr 412758285], length 29
以ASCII格式显示数据包
ASCII 代表美国信息交换标准代码(American Standard Code for Information Interchange); ASCII 码可以表示文本内容。换句话说,你可以期望在使用-A
参数时,tcpdump能够显示所有可以映射到英文字母、数字和符号的字节。
user@TryHackMe$ tcpdump -r TwoPackets.pcap -A
reading from file TwoPackets.pcap, link-type EN10MB (Ethernet), snapshot length 262144
18:59:59.979771 IP 104.18.12.149.https > g5000.45248: Flags [P.], seq 2695955324:2695955349, ack 2856007037, win 16, options [nop,nop,TS val 412758285 ecr 3959057198], length 25
E..M..@.5..)h.....BY.......|.;5}...........
..1...k......j.3.2.....&9a.....-L
18:59:59.980574 IP g5000.45248 > 104.18.12.149.https: Flags [P.], seq 1:30, ack 25, win 2175, options [nop,nop,TS val 3959057384 ecr 412758285], length 29
E..Ql.@.@.VV..BYh........;5}...............
..k...1.......1.y.&VC<#._J$..z...D#.`
以十六进制格式显示数据包
当数据包内容是纯文本英文时,ASCII格式的显示效果很好;但如果数据包内容经过加密甚至压缩,那么以ASCII格式显示将无法正常查看。此外,对于不使用英语字母的语言,ASCII 格式也不起作用。因此,我们有时候还需要使用另一种方式来显示数据包内容,而不受格式限制。由于八位组(octet)的位数为8位,因此任何八位组都可以显示为两个十六进制数字(每个十六进制数字代表 4 位)。 在使用tcpdump时,如果想要以十六进制格式显示数据包,我们必须添加-xx
参数选项,如下面的终端所示:
user@TryHackMe$ tcpdump -r TwoPackets.pcap -xx
reading from file TwoPackets.pcap, link-type EN10MB (Ethernet), snapshot length 262144
18:59:59.979771 IP 104.18.12.149.https > g5000.45248: Flags [P.], seq 2695955324:2695955349, ack 2856007037, win 16, options [nop,nop,TS val 412758285 ecr 3959057198], length 25
0x0000: 0283 1e40 5d17 44df 65d8 fe6c 0800 4500
0x0010: 004d fbd8 4000 3506 d229 6812 0c95 c0a8
0x0020: 4259 01bb b0c0 a0b1 037c aa3b 357d 8018
0x0030: 0010 f905 0000 0101 080a 189a 310d ebfa
0x0040: 6b2e 1703 0300 146a 8f33 1832 e6a2 fb99
0x0050: eb26 3961 dad4 1611 152d 4c
18:59:59.980574 IP g5000.45248 > 104.18.12.149.https: Flags [P.], seq 1:30, ack 25, win 2175, options [nop,nop,TS val 3959057384 ecr 412758285], length 29
0x0000: 44df 65d8 fe6c 0283 1e40 5d17 0800 4500
0x0010: 0051 6ca8 4000 4006 5656 c0a8 4259 6812
0x0020: 0c95 b0c0 01bb aa3b 357d a0b1 0395 8018
0x0030: 087f 17e0 0000 0101 080a ebfa 6be8 189a
0x0040: 310d 1703 0300 18f4 31fa 798d 2656 433c
0x0050: 2389 5f4a 24c2 fa7a 1496 8444 238e 60
在Tcpdump命令中添加-xx
参数选项可以让我们逐个八位字节地查看数据包。在上面的示例中,除了数据包内容外,我们还可以仔细地检查 IP 和TCP标头。
同时以两种格式显示数据包
如果你想同时以十六进制和 ASCII 格式来显示已捕获的数据包的内容,那么在Tcpdump命令中使用-X
选项就可以轻松地实现这一点。
user@TryHackMe$ tcpdump -r TwoPackets.pcap -X
reading from file TwoPackets.pcap, link-type EN10MB (Ethernet), snapshot length 262144
18:59:59.979771 IP 104.18.12.149.https > g5000.45248: Flags [P.], seq 2695955324:2695955349, ack 2856007037, win 16, options [nop,nop,TS val 412758285 ecr 3959057198], length 25
0x0000: 4500 004d fbd8 4000 3506 d229 6812 0c95 E..M..@.5..)h...
0x0010: c0a8 4259 01bb b0c0 a0b1 037c aa3b 357d ..BY.......|.;5}
0x0020: 8018 0010 f905 0000 0101 080a 189a 310d ..............1.
0x0030: ebfa 6b2e 1703 0300 146a 8f33 1832 e6a2 ..k......j.3.2..
0x0040: fb99 eb26 3961 dad4 1611 152d 4c ...&9a.....-L
18:59:59.980574 IP g5000.45248 > 104.18.12.149.https: Flags [P.], seq 1:30, ack 25, win 2175, options [nop,nop,TS val 3959057384 ecr 412758285], length 29
0x0000: 4500 0051 6ca8 4000 4006 5656 c0a8 4259 E..Ql.@.@.VV..BY
0x0010: 6812 0c95 b0c0 01bb aa3b 357d a0b1 0395 h........;5}....
0x0020: 8018 087f 17e0 0000 0101 080a ebfa 6be8 ..............k.
0x0030: 189a 310d 1703 0300 18f4 31fa 798d 2656 ..1.......1.y.&V
0x0040: 433c 2389 5f4a 24c2 fa7a 1496 8444 238e C<#._J$..z...D#.
0x0050: 60
总结和示例
下表给出了本小节所涉及的命令行参数选项的摘要。
Command | Explanation |
---|---|
tcpdump -q |
快速而安静(Quick and quite):提供简短的数据包信息 |
tcpdump -e |
所显示的内容将包括 MAC 地址 |
tcpdump -A |
将数据包以ASCII 编码格式打印 |
tcpdump -xx |
以十六进制格式显示数据包 |
tcpdump -X |
同时以十六进制格式和ASCII格式显示数据包 |
答题
发送 ARP 请求的主机的 MAC 地址是多少?
sudo tcpdump -r traffic.pcap arp -e
52:54:00:7c:d3:5b
本文小结
在本文内容中,我们主要介绍了各种 Tcpdump 命令的参数选项。与 Wireshark 和 Tshark 一样,Tcpdump 是一个能够帮助我们更好地理解网络协议的优秀工具。与本文相关的TryHackMe实验房间为我们展示了 Tcpdump 的强大功能,特别是当我们必须针对成千上万个数据包进行筛选时。