武器装备
tcpdump(超详细的网络抓包神器 tcpdump 使用指南)

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。

-A 表示使用 ASCII 字符串打印报文的全部数据,这样可以使读取更加简单,方便使用 grep 等工具解析输出内容。-X 表示同时使用十六进制和 ASCII 字符串打印报文的全部数据。这两个参数不能一起使用。例如:

$ tcpdump -A -s0 port 80复制代码

抓取特定协议的数据

同理,tcp 与 protocol 6 意思相同。

抓取特定主机的数据

也可以使用 src 或 dst 只抓取源或目的地:

$ tcpdump -i eth0 dst 10.10.1.20复制代码

将抓取的数据写入文件

-w 选项用来把数据报文输出到文件:

$ tcpdump -i eth0 -s0 -w test.pcap复制代码

行缓冲模式

过滤的真正强大之处在于你可以随意组合它们,而连接它们的逻辑就是常用的 与/AND/&& 、 或/OR/|| 和 非/not/!。

and or &&or or ||not or !复制代码

2. 过滤器

机器上的网络报文数量异常的多,很多时候我们只关系和具体问题有关的数据报(比如访问某个网站的数据,或者 icmp 超时的报文等等),而这些数据只占到很小的一部分。把所有的数据截取下来,从里面找到想要的信息无疑是一件很费时费力的工作。而 tcpdump 提供了灵活的语法可以精确地截取关心的数据报,简化分析的工作量。这些选择数据包的语句就是过滤器(filter)!

Host 过滤器

该命令会抓取所有发往主机 1.2.3.4 或者从主机 1.2.3.4 发出的流量。如果想只抓取从该主机发出的流量,可以使用下面的命令:

$ tcpdump src host 1.2.3.4复制代码

Network 过滤器

抓取所有发往网段 192.168.1.x 或从网段 192.168.1.x 发出的流量:

$ tcpdump net 192.168.1复制代码

和 Host 过滤器一样,这里也可以指定源和目的:

$ tcpdump src net 10复制代码

Proto 过滤器用来过滤某个协议的数据,关键字为 proto,可省略。proto 后面可以跟上协议号或协议名称,支持 icmp, igmp, igrp, pim, ah, esp, carp, vrrp, udp和 tcp。因为通常的协议名称是保留字段,所以在于 proto 指令一起使用时,必须根据 shell 类型使用一个或两个反斜杠(/)来转义。Linux 中的 shell 需要使用两个反斜杠来转义,MacOS 只需要一个。

Port 过滤器用来过滤通过某个端口的数据报文,关键字为 port。例如:

$ tcpdump port 389复制代码

3. 理解 tcpdump 的输出

最基本也是最重要的信息就是数据报的源地址/端口和目的地址/端口,上面的例子第一条数据报中,源地址 ip 是 192.168.1.106,源端口是 56166,目的地址是 124.192.132.54,目的端口是 80。 > 符号代表数据的方向。

而第二条数据的 [S.] 表示 SYN-ACK,就是 SYN 报文的应答报文。

4. 例子

例如,在抓取 HTTP 请求和响应数据包时,可以通过删除标志 SYN/ACK/FIN 来过滤噪声,但还有更简单的方法,那就是通过管道传递给 grep。在达到目的的同时,我们要选择最简单最高效的方法。下面来看例子。

提取 HTTP 用户代理

通过 egrep 可以同时提取用户代理和主机名(或其他头文件):

$ tcpdump -nn -A -s1500 -l | egrep -i 'User-Agent:|Host:'复制代码

只抓取 HTTP GET 和 POST 流量

也可以抓取 HTTP POST 请求流量:

$ tcpdump -s 0 -A -vv 'tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x504f5354'复制代码

上述两个表达式中的十六进制将会与 GET 和 POST 请求的 ASCII 字符串匹配。例如,tcp[((tcp[12:1] & 0xf0) >> 2):4] 首先会确定我们感兴趣的字节的位置(在 TCP header 之后),然后选择我们希望匹配的 4 个字节。

提取 HTTP 请求的 URL

从 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 decodelistening on enp7s0, link-type EN10MB (Ethernet), capture size 262144 bytes11:25:54.799014 IP 10.10.1.30.39224 > 10.10.1.125.80: Flags [P.], seq 1458768667:1458770008, ack 2440130792, win 704, options [nop,nop,TS val 461552632 ecr 208900561], length 1341: HTTP: POST /wp-login.php HTTP/1.1.....s..POST /wp-login.php HTTP/1.1Host: dev.example.com.....s..log=admin&pwd=notmypassword&wp-submit=Log+In&redirect_to=http%3A%2F%2Fdev.example.com%2Fwp-admin%2F&testcookie=1复制代码

提取 cookies

查看网络上的所有 ICMP 数据包:

$ tcpdump -n icmptcpdump: verbose output suppressed, use -v or -vv for full protocol decodelistening on enp7s0, link-type EN10MB (Ethernet), capture size 262144 bytes11:34:21.590380 IP 10.10.1.217 > 10.10.1.30: ICMP echo request, id 27948, seq 1, length 6411:34:21.590434 IP 10.10.1.30 > 10.10.1.217: ICMP echo reply, id 27948, seq 1, length 6411:34:27.680307 IP 10.10.1.159 > 10.10.1.1: ICMP 10.10.1.189 udp port 59619 unreachable, length 115复制代码

抓取非 ECHO/REPLY 类型的 ICMP 数据包

可以提取电子邮件的正文和其他数据。例如,只提取电子邮件的收件人:

$ 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 size 65535 bytes21:02:19.112502 IP test33.ntp > 199.30.140.74.ntp: NTPv4, Client, length 4821:02:19.113888 IP 216.239.35.0.ntp > test33.ntp: NTPv4, Server, length 4821:02:20.150347 IP test33.ntp > 216.239.35.0.ntp: NTPv4, Client, length 4821:02:20.150991 IP 216.239.35.0.ntp > test33.ntp: NTPv4, Server, length 48复制代码

抓取 SNMP 服务的查询和响应

可以通过 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 (Ethernet), capture size 262144 bytes23:39:13.725522 IP 10.10.1.159.36826 > 10.10.1.20.161:  GetRequest(28)  .1.3.6.1.2.1.1.1.023:39:13.728789 IP 10.10.1.20.161 > 10.10.1.159.36826:  GetResponse(109)  .1.3.6.1.2.1.1.1.0="Linux testmachine 4.15.0-20-generic #21-Ubuntu SMP Tue Apr 24 06:16:15 UTC 2018 x86_64"复制代码

切割 pcap 文件

这些文件的命名为 capture-{1-24}.pcap,24 小时之后,之前的文件就会被覆盖。

抓取 IPv6 流量

从之前保存的文件中读取 IPv6 UDP 数据报文:

$ tcpdump -nr ipv6-test.pcap ip6 proto 17复制代码

检测端口扫描

本例中 Nmap NSE 测试脚本 http-enum.nse 用来检测 HTTP 服务的合法 URL。

在目标主机上:

$ tcpdump -nn port 80 | grep "GET /"GET /w3perl/ HTTP/1.1GET /w-agora/ HTTP/1.1GET /way-board/ HTTP/1.1GET /web800fo/ HTTP/1.1GET /webaccess/ HTTP/1.1GET /webadmin/ HTTP/1.1GET /webAdmin/ HTTP/1.1复制代码

抓取 DNS 请求和响应

抓取 80 端口的 HTTP 有效数据包,排除 TCP 连接建立过程的数据包(SYN / FIN / ACK):

$ tcpdump 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'复制代码

将输出内容重定向到 Wireshark

还有一种更高效的方法,可以通过 ssh 连接将抓取到的数据实时发送给 Wireshark 进行分析。以 MacOS 系统为例,可以通过 brew cask install wireshark 来安装,然后通过下面的命令来分析:

$ ssh root@remotesystem 'tcpdump -s0 -c 1000 -nn -w - not port 22' | /Applications/Wireshark.app/Contents/MacOS/Wireshark -k -i -复制代码

抓取到的数据:

找出一段时间内发包最多的 IP,或者从一堆报文中找出发包最多的 IP,可以使用下面的命令:

