⽹络数据包抓取⼯具_超详细的⽹络抓包神器tcpdump使⽤指
tcpdump 是⼀款强⼤的⽹络抓包⼯具,它使⽤ libpcap 库来抓取⽹络数据包,这个库在⼏乎在所有的 Linux/Unix 中都有。熟悉
tcpdump 的使⽤能够帮助你分析调试⽹络数据,本⽂将通过⼀个个具体的⽰例来介绍它在不同场景下的使⽤⽅法。不管你是系统管理员,程序员,云原⽣⼯程师还是 yaml ⼯程师,掌握 tcpdump 的使⽤都能让你如虎添翼,升职加薪。
1. 基本语法和使⽤⽅法
tcpdump 的常⽤参数如下:
$ tcpdump -i eth0 -nn -s0 -v port 80复制代码
-i : 选择要捕获的接⼝,通常是以太⽹卡或⽆线⽹卡,也可以是 vlan 或其他特殊接⼝。如果该系统上只有⼀个⽹络接⼝,则⽆需指定。
-
nn : 单个 n 表⽰不解析域名,直接显⽰ IP;两个 n 表⽰不解析域名和端⼝。这样不仅⽅便查看 IP 和端⼝号,⽽且在抓取⼤量数据时⾮常⾼效,因为域名解析会降低抓取速度。
-s0 : tcpdump 默认只会截取前 96 字节的内容,要想截取所有的报⽂内容,可以使⽤ -s number, number 就是你要截取的报⽂字节数,如果是 0 的话,表⽰截取报⽂全部内容。
-v : 使⽤ -v,-vv 和 -vvv 来显⽰更多的详细信息,通常会显⽰更多与特定协议相关的信息。
port 80 : 这是⼀个常见的端⼝过滤器,表⽰仅抓取 80 端⼝上的流量,通常是 HTTP。
额外再介绍⼏个常⽤参数:
-p : 不让⽹络接⼝进⼊混杂模式。默认情况下使⽤ tcpdump 抓包时,会让⽹络接⼝进⼊混杂模式。⼀般计算机⽹卡都⼯作在⾮混杂模式下,此时⽹卡只接受来⾃⽹络端⼝的⽬的地址指向⾃⼰的数据。当⽹卡⼯作在混杂模式下时,⽹卡将来⾃接⼝的所有数据都捕获并交给相应的驱动程序。如果设备接⼊的交换机开启了混杂模式,使⽤ -p 选项可以有效地过滤噪声。
-e : 显⽰数据链路层信息。默认情况下 tcpdump 不会显⽰数据链路层信息,使⽤ -e 选项可以显⽰源和⽬的 MAC 地址,以及 VLAN tag 信息。例如:
$ tcpdump -n -e -c 5 not ip6tcpdump: verbose output suppressed, use -v or -vv for full protocol decodelistening on br-lan, link-type EN10MB (Ethernet), ca 显⽰ ASCII 字符串
-A 表⽰使⽤ ASCII 字符串打印报⽂的全部数据,这样可以使读取更加简单,⽅便使⽤ grep 等⼯具解析输出内容。-X 表⽰同时使⽤⼗六进制和 ASCII 字符串打印报⽂的全部数据。这两个参数不能⼀起使⽤。例如:
$ tcpdump -A -s0 port 80复制代码
抓取特定协议的数据
后⾯可以跟上协议名称来过滤特定协议的流量,以 UDP 为例,可以加上参数 udp 或 protocol 17,这两个命令意思相同。
$ tcpdump -i eth0 udp$ tcpdump -i eth0 proto 17复制代码
同理,tcp 与 protocol 6 意思相同。
抓取特定主机的数据
使⽤过滤器 host 可以抓取特定⽬的地和源 IP 地址的流量。
$ tcpdump -i eth0 host 10.10.1.1复制代码
也可以使⽤ src 或 dst 只抓取源或⽬的地:
$ tcpdump -i eth0 dst 10.10.1.20复制代码
将抓取的数据写⼊⽂件
使⽤ tcpdump 截取数据报⽂的时候,默认会打印到屏幕的默认输出,你会看到按照顺序和格式,很多的数据⼀⾏⾏快速闪过,根本来不及看清楚所有的内容。不过,tcpdump 提供了把截取的数据保存到⽂件的功能,以便后⾯使⽤其他图形⼯具(⽐如 wireshark,Snort)来分析。
-w 选项⽤来把数据报⽂输出到⽂件:
$ tcpdump -i eth0 -s0 -w test.pcap复制代码
⾏缓冲模式
如果想实时将抓取到的数据通过管道传递给其他⼯具来处理,需要使⽤ -l 选项来开启⾏缓冲模式(或使⽤ -c 选项来开启数据包缓冲模式)。使⽤ -l 选项可以将输出通过⽴即发送给其他命令,其他命令会⽴即响应。
$ tcpdump -i eth0 -s0 -l port 80 | grep 'Server:'复制代码
组合过滤器
过滤的真正强⼤之处在于你可以随意组合它们,⽽连接它们的逻辑就是常⽤的 与/AND/&& 、 或/OR/|| 和 ⾮/not/!。
and or &&or or ||not or !复制代码
2. 过滤器
关于 tcpdump 的过滤器,这⾥有必要单独介绍⼀下。
机器上的⽹络报⽂数量异常的多,很多时候我们只关系和具体问题有关的数据报(⽐如访问某个⽹站的数据,或者 icmp 超时的报⽂等等),⽽这些数据只占到很⼩的⼀部分。把所有的数据截取下来,从⾥⾯到想要的信息⽆疑是⼀件很费时费⼒的⼯作。⽽ tcpdump 提供了灵活的语法可以精确地截取关⼼的数据报,简化分析的⼯作量。这些选择数据包的语句就是过滤器(filter)!
Host 过滤器
Host 过滤器⽤来过滤某个主机的数据报⽂。例如:
$ tcpdump host 1.2.3.4复制代码
该命令会抓取所有发往主机 1.2.3.4 或者从主机 1.2.3.4 发出的流量。如果想只抓取从该主机发出的流量,可以使⽤下⾯的命令:
$ tcpdump src host 1.2.3.4复制代码
Network 过滤器
Network 过滤器⽤来过滤某个⽹段的数据,使⽤的是 CIDR 模式。可以使⽤四元组()、三元组(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复制代码
抓取所有发往⽹段 或从⽹段 发出的流量:
$ tcpdump net 10复制代码
和 Host 过滤器⼀样,这⾥也可以指定源和⽬的:
$ tcpdump src net 10复制代码
也可以使⽤ CIDR 格式:
$ tcpdump src net 172.16.0.0/12复制代码
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复制代码
Port 过滤器
Port 过滤器⽤来过滤通过某个端⼝的数据报⽂,关键字为 port。例如:
$ tcpdump port 389复制代码
3. 理解 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
最基本也是最重要的信息就是数据报的源地址/端⼝和⽬的地址/端⼝,上⾯的例⼦第⼀条数据报中,源地址 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 报⽂的应答报⽂。
4. 例⼦
下⾯给出⼀些具体的例⼦,每个例⼦都可以使⽤多种⽅法来获得相同的输出,你使⽤的⽅法取决于所需的输出和⽹络上的流量。我们在排障时,通常只想获取⾃⼰想要的内容,可以通过过滤器和 ASCII 输出并结合管道与 grep、cut、awk 等⼯具来实现此⽬的。
perl是用来干嘛的
例如,在抓取 HTTP 请求和响应数据包时,可以通过删除标志 SYN/ACK/FIN 来过滤噪声,但还有更简单的⽅法,那就是通过管道传递给grep。在达到⽬的的同时,我们要选择最简单最⾼效的⽅法。下⾯来看例⼦。
提取 HTTP ⽤户代理
从 HTTP 请求头中提取 HTTP ⽤户代理:
$ tcpdump -nn -A -s1500 -l | grep "User-Agent:"复制代码
通过 egrep 可以同时提取⽤户代理和主机名(或其他头⽂件):
$ tcpdump -nn -A -s1500 -l | egrep -i 'User-Agent:|Host:'复制代码
只抓取 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 个字节。
提取 HTTP 请求的 URL
提取 HTTP 请求的主机名和路径:
$ tcpdump -s 0 -v -n -l | egrep -i "POST /|GET /|Host:"tcpdump: listening on enp7s0, link-type EN10MB (Ethernet), capture size 262144 bytes    POST /wp-提取 HTTP POST 请求中的密码
从 HTTP POST 请求中提取密码和主机名:
$ tcpdump -s 0 -A -n -l | egrep -i "POST /|pwd=|passwd=|password=|Host:"tcpdump: verbose output suppressed, use -v or -vv for full protocol decodelisten 提取 Cookies
提取 Set-Cookie(服务端的 Cookie)和 Cookie(客户端的 Cookie):
$ tcpdump -nn -A -s0 -l | egrep -i 'Set-Cookie|Host:|Cookie:'tcpdump: verbose output suppressed, use -v or -vv for full protocol decodelistening on wlp58s0抓取 ICMP 数据包
查看⽹络上的所有 ICMP 数据包:
$ tcpdump -n icmptcpdump: verbose output suppressed, use -v or -vv for full protocol decodelistening on enp7s0, link-type EN10MB (Ethernet), capture si
抓取⾮ ECHO/REPLY 类型的 ICMP 数据包
通过排除 echo 和 reply 类型的数据包使抓取到的数据包不包括标准的 ping 包:
$ tcpdump 'icmp[icmptype] != icmp-echo and icmp[icmptype] != icmp-echoreply'tcpdump: verbose output suppressed, use -v or -vv for full protocol decode 抓取 SMTP/POP3 协议的邮件
可以提取电⼦邮件的正⽂和其他数据。例如,只提取电⼦邮件的收件⼈:
$ tcpdump -nn -l port 25 | grep -i 'MAIL FROM|RCPT TO'复制代码
抓取 NTP 服务的查询和响应
$ tcpdump dst port 123tcpdump: verbose output suppressed, use -v or -vv for full protocol decodelistening on eth0, link-type EN10MB (Ethernet), capture 抓取 SNMP 服务的查询和响应
通过 SNMP 服务,渗透测试⼈员可以获取⼤量的设备和系统信息。在这些信息中,系统信息最为关键,如操作系统版本、内核版本等。使
⽤ SNMP 协议快速扫描程序 onesixtyone,可以看到⽬标系统的信息:
$ onesixtyone 10.10.1.10 publicScanning 1 hosts, 1 communities10.10.1.10 [public] Linux test33 4.15.0-20-generic #21-Ubuntu SMP Tue Apr 24 06:16:15可以通过 tcpdump 抓取 GetRequest 和 GetResponse:
$ tcpdump -n -s0  port 161 and udptcpdump: verbose output suppressed, use -v or -vv for full protocol decodelistening on wlp58s0, link-type EN10MB (Eth 切割 pcap ⽂件
当抓取⼤量数据并写⼊⽂件时,可以⾃动切割为多个⼤⼩相同的⽂件。例如,下⾯的命令表⽰每 3600 秒创建⼀个新⽂件 capture-(hour).pcap,每个⽂件⼤⼩不超过 200*1000000 字节:
$ tcpdump  -w /tmp/capture-%H.pcap -G 3600 -C 200复制代码
这些⽂件的命名为 capture-{1-24}.pcap,24 ⼩时之后,之前的⽂件就会被覆盖。
抓取 IPv6 流量
可以通过过滤器 ip6 来抓取 IPv6 流量,同时可以指定协议如 TCP:
$ tcpdump -nn ip6 proto 6复制代码
从之前保存的⽂件中读取 IPv6 UDP 数据报⽂:
$ tcpdump -nr ipv6-test.pcap ip6 proto 17复制代码
检测端⼝扫描
在下⾯的例⼦中,你会发现抓取到的报⽂的源和⽬的⼀直不变,且带有标志位 [S] 和 [R],它们与⼀系列看似随机的⽬标端⼝进⾏匹配。当发送 SYN 之后,如果⽬标主机的端⼝没有打开,就会返回⼀个 RESET。这是 Nmap 等端⼝扫描⼯具的标准做法。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。