目标:
- 能使用基本指令抓取数据包
- 能读懂抓取到的数据
基本指令
TCPdump指令规则概括如下:
tcpdump 选项 过滤项
选项
- -i 网卡:指定网卡
- -w xxx.pcap:将结果写入文件中
- -r xxx.pcap:从文件中读取数据,可以使用过滤语法获得输出
- -s 0:截取前n个字节,为0则全部显示
- -l:按行输出
- -n/nn:不把ip/(ip与端口)转化为域名
- -v/vv/vvv:产生详细/(更详细)的输出,比如TTL
- -t/tt:每行输出不会输出时间/时间与时间戳
- -X/XX:以16进制和ASCii形式输出每个包的数据(包括连接层)
- -A:ASCii显示所有数据包(当不显示链路层头部信息)
- -e:显示链路层头部信息
过滤项
限定数据包
1. proto
- tcp、upd、icmp等
- ip
- ipv4:ip proto 6
- ipv6:ip6 proto 6
- 举例
- tcpdump tcp:这会把ipv4和ipv6都包括
2. dir
后面必须跟主机地址host或端口port或net或portrange
- src 过滤条件设定的来源地址
- dsc 设定的是目标地址
- src or dst
- tcpdump src port 22
3.1 host
- 指定 host ip 进行过滤
- tcpdump host 192.168.10.100
3.2 net
- 指定网段
- tcpdump net 192.168.10.0/24
- tcpdump net 192.168
3.3 port
- 指定端口
- tcpdump port 8088
- tcpdump port 80 or port 8088
3.4 portrange
- 指定多个连续端口
- tcpdump portrange 8000-8080
4. 混合
- not > and > or
- 如果需要括号,由于括号是特殊字符,需要将过滤项使用引号包起来
proto和src相当于是后面type的修饰限定,只是proto可以单独使用,而src后面必须跟type
- tcpdump tcp port 23 or src port 22
- tcpdump eth0 'src net 192.168.0.0/24 and (tcp port 22 or udp port 53)'
5. 高级过滤
- 高级过滤技巧:
- 按 TCP 标志位过滤 :
-
proto [ expr:size ]:读取协议头部的第expr到expr+size字节
-
tcp的标志位在13字节,可以使用关键字tcpflags来替代,该字节每个比特代表不同标志,如下所示,所以可以按照tcp[tcpflags]的取值来决定报文类型
-
Bash
# 以下都是抓取syn + ack 包,既第二次握手
tcpdump -i eth0 'tcp[tcpflags] == tcp-syn or tcp[tcpflags] == tcp-ack'
tcpdump -i eth0 'tcp[13] == 2 or tcp[13] == 16'
tcpdump -i eth0 "tcp[tcpflags] & (tcp-syn|tcp-ack) != 0"
tcpdump -i eth0 'tcp[13] = 18'
- 按数据内容过滤:
Bash
tcpdump -A 'tcp port 80 | grep "GET /"' # 抓取 HTTP GET 请求
- 实用场景示例:
- 抓取 HTTP 请求头:
Bash
tcpdump -i eth0 -A -s0 'tcp port 80' | egrep "Host:|User-Agent:"
- 分析 DNS 查询:
Bash
tcpdump -n udp port 53 # 显示原始 IP 和端口
数据格式
pcap
21:26:49.013621 IP 172.20.20.1.15605 > 172.20.20.2.5920: Flags [P.], seq 49:97, ack 106048, win 4723, length 48
- 第一列:时分秒毫秒 21:26:49.013621
- 第二列:网络协议 IP
- 第三列:发送方的ip地址+端口号,其中172.20.20.1是 ip,而15605 是端口号
- 第四列:箭头 >, 表示数据流向
- 第五列:接收方的ip地址+端口号,其中 172.20.20.2 是 ip,而5920 是端口号
- 第六列:冒号
- 第七列:数据包内容,包括Flags 标识符,seq 号,ack 号,win 窗口,数据长度 length,其中 [P.] 表示 PUSH 标志位为 1且带了ack确认,更多标识符见下面,部分之间可组合,如
[S.]
:SYN + ACK(三次握手第二次报文)[S]
: SYN(开始连接)[P]
: PSH(推送数据)[F]
: FIN(结束连接)[R]
: RST(重置连接)[.]
: 只有ACK(纯确认报文)或还有URG紧急指针