抓包工具的使用
HTTP抓包工具有老牌的Fiddler和Charles,但这些工具仅限于HTTP抓包,想要抓取传输层的tcp包则需要用到更加强大的wireshark和tcpdump。
wireshark和tcpdump都可以捕获通过网卡的所有网络通信的数据包,可以完整查看网络中的每层、每个协议、每个数据包的详细组成信息。但是缺点是信息太多,需要过滤和处理。
WireShark基本过滤规则
IP 地址过滤
显示特定 IP 地址的流量:
1
ip.addr == 192.168.1.100
这会显示源或目标 IP 地址为
192.168.1.100
的所有数据包。显示某个 IP 地址之间的通信:
1
ip.addr == 192.168.1.100 && ip.addr == 8.8.8.8
这会显示源地址为
192.168.1.100
且目标地址为8.8.8.8
之间的所有数据包。
协议过滤
显示特定协议的数据包:
1
tcp
这会显示所有 TCP 数据包。
显示特定端口的流量:
1
tcp.port == 80
这会显示目标或源端口为
80
的所有 TCP 数据包。显示所有 ARP 数据包:
1
arp
应用层协议过滤
显示 HTTP 请求和响应:
1
http
这会显示所有 HTTP 请求和响应数据包。
显示 DNS 查询和响应:
1
dns
这会显示所有 DNS 查询和响应数据包。
数据包方向过滤
显示进入或离开特定 IP 地址的流量:
1
ip.src == 192.168.1.100
这会显示源地址为
192.168.1.100
的所有数据包。显示进入或离开特定网络接口的流量:
1
eth.addr == 00:11:22:33:44:55
这会显示以太网地址为
00:11:22:33:44:55
的所有数据包。
逻辑运算符
**与运算符 (
&&
)**:1
ip.addr == 192.168.1.100 && tcp.port == 80
显示源或目标 IP 地址为
192.168.1.100
且目标或源端口为80
的所有 TCP 数据包。**或运算符 (
||
)**:1
ip.addr == 192.168.1.100 || ip.addr == 8.8.8.8
显示源地址为
192.168.1.100
或目标地址为8.8.8.8
的所有数据包。**非运算符 (
!
)**:1
!tcp.port == 80
显示所有不是目标或源端口为
80
的 TCP 数据包。
其它过滤条件
过滤特定数据包大小:
1
frame.len > 1000
显示大小大于
1000
字节的所有数据包。根据协议层次过滤:
1
tcp.flags.syn == 1 && tcp.flags.ack == 0
显示 SYN 标志为
1
而 ACK 标志为0
的所有 TCP 数据包(TCP 握手过程中的第一个数据包)。根据时间戳过滤:
1
frame.time > "2024-06-01 12:00:00"
显示时间戳晚于
2024-06-01 12:00:00
的所有数据包。
tcpdump用法
1 | tcpdump [options] [filter_expression] |
- **
[options]
**:可选的命令行选项,用于配置tcpdump
的捕获行为,如捕获的接口、是否显示数据包内容等。 - **
[filter_expression]
**:过滤表达式,用于指定要捕获的数据包的类型或条件。
tcpdump基本过滤规则
IP 地址过滤
显示特定 IP 地址的流量:
1
host 192.168.1.100
这会显示源或目标 IP 地址为
192.168.1.100
的所有数据包。显示特定 IP 地址之间的通信:
1
host 192.168.1.100 and host 8.8.8.8
这会显示源地址为
192.168.1.100
且目标地址为8.8.8.8
之间的所有数据包。
协议过滤
显示特定协议的数据包:
1
tcp
这会显示所有 TCP 数据包。
显示特定端口的流量:
1
port 80
这会显示目标或源端口为
80
的所有数据包。显示所有 ARP 数据包:
1
arp
应用层协议过滤
显示 HTTP 请求和响应:
1
port 80
这会显示所有 HTTP 请求和响应数据包。
显示 DNS 查询和响应:
1
port 53
这会显示所有 DNS 查询和响应数据包。
数据包方向过滤
显示进入或离开特定 IP 地址的流量:
1
src host 192.168.1.100
这会显示源地址为
192.168.1.100
的所有数据包。显示进入或离开特定网络接口的流量:
1
ether host 00:11:22:33:44:55
这会显示以太网地址为
00:11:22:33:44:55
的所有数据包。
逻辑运算符
**与运算符 (
and
)**:1
src host 192.168.1.100 and port 80
显示源地址为
192.168.1.100
且目标或源端口为80
的所有数据包。**或运算符 (
or
)**:1
src host 192.168.1.100 or dst host 8.8.8.8
显示源地址为
192.168.1.100
或目标地址为8.8.8.8
的所有数据包。**非运算符 (
not
)**:1
not port 22
显示所有不是目标或源端口为
22
的数据包。
其它过滤条件
过滤特定数据包大小:
1
greater 1000
显示大小大于
1000
字节的所有数据包。根据协议层次过滤:
1
tcp[13] & 2 != 0
显示所有 SYN 标志为
1
而 ACK 标志为0
的 TCP 数据包(即 TCP 握手过程中的第一个数据包)。根据时间戳过滤:
1
after "2024-06-01 12:00:00"
显示时间戳晚于
2024-06-01 12:00:00
的所有数据包。
tcpdump
还支持各种选项来更精确地控制捕获行为,例如指定捕获的网络接口、输出到文件等。以下是一些常用的选项:
指定捕获接口:
1
tcpdump -i eth0
将捕获结果输出到文件:
1
tcpdump -w capture.pcap
从文件中读取捕获结果: