[Tcpdump] 网络抓包工具使用教程
往期回顾
| 海思 tcpdump 移植开发详解 | 海思 tcpdump 移植开发详解 |
前言
上一节,我们已经讲解了在海思平台如何基于静态库生成 tcpdump 工具,本节将作为上一节的拓展内容。
一、tcpdump 简介
「 tcpdump 」是一款强大的网络抓包工具,它基于 libpcap 库来抓取网络数据包。对于研究网络数据包的人来说应该不陌生,它的优点就是易安装、易使用、灵活轻便,只要简单的几个指令、参数就可以指定网卡来抓取网络包了。这是一个非常实用的工具,在本文中,将会通过示例结合原理来让大家了解这个工具。
二、tcpdump 安装
1. 交叉编译、移植安装,请参考《海思 tcpdump 移植开发详解》;
2. ubuntu 虚拟机安装,直接使用 apt 或 apt-get 进行安裝:
sudo apt-get install -y tcpdump
三、参数与过滤条件说明
在讲解示例之前,我们先来了解一下基本的参数与过滤条件。

| 参数/过滤条件 | 说明 | 示例 |
| -a | 将捕获的数据包以ASCII格式输出。包括每个数据包的源地址、目标地址、协议类型、端口号以及数据包的有效载荷(payload)等信息。 | tcpdump -a |
| -A | 使用 ASCII 字符串打印报文的全部数据,这样可以使读取更加简单,方便使用 grep 等工具解析输出内容 | tcpdump -A |
| -B buffer_size | 指示缓冲区大小(以千字节计)。将接受较小的值。 如果缓冲区大小小于 BPF 设置的最低值,那么将忽略实际缓冲区大小并使用数据包过滤器 (BPF) 设置的值。 如果未指定 -B 选项,那么缓冲区大小缺省为 32,768 | tcpdump -B 10240 |
| -c count | 指定欲监听的网络数据包数,接收达到指定数目(count)后即停止 | tcpdump -c 100 |
| -C file_size | 与 -w 搭配使用,指定抓包的每个文件的大小,单位是采用1MB (1,000,000 bytes),达到指定的文件大小后,会自动再生成新的文件,新文件名则会加上数字来递增,例如:test.pcap、test.pcap1、test.pcap2… 以此类推 | tcpdump -C 1 |
| -d | 将以详细的格式显示捕获到的数据包的内容,包括数据包的各个字段和标志的详细信息。这些信息可能包括源地址、目标地址、协议类型、端口号、标志位等。 | tcpdump -i eth0 -d |
| -D | 打印系统上可用的网络接口以及 tcpdump 可以捕获包的网络接口列表。 显示每个网络接口的数字和接口名称(可能带有此接口的文本描述)。接口名称或数字可以提供给 -i 标志以指定要捕获的接口 | tcpdump -D |
| -dD | 用于同时显示过滤器规则和可用的网络接口。将首先显示过滤器规则,然后显示系统上可用的网络接口的列表。 | tcpdump -dD |
| -ddd | 将以更详细的格式显示捕获的数据包的内容。它将显示每个数据包的各个字段的详细信息,包括以十进制表示的字节值、协议头部字段、标志位等。 这种详细的显示方式可以帮助你深入了解数据包的结构和内容,对于网络分析和故障排除非常有用。 | tcpdump -ddd |
| -e | 显示数据链路层信息。默认情况下 tcpdump 不会显示数据链路层信息,使用 -e 选项可以显示源和目的 MAC 地址,以及 VLAN tag 信息。 | tcpdump -e |
| -E addr | 指定要显示的网络地址格式。网络层地址通常是 IP 地址。使用该选项,你可以选择不同的格式显示 IP 地址,例如十六进制、十进制、网络字节序(大端序)等。 -E none:不显示网络层地址。 -E hex:以十六进制格式显示网络层地址。 -E decimal:以十进制格式显示网络层地址。 -E network:以网络字节序(大端序)的十六进制格式显示网络层地址。 | tcpdump -E none |
| -f | 用于指定过滤表达式,以便仅捕获满足特定条件的数据包。 | tcpdump -f src host 192.168.1.100 |
| -F file | 用于从指定的文件中读取过滤表达式,而不是直接在命令行中指定过滤表达式。这样可以方便地将复杂的过滤条件保存在一个文件中,并在需要时进行重复使用。例如在 filter.txt 文件中包含过滤条件,将捕获源 IP 地址为 192.168.1.100 的数据包以及目标端口号为 80 的数据包: | tcpdump -F filter.txt |
| -G rotate_seconds | 类似于 -C 参数,-C 是按文件大小来限制,而 -G 则是依据秒数来控制文件大小。 注:在网络数据包不多的情況下,会发生 -G 的秒数到达时,不会自动停止的情况,所以不要太依赖此参数 | tcpdump -G 10 (10秒一个文件) |
| -i interface | 指定网卡名称。选择要捕获的接口,通常是以太网卡或无线网卡,也可以是 vlan 或其他特殊接口。如果该系统上只有一个网络接口,则无需指定。 | tcpdump -i eth0 |
| -K | 校验和是一种用于检测数据传输中的错误的机制。通常情况下,如果数据包的校验和不匹配,操作系统会丢弃该数据包。 而使用 -K 在捕获数据包时会保留包含错误校验和的数据包,而不丢弃它们。这对于调试网络问题或分析网络流量时可能很有用,因为你可以检查包含错误校验和的数据包以了解网络中可能存在的问题。 | tcpdump -K |
| -l | 启用行缓冲模式,输出结果以行为单位进行缓冲和显示。通常在需要实时监视网络流量或对流量进行快速分析时使用。 | tcpdump -l | tee dat or tcpdump -l > dat & tail -f dat |
| -L | 列出每个可用网络接口的名称和描述。需要指定监听的网络接口,以便捕获该接口上的数据包时非常实用。 | tcpdump -L |
| -m module | 用于指定要加载的模块(module)。在 tcpdump 中,模块是一种扩展功能,用于提供额外的协议解析或过滤功能。通过加载模块,可以扩展 tcpdump 的能力,使其能够解析和过滤更多类型的网络流量。 | tcpdump -m module_name |
| -n | 不解析域名,直接显示 IP | tcpdump -n |
| -nn | 用 IP 及 Port 来显示主机名称。不解析域名和端口。这样不仅方便查看 IP 和端口号,而且在抓取大量数据时非常高效,因为域名解析会降低抓取速度。 | tcpdump -i eth0 -nn |
| -N | 省略显示主机名的域名限定。例如,tcpdump 显示 nic 而不是 nic.ddn.mil | tcpdump -N |
| -# | 在每个数据包前显示行号 | tcpdump -# |
| -O | 防止 tcpdump 运行包匹配代码优化器,这仅在怀疑优化器中存在错误时有用 | tcpdump -O |
| -p | 不让网络接口进入混杂模式。默认情况下使用 tcpdump 抓包时,会让网络接口进入混杂模式。一般计算机网卡都工作在非混杂模式下,此时网卡只接受来自网络端口的目的地址指向自己的数据。当网卡工作在混杂模式下时,网卡将来自接口的所有数据都捕获并交给相应的驱动程序。如果设备接入的交换机开启了混杂模式,使用 -p 选项可以有效地过滤噪声。 | tcpdump -p |
| -q | 列出精简的网络数据包信息 | tcpdump -i eth0 -q |
| -r file | 从指定的文件读取网络数据包,该网络数据包文件为 -w 参数所产生。如果 file 为 "-" ,那么将使用标准输入。 | tcpdump -r demo.pcap |
| -t | 禁止打印时间戳。默认情况下,会在输出的每个数据包前显示时间戳,以显示数据包捕获的时间。 | tcpdump -t |
| -tt | 在每个数据包前显示未格式化的时间戳 | tcpdump -tt |
| -ttt | 在每个数据包前显示当前行和上一行的时间差(以微秒为单位)。 | tcpdump -ttt |
| -tttt | 在每个数据包前显示更详细的日期和时间格式的时间戳,包括日期、时、分、秒和毫秒。 | tcpdump -tttt |
| -ttttt | 在每个数据包前显示当前行和第一行的时间差(以微秒为单位)。 | tcpdump -ttttt |
| -U | 禁用缓冲区,直接将捕获到的数据立即输出。默认情况下,会等待缓冲区填满或达到特定的条件后,再按一定的条件进行输出。 | tcpdump -U |
| -v | 指定稍微详细些的输出。例如,显示 IP 信息包中的生存时间、标识、总长度和选项。还启用其他数据包完整性检查,例如,验证 IP 和 ICMP 标题校验和。 | tcpdump -v |
| -vv | 甚至比 -v 更详细的输出。例如,从 NFS 显示其他字段,并对应答包进行完全译码。 | tcpdump -vv |
| -vvv | 甚至比 -vv 更详细的输出。 例如, telnet SB ... SE 选项全部打印。使用 -X Telnet 选项也以十六进制打印。 | tcpdump -vvv |
| -w file | 将抓取的网络数据包保存到文件 | tcpdump -w demo.pcap |
| -W filecount | 与 -C 做搭配,来限制由 -c 所产出的文件数(请注意大小写),当写入的文件数超过指定的数目时,则会以轮替的方式覆盖旧的文件 | tcpdump -W 3 (轮替写入3个文件) |
| -x | 以十六进制显示每个数据包(减去其链接级别标题)。将显示整个数据包或者 snaplen 字节这两者当中的较小者。请注意,这是整个链接层信息包,因此对于填充的链接层(例如,以太网),当更高层的数据包短于必需的填充时,还将显示填充字节。 | tcpdump -x |
| -xx | 以十六进制打印报文的全部数据 | tcpdump -xx |
| -X | 同时使用十六进制和 ASCII 字符串打印报文的全部数据 | tcpdump -X |
| -y datalinktype | 用于指定数据链路类型。可以根据指定的数据链路类型解析和显示数据包的内容。 常见的数据链路类型包括以太网(Ethernet)、无线局域网(Wi-Fi)、点对点协议(PPP)、以及其他各种网络接口类型。 | tcpdump -y ethernet |
| -z postrotate-command | 用于在每次日志文件轮换(rotate)之后执行指定的命令。与 -C 或 -G 选项结合使用时,会导致 tcpdump 命令在 savefile 上运行指定的命令。例如,通过使用 Gzip 或 bzip2 命令指定 -z gzip 或 -z bzip2 | tcpdump -C 100 -W 5 -z ./postrotate-script.sh |
| -Z user | 由所指定的具有系统特权的用户行 tcpdump 命令。可以限制进程的权限和访问权限,以增加系统的安全性。通常,tcpdump 需要以 root 权限运行,以便可以访问网络接口并捕获数据包。 | tcpdump -Z myuser -i eth0 |
| -Q in|out|inout | 选择要抓取网络数据包的传输方向,支持in(接收)、out(发送)、inout(双向)等方向,注意,并非所有的平台都支持此参数 | tcpdump -Q inout |
| host ip | 指定主机名称或IP | host www.baidu.com 或 host 172.168.3.100,若没有指定 src 或 dst ,则预设为「来源」或「目的」二者皆可 |
| port number | 指定端口号 | port 1234,若没有指定 src 或 dst ,则预设为「来源」或「目的」二者皆可 |
| -s0 | tcpdump 默认只会截取前 96 字节的内容,要想截取所有的报文内容,可以使用 -s number,number 就是你要截取的报文字节数,如果是 0 的话,表示截取报文全部内容。 | tcpdump -s0 |
| src | 指定来源 | src host 172.168.3.100 |
| dst | 指定目的 | dst host 172.168.3.100 |
| and / or / not | 逻辑运算:and (&&)、or (||)、not (!) | host 172.168.3.100 or 172.168.3.188 |
| tcp / udp / icmp / ip6 等协议 | 抓取 X 协议的流量网络数据包 | tcp and host 172.168.3.100 |
| portrange range | 指定端口号范围 | portrange 21-23 |
| ether address | 指定主机的 MAC Address | ether host 16:69:44:e3:01:57 |
| net network | 指定特定网段 | net 192.168.1.100 或 net 192.168.1.0/24 |
| ( 或 ) | 支持小括号,可以搭配跳转符号 \ 或使用单引号使用。(可多利用单引号) | ‘(dst port 443 or 22)’ |
四、常用参数示例
在学习的过程,如果有疑惑建议读一下官方的「Tcpdump Man Page」,里边有很多实用的示例可以参考。
示例1
抓取特定主机的数据。使用过滤器 HOST 可以抓取特定目的地址和源 IP 地址的流量。
tcpdump -i eth0 host 172.168.3.88
也可以使用 src 或 dst 只抓取源或目的地址:
tcpdump -i eth0 src 172.168.3.200或
tcpdump -i eth0 dst 172.168.3.88
示例2
监听网卡名称 eth0 的流量,抓取 HOST IP = 172.168.3.88 且 PORT = 80 的数据包 (HOST、IP不指定来源或目的)
tcpdump -i eth0 host 172.168.3.88 and port 80
示例3
监听网卡名称 eth0 的流量,抓取 HOST IP = 172.168.3.88 或 HOST IP = 172.168.3.100 的数据包 (HOST不指定来源或目的)
tcpdump -i eth0 host 172.168.3.88 or host 172.168.3.100或
tcpdump -i eth0 host 172.168.3.88 or 172.168.3.100
示例4
监听网卡名称 eth0 的流量,抓取来源 IP = 172.16.3.88 且目的 IP = 172.16.3.100 的数据包
tcpdump -i eth0 src host 172.168.3.88 and dst host 172.168.3.100
示例5
监听网卡名称 eth0 的流量,抓取 TCP 协议的数据包,且 HOST = 172.168.3.88 以及端口号的范围为 21 ~ 23 (HOST不指定来源或目的)
tcpdump -i eth0 tcp and host 172.168.3.88 and portrange 21-23
示例6
监听网卡名称 eth0 的流量,其来源主机 MAC Address = 16:69:44:e3:01:57 的数据包,并输出详细信息
tcpdump -i eth0 ether src host 16:69:44:e3:01:57 -vv
示例7
监听网卡名称 eth0 的流量,將其流量内容输出到文件 demo.pcap,文件以 1M 大小为上限,如果写满 1M 则另外产生新的文件来保存网络数据包,新文件名的命名会变成 demo.pcap、demo.pcap1、demo.pcap2… 以此类推
tcpdump -i eth0 -C 1 -w demo.pcap
示例8
监听网卡名称 eth0 的流量,將其流量内容输出到文件 demo.pcap,文件以 1M 大小为上限且最多产生 3 个文件,若流量太多导致 3 个文件不够存放,则会以轮替的方式将旧文件覆盖,以保持指定的文件数
tcpdump -i eth0 -C 1 -W 3 -w demo.pcap
示例9
监听网卡名称 eth0 的流量,每抓取 5 秒中的数据包信息便存成一个文件。因此在数据包数不多的情況下,-G 的参数并不会依秒数自动停止,有时要利用 timeout seconds 的方式来使之停止抓包
tcpdump -i eth0 -G 5 -w demo.pcap#利用 timeout 来停止抓包:
timeout 5 tcpdump -i eth0 -w demo.pcap
示例10
监听网卡名称 eth0 的流量,且目的 IP 为 192.168.1.0/24 这个网段
tcpdump -i eth0 dst net 192.168.1.0/24
示例11
监听网卡名称 eth0 的流量,其来源主机为 192.168.1.5,且目的端口号为 443 或 22
tcpdump -i eth0 src host 192.168.1.5 and \(dst port 443 or 22\)或
tcpdump -i eth0 src host 192.168.1.5 and '(dst port 443 or 22)'或
tcpdump -i eth0 'src host 192.168.1.5 and (dst port 443 or 22)'
示例12
监听网卡名称 eth0 的流量,不解析域名和端口,截取报文全部内容,显示更多的详细信息,仅抓取 80 端口上的流量(通常是 HTTP)
tcpdump -i eth0 -nn -s0 -v port 80
示例13
捕获显示 5 个 IPv4 数据包,并显示每个数据包的源和目的IP地址、源和目的端口号,以及以太网头部的详细信息(包括源和目的MAC地址)
tcpdump -n -e -c 5 not ip6
示例14
显示 ASCII 字符串。以 ASCII 字符串形式,显示端口为 80 的数据包的详细信息
tcpdump -A -s0 port 80
示例15
抓取特定协议的数据。后面可以跟上协议名称来过滤特定协议的流量,以 UDP 为例,可以加上参数 udp 或 protocol 17,这两个命令等效。
tcpdump -i eth0 udp或
tcpdump -i eth0 proto 17
同理,tcp 与 protocol 6 意思相同。
示例16
行缓冲模式 。如果想实时将抓取到的数据通过管道传递给其他工具来处理,需要使用 -l 选项来开启行缓冲模式(或使用 -c 选项来开启数据包缓冲模式)。使用 -l 选项可以将输出通过立即发送给其他命令,其他命令会立即响应。
tcpdump -i eth0 -s0 -l port 80 | grep 'Server:'
五、常用过滤器示例
示例1
组合过滤器。过滤的真正强大之处在于你可以随意组合它们,而连接它们的逻辑就是常用的 与/AND/&& 、 或/OR/|| 和 非/not/! 。
and 或 &&
or 或 ||
not 或 !
示例2
Host 过滤器。Host 过滤器用来过滤某个主机的数据报文。例如:
tcpdump host 172.168.3.88
该命令会抓取所有发往主机 172.168.3.88 或者从主机 172.168.3.88 发出的流量。如果想只抓取从该主机发出的流量,可以使用下面的命令:
tcpdump src host 172.168.3.88
示例3
Network 过滤器。Network 过滤器用来过滤某个网段的数据,使用的是 CIDR 模式。可以使用四元组(x.x.x.x)、三元组(x.x.x)、二元组(x.x)和一元组(x)。四元组就是指定某个主机,三元组表示子网掩码为 255.255.255.0,二元组表示子网掩码为 255.255.0.0,一元组表示子网掩码为 255.0.0.0。例如,
抓取所有发往网段 192.168.1.x 或从网段 192.168.1.x 发出的流量:
tcpdump net 192.168.1
抓取所有发往网段 10.x.x.x 或从网段 10.x.x.x 发出的流量:
tcpdump net 10
和 Host 过滤器一样,这里也可以指定源和目的:
tcpdump src net 10
也可以使用 CIDR 格式:
tcpdump src net 172.168.3.0/12
示例4
Proto 过滤器。Proto 过滤器用来过滤某个协议的数据,关键字为 proto,可省略。proto 后面可以跟上协议号或协议名称,支持 icmp, igmp, igrp, pim, ah, esp, carp, vrrp, udp 和 tcp。因为通常的协议名称是保留字段,所以在于 proto 指令一起使用时,必须根据 shell 类型使用一个或两个反斜杠(/)来转义。Linux 中的 shell 需要使用两个反斜杠来转义,MacOS 只需要一个。
例如,抓取 icmp 协议的报文:
tcpdump -n proto \\icmp或
tcpdump -n icmp
示例5
Port 过滤器。Port 过滤器用来过滤通过某个端口的数据报文,关键字为 port。例如:
tcpdump port 389
六、tcpdump 输出的理解
截取数据只是第一步,第二步就是理解这些数据,下面就解释一下 tcpdump 命令输出各部分的意义。
21:27:06.995846 IP (tos 0x0, ttl 64, id 45646, offset 0, flags [DF], proto TCP (6), length 64)192.168.1.106.56166 > 124.192.132.54.80: Flags [S], cksum 0xa730 (correct), seq 992042666, win 65535, options [mss 1460,nop,wscale 4,nop,nop,TS val 663433143 ecr 0,sackOK,eol], length 021:27:07.030487 IP (tos 0x0, ttl 51, id 0, offset 0, flags [DF], proto TCP (6), length 44)124.192.132.54.80 > 192.168.1.106.56166: Flags [S.], cksum 0xedc0 (correct), seq 2147006684, ack 992042667, win 14600, options [mss 1440], length 021:27:07.030527 IP (tos 0x0, ttl 64, id 59119, offset 0, flags [DF], proto TCP (6), length 40)192.168.1.106.56166 > 124.192.132.54.80: Flags [.], cksum 0x3e72 (correct), ack 2147006685, win 65535, length 0
最基本也是最重要的信息就是数据报的源地址/端口和目的地址/端口,上面的例子第一条数据报中,源地址 ip 是 192.168.1.106,源端口是 56166,目的地址是 124.192.132.54,目的端口是 80。 > 符号代表数据的方向。
此外,上面的三条数据还是 TCP 协议的三次握手过程,第一条就是 SYN 报文,这个可以通过 Flags [S] 看出。下面是常见的 TCP 报文的 Flags:
- [S] : SYN(开始连接)
- [.] : 没有 Flag
- [P] : PSH(推送数据)
- [F] : FIN (结束连接)
- [R] : RST(重置连接)
其中,第二条数据的 [S.] 表示 SYN-ACK,即 SYN 报文的应答报文。
七、综合实例
下面给出一些具体的例子,每个例子都可以使用多种方法来获得相同的输出,你使用的方法取决于所需的输出和网络上的流量。我们在排障时,通常只想获取自己想要的内容,可以通过过滤器和 ASCII 输出并结合管道与 grep、cut、awk 等工具来实现此目的。
例如,在抓取 HTTP 请求和响应数据包时,可以通过删除标志 SYN/ACK/FIN 来过滤噪声,但还有更简单的方法,那就是通过管道传递给 grep。在达到目的的同时,我们要选择最简单最高效的方法。下面来看例子。
1. 提取 HTTP 用户代理
从 HTTP 请求头中提取 HTTP 用户代理:
tcpdump -nn -A -s1500 -l | grep "User-Agent:"
通过 egrep 可以同时提取用户代理和主机名(或其他头文件):
tcpdump -nn -A -s1500 -l | egrep -i 'User-Agent:|Host:'
2. 只抓取 HTTP GET 和 POST 流量
抓取 HTTP GET 流量:
tcpdump -s 0 -A -vv 'tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420'
也可以抓取 HTTP POST 请求流量:
tcpdump -s 0 -A -vv 'tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x504f5354'
注意:该方法不能保证抓取到 HTTP POST 有效数据流量,因为一个 POST 请求会被分割为多个 TCP 数据包。
上述两个表达式中的十六进制将会与 GET 和 POST 请求的 ASCII 字符串匹配。例如,tcp[((tcp[12:1] & 0xf0) >> 2):4] 首先会确定我们感兴趣的字节的位置(在 TCP header 之后),然后选择我们希望匹配的 4 个字节。
3. 提取 HTTP 请求的 URL
提取 HTTP 请求的主机名和路径:
tcpdump -s 0 -v -n -l | egrep -i "POST /|GET /|Host:"
4. 提取 HTTP POST 请求中的密码
从 HTTP POST 请求中提取密码和主机名:
tcpdump -s 0 -A -n -l | egrep -i "POST /|pwd=|passwd=|password=|Host:"
5. 提取 Cookies
提取 Set-Cookie(服务端的 Cookie)和 Cookie(客户端的 Cookie):
tcpdump -nn -A -s0 -l | egrep -i 'Set-Cookie|Host:|Cookie:'
6. 抓取 ICMP 数据包
查看网络上的所有 ICMP 数据包:
tcpdump -n icmp
7. 抓取非 ECHO/REPLY 类型的 ICMP 数据包
通过排除 echo 和 reply 类型的数据包使抓取到的数据包不包括标准的 ping 包:
tcpdump 'icmp[icmptype] != icmp-echo and icmp[icmptype] != icmp-echoreply'
8. 抓取 SMTP/POP3 协议的邮件
可以提取电子邮件的正文和其他数据。例如,只提取电子邮件的收件人:
tcpdump -nn -l port 25 | grep -i 'MAIL FROM\|RCPT TO'
9. 抓取 NTP 服务的查询和响应
tcpdump dst port 123
10. 抓取 SNMP 服务的查询和响应
通过 SNMP 服务,渗透测试人员可以获取大量的设备和系统信息。在这些信息中,系统信息最为关键,如操作系统版本、内核版本等。使用 SNMP 协议快速扫描程序 onesixtyone,可以看到目标系统的信息:
onesixtyone 10.10.1.10 public
可以通过 tcpdump 抓取 GetRequest 和 GetResponse:
tcpdump -n -s0 port 161 and udp
11. 切割 pcap 文件
当抓取大量数据并写入文件时,可以自动切割为多个大小相同的文件。例如,下面的命令表示每 3600 秒创建一个新文件 capture-(hour).pcap,每个文件大小不超过 200 * 1000000 字节:
tcpdump -w /tmp/capture-%H.pcap -G 3600 -C 200
这些文件的命名为 capture-{1-24}.pcap,24 小时之后,之前的文件就会被覆盖。
12. 抓取 IPv6 流量
可以通过过滤器 ip6 来抓取 IPv6 流量,同时可以指定协议如 TCP:
tcpdump -nn ip6 proto 6
从之前保存的文件中读取 IPv6 UDP 数据报文:
tcpdump -nr ipv6-test.pcap ip6 proto 17
13. 检测端口扫描
在下面的例子中,你会发现抓取到的报文的源和目的一直不变,且带有标志位 [S] 和 [R],它们与一系列看似随机的目标端口进行匹配。当发送 SYN 之后,如果目标主机的端口没有打开,就会返回一个 RESET。这是 Nmap 等端口扫描工具的标准做法。
tcpdump -nn
14. 过滤 Nmap NSE 脚本测试结果
本例中 Nmap NSE 测试脚本 http-enum.nse 用来检测 HTTP 服务的合法 URL。
在执行脚本测试的主机上:
nmap -p 80 --script=http-enum.nse targetip
在目标主机上:
tcpdump -nn port 80 | grep "GET /"
15. 抓取 DNS 请求和响应
向 Google 公共 DNS 发起的出站 DNS 请求和 A 记录响应可以通过 tcpdump 抓取到:
tcpdump -i wlp58s0 -s0 port 53
16. 抓取 HTTP 有效数据包
抓取 80 端口的 HTTP 有效数据包,排除 TCP 连接建立过程的数据包(SYN / FIN / ACK):
tcpdump 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'
17. 将输出内容重定向到 Wireshark
通常 Wireshark 比 tcpdump 更容易分析应用层协议。一般的做法是在远程服务器上先使用 tcpdump 抓取数据并写入文件,然后再将文件拷贝到本地工作站上用 Wireshark 分析。
不过还有一种更高效的方法,可以通过 ssh 连接将抓取到的数据实时发送给 Wireshark 进行分析。
1) 以 Linux 系统为例,可以通过 sudo apt-get install wireshark 来安装。
例如,如果想分析 DNS 协议,可以使用下面的命令(如果没有 root 权限,则使用 sudo):
ssh <username>@<remote_ip> 'tcpdump -s0 -c 1000 -nn -w - port 53' | wireshark -k -i -
2) 以 MacOS 系统为例,可以通过 brew cask install wireshark 来安装。
例如,如果想分析 DNS 协议,可以使用下面的命令:
ssh root@remotesystem 'tcpdump -s0 -c 1000 -nn -w - port 53' | /Applications/Wireshark.app/Contents/MacOS/Wireshark -k -i -
重要参数:
-s0 : 表示抓取报文全部数据包内容。
-c 1000 : 仅抓取 1000 个数据包后停止抓取。
-nn : 禁用名称解析,以便在输出中显示 IP 地址而不是主机名。
-w - : 表示将抓取的数据包写到标准输出(stdout),而不是文件;
port 53 : 仅抓取目标端口为53(DNS)的数据包。-k : 表示 Wireshark 保持抓取会话打开,而不是在抓取到一定数量的数据后自动停止;
-i - : 表示 Wireshark 从标准输入读取数据,以接收通过管道传递过来的数据包流量。
抓取到的数据重定向到 Wireshark 显示:

