wireshark使用指南
捕获过滤器语法精要
基础结构:[协议] [方向] [类型] [值]
// 抓取目标端口80的HTTP流量tcp dst port 80
// 排除ARP广播包not arp
// 捕获ICMP和DNS查询icmp || (udp port 53)
高级技巧:
长度过滤:less 128
(用于捕获小于128字节的包)
位掩码操作:tcp[13] & 0x07 = 0x02
(匹配SYN标志)
显示过滤器实战手册
协议级过滤:
http 所有HTTP流量
dns.qry.name contains “google” 包含google的DNS查询
IP定位:
ip.src == 192.168.1.100 && tcp.port == 443
ip.addr in {10.0.0.1 10.0.0.2} // 多IP筛选
流量特征:
tcp.analysis.retransmission TCP重传包
http.response.code == 404 404错误页面
高级表达式:
(frame.time >= “2023-08-01”) && (http.request.method == “POST”)
udp.stream eq 5 特定UDP会话流
过滤器优化技巧
- 字段自动补全:输入
http.
按Tab键显示可用字段 - 语法检查:表达式栏背景色(绿色有效/红色错误)
- 保存常用过滤:通过
Analyze > Display Filters
管理 - 复合表达式生成:右键数据包 > Prepare as Filter
抓包过滤器
抓包过滤器类型
Type(host、net、port)、
方向Dir(src、dst)、
协议Proto(ether、ip、tcp、udp、http、icmp、ftp等)、
逻辑运算符(&&与、|| 或、!非)
- 协议过滤
比较简单,直接在抓包过滤框中直接输入协议名即可。
tcp,只显示TCP协议的数据包列表
http,只查看HTTP协议的数据包列表
icmp,只显示ICMP协议的数据包列表
- IP过滤
host 192.168.1.104
src host 192.168.1.104
dst host 192.168.1.104
- 端口过滤
port 80
src port 80
dst port 80
- 逻辑运算符&&与、|| 或、!非
src host 192.168.1.104 && dst port 80 抓取主机地址为192.168.1.80、目的端口为80的数据包
host 192.168.1.104 || host 192.168.1.102 抓取主机为192.168.1.104或者192.168.1.102的数据包
!broadcast 不抓取广播数据包
显示过滤器是用于在抓取数据包后设置过滤条件进行过滤数据包
(1)比较操作符
比较操作符有
== 等于、!= 不等于、> 大于、< 小于、>= 大于等于、<=小于等于
(2)协议过滤
比较简单,直接在Filter框中直接输入协议名即可。注意:协议名称需要输入小写。
tcp,只显示TCP协议的数据包列表
http,只查看HTTP协议的数据包列表
icmp,只显示ICMP协议的数据包列表
(3) ip过滤
ip.src ==112.53.42.42 显示源地址为112.53.42.42的数据包列表
ip.dst==112.53.42.42, 显示目标地址为112.53.42.42的数据包列表
ip.addr == 112.53.42.42 显示源IP地址或目标IP地址为112.53.42.42的数据包列表
(4)端口过滤
tcp.port ==80, 显示源主机或者目的主机端口为80的数据包列表。
tcp.srcport == 80, 只显示TCP协议的源主机端口为80的数据包列表。
tcp.dstport == 80,只显示TCP协议的目的主机端口为80的数据包列表。
5) http模式过滤
http.request.method==”GET”, 只显示HTTP GET方法的。
(6)逻辑运算符为 and/or/not
过滤多个条件组合时,使用and/or。比如获取IP地址为192.168.0.104的ICMP数据包表达式为ip.addr == 192.168.0.104 and icmp
(7)按照数据包内容过滤
假设我要以ICMP层中的内容进行过滤,可以单击选中界面中的码流,在下方进行选中数据。
右键单击选中后出现如下界面
选中后在过滤器中显示如下
后面条件表达式就需要自己填写。如下我想过滤出data数据包中包含”abcd”内容的数据流。关键词是contains,完整条件表达式为data contains “abcd”
常见用显示过滤需求及其对应表达式
数据链路层:
筛选mac地址为04:f9:38:ad:13:26的数据包
eth.src == 04:f9:38:ad:13:26
筛选源mac地址为04:f9:38:ad:13:26的数据包—-
eth.src == 04:f9:38:ad:13:26
网络层:
筛选ip地址为192.168.1.1的数据包
ip.addr == 192.168.1.1
筛选192.168.1.0网段的数据
ip contains “192.168.1”
传输层:
筛选端口为80的数据包
tcp.port == 80
筛选12345端口和80端口之间的数据包
tcp.port == 12345 &&tcp.port == 80
筛选从12345端口到80端口的数据包
tcp.srcport == 12345 &&tcp.dstport == 80
应用层:
特别说明: http中http.request表示请求头中的第一行(如GET index.jsp HTTP/1.1) http.response表示响应头中的第一行(如HTTP/1.1 200 OK),其他头部都用http.header_name形式。
筛选url中包含.php的http数据包
http.request.uri contains “.php”
筛选内容包含username的http数据包
http contains “username”
Wireshark抓包获取访问指定服务端数据包
Step1:启动wireshark抓包,打开浏览器输入www.baidu.com。
Step2:使用ping www.baidu.com获取IP。
Step3:输入过滤条件获取待分析数据包列表 ip.addr == 183.232.231.172
wireshark截获到了三次握手的三个数据包。第四个包才是HTTPS的, 说明HTTPS的确是使用TCP建立连接的。
第一次握手数据包
客户端发送一个TCP,标志位为SYN,序列号为0, 代表客户端请求建立连接。
数据包的关键属性如下:
SYN :标志位,表示请求建立连接
Seq = 0 :初始建立连接值为0,数据包的相对序列号从0开始,表示当前还没有发送数据
Ack =0:初始建立连接值为0,已经收到包的数量,表示当前没有接收到数据
第二次握手的数据包
服务器发回确认包, 标志位为 SYN,ACK。将确认序号(Acknowledgement Number)字段+1,即0+1=1。
数据包的关键属性如下:
Seq = 0 :初始建立值为0,表示当前还没有发送数据
Ack = 1:表示当前端成功接收的数据位数,虽然客户端没有发送任何有效数据,确认号还是被加1,因为包含SYN或FIN标志位。(并不会对有效数据的计数产生影响,因为含有SYN或FIN标志位的包并不携带有效数据)
第三次握手的数据包
客户端再次发送确认包(ACK) SYN标志位为0,ACK标志位为1。并且把服务器发来ACK的序号字段+1,放在确定字段中发送给对方,并且在Flag段写ACK的+1:
数据包的关键属性如下:
ACK :标志位,表示已经收到记录
Seq = 1 :表示当前已经发送1个数据
Ack = 1 : 表示当前端成功接收的数据位数,虽然服务端没有发送任何有效数据,确认号还是被加1,因为包含SYN或FIN标志位(并不会对有效数据的计数产生影响,因为含有SYN或FIN标志位的包并不携带有效数据)。
就这样通过了TCP三次握手,建立了连接。开始进行数据交互