$ tcpdump -nnn -t -c 200 | cut -f 1,2,3,4 -d '.' | sort | uniq -c | sort -nr | head -n 20tcpdump: verbose output suppressed, use -v or -vv for full protocol decodelistening on enp7s0, link-type EN10MB (Ethernet), capture size 262144 bytes200 packets captured261 packets received by filter0 packets dropped by kernel    108 IP 10.10.211.181     91 IP 10.10.1.30      1 IP 10.10.1.50复制代码
  • cut -f 1,2,3,4 -d '.' : 以 . 为分隔符,打印出每行的前四列。即 IP 地址。
  • sort | uniq -c : 排序并计数
  • sort -nr : 按照数值大小逆向排序

抓取用户名和密码

最后一个例子,抓取 DHCP 服务的请求和响应报文,67 为 DHCP 端口,68 为客户机端口。

$ tcpdump -v -n port 67 or 68tcpdump: listening on enp7s0, link-type EN10MB (Ethernet), capture size 262144 bytes14:37:50.059662 IP (tos 0x10, ttl 128, id 0, offset 0, flags [none], proto UDP (17), length 328)    0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:0c:xx:xx:xx:d5, length 300, xid 0xc9779c2a, Flags [none]      Client-Ethernet-Address 00:0c:xx:xx:xx:d5      Vendor-rfc1048 Extensions        Magic cookie 0x63825363        DHCP-Message Option 53, length 1: Request        Requested-IP Option 50, length 4: 10.10.1.163        Hostname Option 12, length 14: "test-ubuntu"        Parameter-Request Option 55, length 16:           Subnet-Mask, BR, Time-Zone, Default-Gateway          Domain-Name, Domain-Name-Server, Option 119, Hostname          Netbios-Name-Server, Netbios-Scope, MTU, Classless-Static-Route          NTP, Classless-Static-Route-Microsoft, Static-Route, Option 25214:37:50.059667 IP (tos 0x10, ttl 128, id 0, offset 0, flags [none], proto UDP (17), length 328)    0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:0c:xx:xx:xx:d5, length 300, xid 0xc9779c2a, Flags [none]      Client-Ethernet-Address 00:0c:xx:xx:xx:d5      Vendor-rfc1048 Extensions        Magic cookie 0x63825363        DHCP-Message Option 53, length 1: Request        Requested-IP Option 50, length 4: 10.10.1.163        Hostname Option 12, length 14: "test-ubuntu"        Parameter-Request Option 55, length 16:           Subnet-Mask, BR, Time-Zone, Default-Gateway          Domain-Name, Domain-Name-Server, Option 119, Hostname          Netbios-Name-Server, Netbios-Scope, MTU, Classless-Static-Route          NTP, Classless-Static-Route-Microsoft, Static-Route, Option 25214:37:50.060780 IP (tos 0x0, ttl 64, id 53564, offset 0, flags [none], proto UDP (17), length 339)    10.10.1.1.67 > 10.10.1.163.68: BOOTP/DHCP, Reply, length 311, xid 0xc9779c2a, Flags [none]      Your-IP 10.10.1.163      Server-IP 10.10.1.1      Client-Ethernet-Address 00:0c:xx:xx:xx:d5      Vendor-rfc1048 Extensions        Magic cookie 0x63825363        DHCP-Message Option 53, length 1: ACK        Server-ID Option 54, length 4: 10.10.1.1        Lease-Time Option 51, length 4: 86400        RN Option 58, length 4: 43200        RB Option 59, length 4: 75600        Subnet-Mask Option 1, length 4: 255.255.255.0        BR Option 28, length 4: 10.10.1.255        Domain-Name-Server Option 6, length 4: 10.10.1.1        Hostname Option 12, length 14: "test-ubuntu"        T252 Option 252, length 1: 10        Default-Gateway Option 3, length 4: 10.10.1.1复制代码

5. 总结


作者:米开朗基杨
链接:https://juejin.im/post/5e64571bf265da57104393a1
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


顶一下()     踩一下()

热门推荐

发表评论
0评