tcpdump抓包
Tcpdump 学习
圣经~
声明:抄的这个大佬的文档,只为学习与记录:https://www.cnblogs.com/wongbingming/p/13212306.html
命令学习
首先按照图片,可以知道命令的组成形式
- 命令
- 选项:可选参数
- 协议类过滤:如 tcp、udp、icmp、ip、arp等
- 方向类过滤:如 src、dest等
- 类型过滤:如 host、net、port、portrange等
按照上面解释执行一条抓包命令
tcpdump -i ens192 tcp src port 6443
返回值学习
执行名称查看返回值
[root@kube01 ~]# tcpdump -i ens192 tcp src port 6443
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens192, link-type EN10MB (Ethernet), capture size 262144 bytes
14:34:11.259938 IP kube01.sun-sr-https > 192.168.17.6.6909: Flags [P.], seq 3563266392:3563266488, ack 253673777, win 1432, options [nop,nop,TS val 447540034 ecr 447538010], length 96
14:34:11.260073 IP kube01.sun-sr-https > 192.168.17.6.6909: Flags [P.], seq 96:898, ack 1, win 1432, options [nop,nop,TS val 447540035 ecr 447538010], length 802
以返回值分析一下各个含义
14:34:11.260073 IP kube01.sun-sr-https > 192.168.17.6.6909: Flags [P.], seq 96:898, ack 1, win 1432, options [nop,nop,TS val 447540035 ecr 447538010], length 802
可以总结出:
14:34:11.260073
:时分秒毫秒IP
:网络协议kube01.sun-sr-https
:发送方的ip地址+端口号>
:表示数据流向192.168.17.6.6909
:接收方的ip地址+端口号:
:冒号Flags [P.], seq 96:898, ack 1, win 1432, options [nop,nop,TS val 447540035 ecr 447538010], length 802
: 数据包内容,包括Flags 标识符,seq 号,ack 号,win 窗口,数据长度 length,其中 [P.] 表示 PUSH 标志位为 1,更多标识符见下面
使用 tcpdump 抓包后,会遇到的 TCP 报文 Flags,有以下几种:
- [S] : SYN(开始连接)
- [P] : PSH(推送数据)
- [F] : FIN (结束连接)
- [R] : RST(重置连接)
- [.] : 没有 Flag (意思是除上面四种类型外的其他情况,有可能是 ACK 也有可能是 URG)
常用规则
## 监听指定端口是否有主机流量通过
tcpdump -i ens192 host 192.168.17.6
## 监听指定端口发送方是否有主机流量通过
tcpdump -i ens192 src 192.168.17.6
## 监听指定端口接收方是否有主机流量通过
tcpdump -i ens192 dst 192.168.17.6
## 监听指定端口是否有网段流量通过
tcpdump -i ens192 net 192.168.17.0/24
## 监听指定端口发送方是否有网段流量通过
tcpdump -i ens192 src net 192.168.17
## 监听指定端口接收方是否有网段流量通过
tcpdump -i ens192 dst port 6443
## 监听指定端口是否有端口流量通过
tcpdump -i ens192 port 6443
## 监听指定端口发送方是否有端口流量通过
tcpdump -i ens192 src port 6443
## 监听指定端口接收方是否有端口流量通过
tcpdump -i ens192 dst port 6443
## 监听指定端口是否有端口流量通过,可以设置多个 src
tcpdump -i ens192 port 6443 or 80
## 监听TCP协议指定端口,注意IP不可以是TCP协议,只有端口
tcpdump -i ens192 tcp src port 6443
## 如果想加IP过滤需要有 and
tcpdump -i ens192 tcp and src port 6443
## 监听ICMP协议指定端口,注意过滤需要用 and 执行
tcpdump -i ens192 icmp and src host 192.168.17.6
可选参数
一般执行都有可选参数,这里介绍一下常用参数
tcpdump -eni ens192 tcp src port 6443
-n
:不把ip转化成域名,直接显示 ip,避免执行 DNS lookups 的过程,速度会快很多
-nn
:不把协议和端口号转化成名字,速度也会快很多。
-N
:不打印出host 的域名部分.。比如,,如果设置了此选现,tcpdump 将会打印'nic' 而不是 'nic.ddn.mil'.
-e
:每行的打印输出中将包括数据包的数据链路层头部信息
-i
:指定要过滤的网卡接口,如果要查看所有网卡,可以-i any
-A
:以ASCII码方式显示每一个数据包(不显示链路层头部信息). 在抓取包含网页数据的数据包时, 可方便查看数据
-s
:tcpdump 默认只会截取前 96 字节的内容,要想截取所有的报文内容,可以使用 -s number, number 就是你要截取的报文字节数,如果是 0 的话,表示截取报文全部内容。
-X
:以16进制和 ASCII码形式打印出每个包的数据(但不包括连接层的头部),这在分析一些新协议的数据包很方便。
-l
:基于行的输出,便于你保存查看,或者交给其它工具分析
过滤结果输出到文件
使用 tcpdump 工具抓到包后,往往需要再借助其他的工具进行分析,比如常见的 wireshark 。
而要使用wireshark ,我们得将 tcpdump 抓到的包数据生成到文件中,最后再使用 wireshark 打开它即可。
使用 -w 参数后接一个以 .pcap 后缀命令的文件名,就可以将 tcpdump 抓到的数据保存到文件中。
tcpdump icmp -w icmp.pcap
从文件中读取包数据
使用 -w 是写入数据到文件,而使用 -r 是从文件中读取数据。
读取后,我们照样可以使用上述的过滤器语法进行过滤分析。
tcpdump icmp -r all.pcap
过滤规则组合
- and:所有的条件都需要满足,也可以表示为 &&
- or:只要有一个条件满足就可以,也可以表示为 ||
- not:取反,也可以使用 !
## and
tcpdump -i ens192 tcp and src port 6443
## or
tcpdump -i ens192 tcp or src port 6443
测试案例
## 监听 8000 端口并且以明文的形式在 tcp.cap 文件里显示
tcpdump -i ens192 -s 0 -X -A -w tcp.cap tcp src port 8000
## 从 HTTP 请求头中提取 HTTP 的 User-Agent:
tcpdump -i ens192 -nn -A -s1500 -l | grep "User-Agent:"
## 通过 egrep 可以同时提取User-Agent 和主机名(或其他头文件):
tcpdump -i ens192 -nn -A -s1500 -l | egrep -i 'User-Agent:|Host:'
## 抓取 HTTP GET 请求包:
tcpdump -i ens192 -s 0 -A -vv 'tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420'
或
tcpdump -i ens192 -vvAls0 | grep 'GET'
## 可以抓取 HTTP POST 请求包:
tcpdump -i ens192 -s 0 -A -vv 'tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x504f5354'
或
tcpdump -i ens192 -vvAls0 | grep 'POST'
## 找出一段时间内发包最多的 IP,或者从一堆报文中找出发包最多的 IP,可以使用下面的命令:
## cut -f 1,2,3,4 -d '.' : 以 . 为分隔符,打印出每行的前四列。即 IP 地址。
## sort | uniq -c : 排序并计数
## sort -nr : 按照数值大小逆向排序
tcpdump -i ens192 -nnn -t -c 200 | cut -f 1,2,3,4 -d '.' | sort | uniq -c | sort -nr | head -n 20
## DNS 的默认端口是 53,因此可以通过端口进行过滤
tcpdump -i any -s0 port 53
## 切割 pcap 文件
## 当抓取大量数据并写入文件时,可以自动切割为多个大小相同的文件。例如,下面的命令表示每 3600 秒创建一个新文件 capture-(hour).pcap,每个文件大小不超过 200*1000000 字节:
tcpdump -w /tmp/capture-%H.pcap -G 3600 -C 200
## 从 HTTP POST 请求中提取密码和主机名:
tcpdump -i ens192 -s 0 -A -n -l | egrep -i "POST /|pwd=|passwd=|password=|Host:"
## 提取 HTTP 请求的主机名和路径:
tcpdump -i ens192 -s 0 -v -n -l | egrep -i "POST /|GET /|Host:"
## 抓取 80 端口的 HTTP 有效数据包,排除 TCP 连接建立过程的数据包(SYN / FIN / ACK):
tcpdump 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'