-c 选项用来限制抓取数据的大小。如果不限制大小,就只能通过 ctrl-c 来停止抓取,这样一来不仅关闭了 tcpdump,也关闭了 wireshark。
18. 找出发包最多的 IP
找出一段时间内发包最多的 IP,或者从一堆报文中找出发包最多的 IP,可以使用下面的命令:
tcpdump -nnn -t -c 200 | cut -f 1,2,3,4 -d '.' | sort | uniq -c | sort -nr | head -n 20
- cut -f 1,2,3,4 -d ‘.’ : 以 . 为分隔符,打印出每行的前四列 (即 IP 地址)。
- sort | uniq -c : 排序并计数
- sort -nr : 按照数值大小逆向排序
19. 抓取用户名和密码
使用标准纯文本协议,过滤出于用户名和密码相关的报文:
tcpdump port http or port ftp or port smtp or port imap or port pop3 or port telnet -l -A | egrep -i -B5 'pass=|pwd=|log=|login=|user=|username=|pw=|passw=|passwd=|password=|pass:|user:|username:|password:|login:|pass |user '
20. 抓取 DHCP 报文
抓取 DHCP 服务的请求和响应报文,67 为 DHCP 端口,68 为客户机端口。
tcpdump -v -n port 67 or 68
八、参考文献
1. Tcpdump 网络包指令示例教学
2. Tcpdump Examples
3. tcpdump 命令
4. Tcpdump 使用教程
5. Tcpdump 官网
相关文章:
[Tcpdump] 网络抓包工具使用教程
往期回顾 海思 tcpdump 移植开发详解海思 tcpdump 移植开发详解 前言 上一节,我们已经讲解了在海思平台如何基于静态库生成 tcpdump 工具,本节将作为上一节的拓展内容。 一、tcpdump 简介 「 tcpdump 」是一款强大的网络抓包工具,它基于…...
MongoDB常用命令
3.1 案例需求 存放文章评论的数据存放到MongoDB中,数据结构参考如下: 数据库:articledb 3.2 数据库操作 3.2.1 选择和创建数据库 选择和创建数据库的语法格式: use 数据库名称 如果数据库不存在则自动创建,例如&a…...
强敌环伺:金融业信息安全威胁分析——整体态势
从早期的Zeus和其他以银行为目标的特洛伊木马程序,到现在的大规模分布式拒绝服务(DDoS)攻击,再到新颖的钓鱼攻击和勒索软件,金融服务业已成为遭遇网络犯罪威胁最严重的行业之一。金融服务业的重要性不言而喻࿰…...
FreeRTOS简介
一 FreeRTOS简介 实时操作系统(Real-Time Operating System,RTOS)是一种专门设计用于处理实时任务的操作系统。它的主要作用是提供具有严格时间约束的任务调度和资源管理,以满足实时系统对时间的要求。 可分为硬实时和软实时&am…...
51单片机点灯
51单片机点灯 1.点亮LED灯 #include "reg52.h"sbit ledOne P3^7;void main() {//灯亮,给一个P3.7低电平ledOne 0; }给LED1对应标号的P3^7一个低电平,就能点亮LED灯2.LED灯闪烁 #include "reg52.h"sbit ledOne P3^7;void Delay…...
sql注入之union联合注入
一、Union注入 联合查询注入是联合两个表进行注入攻击,使用关键词 union select 对两个表进行联合查询。两个表的字段数要相同,不然会出现报错。列数相同 union 特性是显示两张表 我们就可以吧第一个参数变为------负--的 或者不存在的值 就行了 显示就…...
activiti解决实现ExecutionListener spring 自动注入@Autowired为null问题
在 Activiti 中,当使用 ExecutionListener 时,Spring 的自动注入机制(例如 Autowired)可能无法正常工作。这是因为 ExecutionListener 是由 Activiti 管理的,并不是由 Spring 管理的,所以无法通过 Autowire…...
【Lazy ORM 整合druid 实现mysql监控】
Lazy ORM 整合druid 实现mysql监控 JDK 17 Lazy ORM框架地址 up、up欢迎start、issues 当前项目案例地址 框架版本描述spring-boot3.0.7springboot框架wu-framework-web1.2.2-JDK17-SNAPSHOTweb容器Lazy -ORM1.2.2-JDK17-SNAPSHOTORMmysql-connector-j8.0.33mysql驱动druid-…...
【Deeplabv3+】Ubutu18.04中使用pytorch复现Deeplabv3+第三步)-----CityscapesScripts生成自己的标签
本文是在前面两篇文章的基础上,讲解如何更改训练数据集颜色,需要与前面两篇文章连起来看。 本文用于修改cityscapes数据集的标签颜色与Semankitti数据集的标签一致,对修改后的数据集进行训练。需要下载两个开发工具包和一个数据集࿰…...
《动手学深度学习(PyTorch版)》笔记3.3
注:书中对代码的讲解并不详细,本文对很多细节做了详细注释。另外,书上的源代码是在Jupyter Notebook上运行的,较为分散,本文将代码集中起来,并加以完善,全部用vscode在python 3.9.18下测试通过。…...
OpenGL ES 渲染 NV21、NV12 格式图像有哪些“姿势”?
使用2个纹理实现 NV21 格式图像渲染 前文提到渲染 NV21 格式图像需要使用 2 个纹理,分别用于保存 Y plane 和 UV plane 的数据,然后在片段着色器中分别对 2 个纹理进行采样,转换成 RGB 数据。 OpenGLES 渲染 NV21或 NV12 格式图像需要用到 GL_LUMINANCE 和 GL_LUMINANCE_A…...
P8813 [CSP-J 2022] 乘方 题解
目录 题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 样例 #2样例输入 #2样例输出 #2 提示题目简化题目思路AC 代码 观前提示,此题解解法非正解,仅仅是卡过数据才 A C AC AC 的。正解请参考他人博客。 题目描述 小文同学刚刚接触了信息学竞赛…...
Ubuntu 常用命令、docker 常用命令、unzip常用命令、tar常用命令
ubuntu 常用命令: 进入管理员模式: sudo su退出管理员模式: su <用户名>重启系统: rebootubuntu 复制文件夹下文件到其他文件夹下 cp -r source_folder/* destination_folder/删除文件夹下内容而不删除自身(进入到目录…...
保护医疗数据不受威胁:MPLS专线在医疗网络安全中的角色
随着数字技术的快速发展,医疗行业正在经历一场革命。从电子健康记录到远程医疗服务,数字化不仅提高了效率,也带来了前所未有的挑战--尤其是关于数据安全和隐私保护的挑战。在这样的背景下,如何确保敏感的医疗数据安全传输…...
Java面试题夺命连环问
如何实现一个ioc容器 配置文件配置包扫码路径递归包扫描获取.class文件反射确定需要 交给IOC管理的类对需要注入的类进行依赖注入 配置文件中指定需要扫描的包路径 定义一些注解,分别表示访问控制层,业务服务层,数据持久层,依赖…...
华为策略路由+NQA配置
---NQA--- [RouterA] nqa test-instance admin NQA [RouterA-nqa-admin-vlan10] test-type icmp [RouterA-nqa-admin-vlan10] destination-address ipv4 对方地址 [RouterA-nqa-admin-vlan10] frequency 10 [RouterA-nqa-admin-vlan10] probe-count 2 [RouterA-nqa-admin-vlan…...
逆置字符串
将字符串逆序,比如输入abcd,返回dcba void reverse(char*left,char *right) { while (right>left) { char temp *left; *left *right; *right temp; right--; left; } } int main() { char arr[100] { 0 };//定义…...
第九节HarmonyOS 常用基础组件14-DataPanel
1、描述 数据面板组件,用于将多个数据占比情况使用占比图进行展示。 2、接口 DataPanel(options:{values: number[], max?: numner, type?: DataPanelType}) 3、参数 参数名 参数类型 必填 描述 values number[] 是 数据值列表,最多含9条数…...
Vue开发之proxy代理的配置(附带uniapp代理配置)
vue 1.在vue.config.js中添加 devServer 属性中配置 proxy 属性 module.exports {productionSourceMap: false,publicPath: /,devServer: {port: 8085,proxy: {/api/admin: {target: http://10.58.104.70:6111,changeOrigin: true,pathRewrite: {/api/: /}},/api: {target: …...
【数据分享】2023年我国省市县三级的公司企业数量(21类公司企业/Excel/Shp格式)
医药公司、建筑公司、电信公司等公司企业的数量是一个城市生命力的重要体现,一个城市的公司企业种类越丰富,数量越多,通常能表示这个城市的生命力越旺盛! 本次我们为大家带来的是我国各省份、各地级市、各区县三个层级的公司企业…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...
中医有效性探讨
文章目录 西医是如何发展到以生物化学为药理基础的现代医学?传统医学奠基期(远古 - 17 世纪)近代医学转型期(17 世纪 - 19 世纪末)现代医学成熟期(20世纪至今) 中医的源远流长和一脉相承远古至…...
MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)
macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 🍺 最新版brew安装慢到怀疑人生?别怕,教你轻松起飞! 最近Homebrew更新至最新版,每次执行 brew 命令时都会自动从官方地址 https://formulae.…...
[C++错误经验]case语句跳过变量初始化
标题:[C错误经验]case语句跳过变量初始化 水墨不写bug 文章目录 一、错误信息复现二、错误分析三、解决方法 一、错误信息复现 write.cc:80:14: error: jump to case label80 | case 2:| ^ write.cc:76:20: note: crosses initialization…...
Linux【5】-----编译和烧写Linux系统镜像(RK3568)
参考:讯为 1、文件系统 不同的文件系统组成了:debian、ubuntu、buildroot、qt等系统 每个文件系统的uboot和kernel是一样的 2、源码目录介绍 目录 3、正式编译 编译脚本build.sh 帮助内容如下: Available options: uboot …...
Windows开机自动启动中间件
WinSW(Windows Service Wrapper 是一个开源的 Windows 服务包装器,它可以帮助你将应用程序打包成系统服务,并实现开机自启动的功能。 一、下载 WinSW 下载 WinSW-x64.exe v2.12.0 (⬇️ 更多版本下载) 和 sample-minimal.xml 二、配置 WinS…...
【Redis】Redis 的持久化策略
目录 一、RDB 定期备份 1.2 触发方式 1.2.1 手动触发 1.2.2.1 自动触发 RDB 持久化机制的场景 1.2.2.2 检查是否触发 1.2.2.3 线上运维配置 1.3 检索工具 1.4 RDB 备份实现原理 1.5 禁用 RDB 快照 1.6 RDB 优缺点分析 二、AOF 实时备份 2.1 配置文件解析 2.2 开启…...
C++ vector容器存储对象和存储指针的区别(vector对象、vector指针)(存储指针时推荐使用智能指针)
文章目录 **1. 内存管理**- **存储对象**:- **存储指针**: **2. 生命周期控制**- **存储对象**:- **存储指针**: **3. 性能差异**- **存储对象**:- **存储指针**: **4. 使用场景**- **选择存储对象的情况**…...
破解HTTP无状态:基于Java的Session与Cookie协同工作指南
HTTP协议自身是属于“无状态”协议 无状态是指:默认情况下,HTTP协议的客户端和服务器之间的这次通信,和下次通信之间没有直接的关系 但在实际开发中,我们很多时候是需要知道请求之间的关联关系的 上述图中的令牌,通常就…...
附加模块--Qt OpenGL模块功能及架构
一、模块功能: 主要变化 Qt OpenGL 模块的分离: 在 Qt 6 中,原来的 Qt OpenGL 功能被拆分为多个模块 传统的 Qt OpenGL 模块 (QGL*) 已被标记为废弃 新的图形架构: Qt 6 引入了基于 QRhi (Qt Rendering Hardware Interface) 的…...
