貔貅云原生

貔貅云原生

tcpdump抓包

332
0
0
2023-12-04
tcpdump抓包

Tcpdump 学习

圣经~
声明:抄的这个大佬的文档,只为学习与记录:https://www.cnblogs.com/wongbingming/p/13212306.html

命令学习

首先按照图片,可以知道命令的组成形式

  • 命令
  • 选项:可选参数
  • 协议类过滤:如 tcp、udp、icmp、ip、arp等
  • 方向类过滤:如 src、dest等
  • 类型过滤:如 host、net、port、portrange等

image-idpg.png

按照上面解释执行一条抓包命令

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)'