tcpdump 网络抓包

words: 914    views:    time: 4min
tcp


整理下tcpdump的常见抓包用法

tcpdump使用

tcpdump可以将网络数据包截获下来提供分析,支持针对网络层、协议、主机、网络或端口的过滤,并提供 and、or、not 等逻辑语句来进行过滤

常用选项:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
-i <iface>	指定网口,例如 -i eth0
-c <count> 捕获指定数量的数据包后退出
-w <file> 将抓到的数据包写入文件,例如.pcap,方便Wireshark分析
-n 不解析主机名,直接显示IP地址
-nn 不解析主机名和端口号,显示数字形式

-A 以ASCII形式显示内容(可读,适合HTTP请求)
-v / -vv / -vvv 增加输出的详细程度
-s <snaplen> 指定抓包长度,默认 262144 字节
-X 显示数据包的 十六进制 + ASCII
-XX 显示以太网头 + 十六进制 + ASCII
-r <file> 从抓包文件读取数据
-tt / -ttt / -T 显示时间戳格式,可精确到微秒

type host(主机名,域名,IP 地址), net, port, portrange
protocol ether, ip,arp, tcp, udp, wlan
direction src, dst, src or dst , src and ds

常用示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
## 与1.1.1.1相关的数据包(host换成src或dst,则只抓取来自或发往的单向流量)
tcpdump host 1.1.1.1 -w ./$(date +%Y%m%d%H%M%S).pcap

## 与某个网络或子网相关的数据包
tcpdump net 1.2.3.0/24

## 可以使用less,greater 来筛选特定大小的数据包
tcpdump less 32 或 tcpdump greater 64

## 10.5.2.3发往端口3389的数据包
tcpdump -vvAls0 src 10.5.2.3 and dst port 3389

## 192.168.0.0/24网段发往192.168.0.2的非icmp和非ssh的数据包
tcpdump dst 192.168.0.2 and src net 192.168.0.0/24 and not icmp and not dst port 22

## DHCP抓包(DHCP 请求在端口67,回复在端口68)
tcpdump -v -n port 67 or 68

## TCP标记位过滤
tcp[13] & 4 !=0 SYN 包
tcp[13] & 4 !=0 and tcp[13] & 16 !=0 SYN-ACK 包
tcp[13] & 4 !=0 and tcp[13] & 16 ==0 仅SYN(不含ACK)
tcp[13] & 16 !=0 ACK 包
tcp[13] & 1 !=0 FIN 包
tcp[13] & 2 !=0 RST 包
tcp[13] & 2 ==0 非RST 包

## 抓取1000个发往80端口的IP包,统计每个源IP的出现次数,显示前20个最活跃的IP
tcpdump -i eth0 -tnn dst port 80 -c 1000 | awk -F"." '{print $1"."$2"."$3"."$4}' | sort | uniq -c | sort -nr | head -20

## 抓取Http数据包,并排除Tcp会话
tcpdump 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'

## 纯文本协议明文密码(通过grep -B5,只获取前5行,用关键字匹配)
tcpdump port http or port ftp or port smtp or port imap or port pop3 or port telnet -l -A | egrep -i -B5 'pass=|pwd=|log=|login=|user=|username=|pw=|passw=|passwd=|password=|pass:|user:|username:|password:|login:|pass |user '

tcpdump理解

  • tcpdump是如何工作的

在网络包的发送和接收过程中,绝大部分的工作都是在内核态完成的,那么运行在用户态的程序tcpdump是如何实现抓到内核态的包的?

tcpdump是通过socket系统调用,在内核源码中用到的ptype_all中挂载了函数钩子。无论是在网络包的接收还是发送,都会在网络设备层遍历ptype_all中的协议,并执行其中的回调,tcpdump命令就是基于这个底层原理来工作的。


  • netfilter过滤的包tcpdump是否可以抓到

在接收的过程中,由于tcpdump在前,所以完全可以捕获到命中netfilter过滤规则的包

在发送的过程中,由于网络包先经过协议层,这时如果被netfilter过滤掉,tcpdump就抓不到了


参考: