[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,768tcpdump -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 的数据包:
src host 192.168.1.100
dst port 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不解析域名,直接显示 IPtcpdump -n
-nn用 IP 及 Port 来显示主机名称。不解析域名和端口。这样不仅方便查看 IP 和端口号,而且在抓取大量数据时非常高效,因为域名解析会降低抓取速度。tcpdump -i eth0 -nn
-N省略显示主机名的域名限定。例如,tcpdump 显示 nic 而不是 nic.ddn.miltcpdump -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 上运行指定的命令。例如,通过使用 Gzipbzip2 命令指定 -z gzip-z bzip2tcpdump -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指定主机名称或IPhost www.baidu.com 或 host 172.168.3.100,若没有指定 src  dst ,则预设为「来源」或「目的」二者皆可
port number指定端口号port 1234,若没有指定 src  dst ,则预设为「来源」或「目的」二者皆可
-s0tcpdump 默认只会截取前 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 Addressether 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 官网 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/249758.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

deque容器的相关概念及常用接口

deque的基本概念 作用&#xff1a;作为双端数组&#xff0c;可以很方便的对头尾进行插入和删除操作 注意&#xff1a;适用deque时需包含头文件deque deque与vector的区别 1、vector对数组头部的插入和删除操作效率低&#xff0c;时间复杂度高。数据量越大&#xff0c;效率越…

Python学习03 -- 函数相关内容

1.def --- 这个是定义函数的关键字 \n --- 这个在print()函数中是换行符号 1.注意是x, 加个空格之后再y 1.形式参数数量是不受限制的&#xff08;参数间用&#xff0c;隔开&#xff09;&#xff0c;传实参给形参的时候要一一对应 返回值 --- 函数返还的结果捏 1.写None的时…

2023年09月CCF-GESP编程能力等级认证Python编程五级真题解析

Python等级认证GESP(1~6级)全部真题・点这里 一、单选题(共15题,共30分) 第1题 近年来,线上授课变得普遍,很多有助于改善教学效果的设备也逐渐流行,其中包括比较常用的手写板,那么它属于哪类设备?( ) A:输入 B:输出 C:控制 D:记录 答案:A 第2题 以下关于…

学习Android的第一天

目录 什么是 Android&#xff1f; Android 官网 Android 应用程序 Android 开发环境搭建 Android 平台架构 Android 应用程序组件 附件组件 Android 第一个程序 HelloWorld 什么是 Android&#xff1f; Android&#xff08;发音为[ˈnˌdrɔɪd]&#xff0c;非官方中文…

【selenium方式】获取微博指定用户指定日期内所有帖子详细数据

这篇文章主要放源代码&#xff0c;思路不会介绍特别清楚&#xff0c;详细思路可以看评论区的b站讲解视频。 1.场景需求 获取微博肖战超话内容部分用户的帖子数据&#xff0c;日期范围限定在近2个月&#xff0c;要求获得帖子的发布时间、帖子文本内容、转发数据、评论数据和点…

【Go 快速入门】包及依赖管理 | Go 第三方包发布 | 接口 | 反射

文章目录 包和依赖管理依赖管理go modgo get go.mod 文件go.sum 文件Go Modules 发布包 接口空接口接口值类型断言 反射reflect.TypeOfreflect.ValueOf结构体反射 项目代码地址&#xff1a;04-PackageInterfaceReflection 包和依赖管理 Go 使用包来支持代码模块化和代码复用&…

市场复盘总结 20240201

仅用于记录当天的市场情况&#xff0c;用于统计交易策略的适用情况&#xff0c;以便程序回测 短线核心&#xff1a;不参与任何级别的调整&#xff0c;采用龙空龙模式 一支股票 10%的时候可以操作&#xff0c; 90%的时间适合空仓等待 昨日主题投资 连板进级率 6/27 22.2% 二进…

AI 原生时代的云计算

本文整理自2023年 12 月 20 日举办的「2023 百度云智大会智算大会」主论坛&#xff0c;百度副总裁谢广军的主题演讲《AI 原生时代的云计算》。 &#xff08;视频回放链接&#xff1a;https://cloud.baidu.com/summit/aicomputing_2023/index.html&#xff09; 大模型的到来&…

一些大语言模型(LLM)相关的开源项目

一些大语言模型&#xff08;LLM&#xff09;相关的开源项目 更多文章访问: https://www.cyisme.top 因为站内限制问题&#xff0c;有些图片无法显示&#xff0c;导致阅读体验较差&#xff0c;可以访问原文&#xff1a;《一些大语言模型&#xff08;LLM&#xff09;相关的开源项…

揭秘远程控制APP的便捷之美!

在这个科技日新月异的时代&#xff0c;我们的生活被各种手机软件所包围。几乎每个人都有一个甚至多个手机&#xff0c;你是否也有遇到过需要远程操作自己某一台手机的场景呢&#xff1f;今天&#xff0c;我要向大家推荐一款神奇的手机远程操作神器&#xff0c;让你可以随时随地…

(2)(2.11) RFD900

文章目录 前言 1 概述 2 主要功能 3 状态LED指示灯 4 接口 5 使用Mission Planner进行配置 6 支持不同国家/地区 7 讨论论坛 前言 RFD900 无线电调制解调器是一款高功率 900Mhz ISM 波段无线电调制解调器&#xff0c;设计用于远距离串行通信。据报道&#xff0c;其通信…

数字孪生 三维建模方式以及细节步骤流程

对于数字孪生这个概念&#xff0c;三维建模不同行业认知都不尽相同。有的行业认为数字孪生重点在于建模&#xff0c;有的行业认为在于物联感知&#xff0c;还有部分认为是虚拟仿真。今天重点从建模角度和大家谈谈数字孪生技术常用的三维建模方式以及精细度分级。 数字孪生平台…

基于鲸鱼优化的knn分类特征选择算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1 鲸鱼优化算法&#xff08;WOA&#xff09; 4.1.1 包围猎物 4.1.2 螺旋式搜索 4.1.3 更新策略 4.2 K近邻&#xff08;KNN&#xff09;分类器 4.3 基于WOA的KNN分类特征选择算法 5.完…

ApacheNginx配置ssl证书

一、Apache配置ssl Linux版本&#xff1a;CentOS Linux release 7.9.2009 (Core) Apache版本&#xff1a;Apache/2.4.6 (CentOS) 1、安装Apache&#xff08;使用默认yum源&#xff09; [root10-35-1-25 ~]# yum -y install httpd2、查Apache版本&启动Apache [root10-35-…

花瓣网美女图片爬取

爬虫基础案例01 花瓣网美女图片 网站url&#xff1a;https://huaban.com 图片爬取 import requests import json import os res requests.get(url "https://api.huaban.com/search/file?text%E7%BE%8E%E5%A5%B3&sortall&limit40&page1&positionsear…

spdk技术原理简介和实践经验

一、导读 与机械硬盘相比&#xff0c;NVMe-ssd在性能、功耗和密度上都有巨大的优势&#xff0c;并且随着固态存储介质的高速发展&#xff0c;其价格也在大幅下降&#xff0c;这些优势使得NVMe-ssd在分布式存储中使用越来越广泛。由于NVMe-ssd的性能比传统磁盘介质高出很多&…

记一次某竞赛中的渗透测试(Windows Server 2003靶机漏洞)

靶机简介 Windows Server 2003是微软公司于2003年3月28日发布的服务器操作系统&#xff0c;它基于Windows XP/Windows NT 5.1进行开发&#xff0c;并在同年4月底上市。以下是关于Windows Server 2003的详细介绍&#xff1a; 系统名称与发布历程&#xff1a; 该产品最初被命名为…

设计模式——2_0 职责链(Chain of Responsibility)

楼下一个男人并得要死&#xff0c;那家隔壁的一家唱着留声机&#xff0c;对面是弄孩子。楼上有两人狂笑&#xff1b;还有打牌声&#xff0c;河中的船上有女人哭她死去的母亲。人类的悲欢并不相通&#xff0c;我只觉得他们吵闹 ——鲁迅 文章目录 定义图纸一个例子&#xff1a;如…

LEETCODE 170. 交易逆序对的总数

class Solution { public:int reversePairs(vector<int>& record) {if(record.size()<1)return 0;//归并 递归int left,right;left0;rightrecord.size()-1;int nummergeSort(left,right,record);return num;}int mergeSort(int left,int right, vector<int>…

C++:异常体系

异常体系 异常1.C语言传统的处理错误的方式2.C异常概念3.异常的使用3.1异常的抛出和捕获3.2 异常的重新抛出3.3异常安全3.4 异常规范 4.C标准库的异常体系5.异常的优缺点 异常 1.C语言传统的处理错误的方式 终止程序&#xff0c;如assert&#xff0c;缺陷&#xff1a;用户难以…