1. 概述
本文全面介绍了wireshark过滤器语法,wireshark包括捕获过滤器和显示过滤器,其中显示过滤器的语法十分丰富,其实显示过滤器的语法可以简单概括为:基本数据类型,协议对象,比较运算符,结合运算符,字符串函数与正则表达式,这就是其所有语法。其中高级的用法也许是切片、集合、正则表达式。
本文重点在于全面的描述其基本语法,通过例子来学习,那些复杂的用法其实都来自这些基本的语法元素,如有不完善之处,欢迎提出建议。
文章目录
2. 过滤器分类
wireshark包括捕获过滤器和显示过滤器
- 捕获过滤器:决定将什么样的信息记录在捕捉结果中。需要在开始捕捉前设置。是第一层过滤器,防止日志过大。
- 显示过滤器:在捕捉结果中进行详细查找。语法与捕获过滤器不一样
3. 捕获过滤器
语法与tcpdump、Windump以及任何使用libpcap库的程序一样
这里我只介绍显示过滤器,捕获过滤器在我的另一篇文章写得很详细:全面介绍Linux下tcpdump的使用
4.显示过滤器基本数据类型
4.1 无符号整数与有符号整数
可以用10、8、16进制表示
ip.len le 1500 // 10进制
ip.len le 02734 // 8进制
ip.len le 0x5dc // 16进制
4.2 布尔值
协议对象的boolean域为真当且仅当解码后有该字段
例:
tcp.flags.syn
为真当且仅当SYN标志出现在TCP段中
4.3 以太网地址
用冒号(:),句号(.),横杠(-)分隔,例:
eth.dst == ff:ff:ff:ff:ff:ff
eth.dst == ffff.ffff.ffff
eth.dst == ff-ff-ff-ff-ff-ff
4.4 IPv4地址
ip.addr == 192.168.0.1
或CIDR表示法
ip.addr == 129.111.0.0/16 // 过滤器将查找129.111 B类网络中的所有数据包
4.5 IPv6地址
ipv6.addr == ::1
4.6文本字符串
http.request.uri == "https://www.wireshark.org/"
sip.To contains "a1762"
http.host matches "acme\.(org|com|net)"
5. 显示过滤器
5.1 协议对象
protocol.attr.attr
wireshark自带很多协议解码器,打开搜索栏>表达式即可看到大量协议
5.2 比较运算符
C风格 | 英文 | 描述 |
---|---|---|
== | eq | |
!= | ne | 官方不推荐在eth.addr, ip.addr, tcp.port, udp.port上使用,因为有bug |
< | lt | |
<= | le | |
> | gt | |
>= | ge | |
contains | 协议,字段或偏移包含值,sip.To contains “a1762” | |
matches | ~ | 协议或文本符合perl正则语法:http.host matches "acme.(org |
bitwise_and | & | 二进制与,比较二进制的值:tcp.flags & 0x02 |
5.3 结合运算符
英文格式 | C风格 | 描述 |
---|---|---|
and | && | |
or | || | |
xor | ^^ | 异或 |
not | ! | |
[] | 切片(偏移) | |
in | 成员运算符,存在于集合 | |
() | 括号内优先级更高 |
5.3.1 切片
- n:m n是起始偏移量,m是指定范围的长度。
eth.src [0:3] == 00:00:83
- n-m n是起始偏移量,m是结束偏移量
eth.src [1-2] == 00:83
- :m 相当于0:m,即从序列的开头到偏移量m
eth.src [:4] == 00:00:83:00
- n: 从偏移量n到序列末尾
eth.src [4:] == 20:20
- n 相当于n:1
eth.src [2] == 83
- 复合范围:通过逗号分隔将单个范围串在一起
eth.src [0:3,1-2,:4,4:,2] == 00:00:83:00:83:00:00:83:00:20:20:83
5.3.2 成员运算符(集合)
tcp.port in {80 443 8080}
// 等价于
tcp.port == 80 || tcp.port == 443 || tcp.port == 8080
- 集合范围
tcp.port in {443 4430..4434}
// 等价于
tcp.port == 443 || (tcp.port >= 4430 && tcp.port <= 4434)
- 不仅限于数字,也可以使用其它类型
http.request.method in {"HEAD" "GET"}
ip.addr in {10.0.0.5 .. 10.0.0.9 192.168.1.1..192.168.1.9}
frame.time_delta in {10 .. 10.5}
5.4 字符串函数
函数 | 介绍 |
---|---|
upper | 转换string为大写 |
lower | 转换string为小写 |
len | 返回string或字节字段的字节长度,注意是按字节而不是字符(可能多字节) |
count | 返回字符串在帧(frame)中出现次数 |
string | 将非字符串转换成字符串 |
例:
lower(http.server) contains "apache"
len(http.request.uri) > 100
5.5 正则表达式
采用perl的正则表达式语法
ip.dst_host matches "^172\.(1[6-9]|2[0-9]|3[0-1])\..{1,3}\.255"
6. 常见例子
- 显示来自10.210网段的封包
ip.src == 10.210.0.0/16
- 显示GET请求
http.request.method == “GET”
7. 附录
7.1 参考资料
强烈推荐阅读