Wireshark 显示过滤器常用规则及代码示例

DisplayFilters 显示过滤器规则 - 目录

    • 显示过滤规则 ≠ 捕获过滤规则
    • 构造过滤规则表达式
      • 示例
      • 需要注意的点
    • 显示过滤字段
    • 比较值
        • 比较操作符
        • 组合表达式
        • 切片操作符
        • 成员操作符
        • 函数
    • 附录

参考资料:
① https://wiki.wireshark.org/DisplayFilters
② https://www.wireshark.org/docs/wsug_html_chunked/ChWorkBuildDisplayFilterSection.html
 
Wireshark 使用显示过滤规则来过滤已捕获的数据包,及按 规则显示特定颜色。
你可以在 显示过滤参考中找到主要的显示过滤协议字段列表。
如果你需要针对特定协议进行显示过滤,请参阅 协议参考。
 

显示过滤规则 ≠ 捕获过滤规则

别把捕获过滤规则(如 tcp port 80)和显示过滤规则(如 tcp.port == 80)搞混了。
参阅捕获过滤规则说明。
 

构造过滤规则表达式

Wireshark 提供了一种显示过滤器语言,使你能够精确地控制显示哪些数据包。它们可以用来检查协议或字段是否存在、字段的值,甚至比较两个字段。这些比较可以与逻辑运算符(如“and”和“or”)和括号组合成复杂的表达式。
以下部分将更详细地介绍显示过滤器功能。

示例

仅显示 SMTP(端口25)和 ICMP 通信:

tcp.port eq 25 or icmp

仅显示局域网 (192.168.x.x) 中工作站与服务器之间的通信 —— 无因特网连接:

ip.src==192.168.0.0/16 and ip.dst==192.168.0.0/16

TCP 缓冲区满——Source停止向Destination发送数据:

tcp.window_size == 0 && tcp.flags.reset != 1

Windows 过滤——在监控Windows客户端时过滤干扰,DC exchanges:

smb || nbns || dcerpc || nbss || dns

Sasser 蠕虫

ls_ads.opnum==0x09

匹配 UDP payload 开头处(任意)包含3字节序列0x81、0x60、0x03的数据包,跳过8字节UDP报头。请注意,字节序列的隐式值仅采用十六进制。(对于匹配自定义的包协议很有用)

udp[8:3]==81:60:03

“切片”特性也可以用于过滤MAC地址的供应商标识符部分(OUI),详情请参阅以太网页面。因此,你可以将显示过滤规则设定为仅显示来自特定设备制造商的数据包。例如,只适用于戴尔电脑:

eth.addr[0:3]==00:06:5B

还可以使用contains操作符搜索字段或协议中出现的任何字符。
在UDP报头或payload的任何位置匹配包含3字节序列的数据包0x81, 0x60, 0x03:

udp contains 81:60:03

在信息头的位置匹配SIP To-header包含字符串“a1762”的数据包:

sip.To contains “a1762”

使用matches或~操作符,可以使用正则表达式使用Perl正则表达式语法在字符串字段和字节序列中搜索文本。注意:Wireshark需要用libpcre构建,以便能够使用matches操作符。
匹配HTTP请求,其中 URI 的最后字符是字符“gl=se”:

http.request.uri matches “gl=se$”

注意:$ 字符是一个 PCRE 标点字符,它与字符串末尾进行匹配,在本例中是字段 http.request.uri 的末尾。
通过协议过滤(如SIP)并过滤掉不需要的ip:

ip.src != xxx.xxx.xxx.xxx && ip.dst != xxx.xxx.xxx.xxx && sip

需要注意的点

一些过滤器字段与多个协议字段匹配。例如,“ip.addr” 匹配IP报头中的IP源地址和目标地址。还有 “tcp.port”, “udp.port”, “eth.addr” 等也是如此。还要注意:

ip.addr == 10.43.54.65

等效于

ip.src == 10.43.54.65 or ip.dst == 10.43.54.65

在某些情况下,凭直觉可能会一不留神写错。假设我们想过滤掉任何发送到或来源于10.43.54.65的流量。我们可以尝试以下方法(二者等效):

ip.addr != 10.43.54.65

ip.src != 10.43.54.65 or ip.dst != 10.43.54.65

但这里意思是 “传输除了源IPv4地址为10.43.54.65目的IPv4地址为10.43.54.65之外的所有流量” ,这不是我们想要的效果。
相反,我们需要否定这个表达式,像这样:

! ( ip.addr == 10.43.54.65 )

! (ip.src == 10.43.54.65 or ip.dst == 10.43.54.65)

意思是 “除了源IPv4地址为10.43.54.65目的IPv4地址为10.43.54.65之外,传输所有流量”,这才是我们想要的效果。
 

显示过滤字段

最简单的显示过滤器是显示单个协议的过滤规则。若要仅显示包含特定协议的数据包,请在 Wireshark 的显示过滤器工具栏中键入该协议。例如,要只显示 TCP 数据包,在 Wireshark 的显示过滤器工具栏中输入 TCP 。诸如此类,要仅显示包含特定字段的数据包,请在 Wireshark 的显示过滤器工具栏中键入该字段。例如,要仅显示 HTTP 请求,输入 http.request 即可。
 
你可以在 View → Internals → Supported Protocols 中查看完整的协议和字段列表。
 

比较值

你可以构造很多种过滤规则表达式。例如,要仅显示IP地址192.168.0.1之间的数据包,可以使用 ip.addr==192.168.0.1。

比较操作符

英文写法 类 C 写法 解释 示例
eq == 等于 ip.src==10.0.0.5
ne != 不等于 ip.src!=10.0.0.5
gt > 大于 frame.len > 10
lt < 小于 frame.len < 128
ge >= 大于等于 frame.len ge 0x100
le <= 小于等于 frame.len ge 0x100
contains 协议、字段或切片包含的值 sip.To contains “a1762”
matches ~ 协议、字段匹配一个兼容Perl的正则表达式 http.host matches “acme\.(org|com|net)”
bitwise_and & 且不为零 tcp.flags & 0x02

所有协议字段都有对应的数据类型,参阅显示过滤规则数据类型。

组合表达式

英文写法 类 C 写法 解释 示例
and && 逻辑与 ip.src==10.0.0.5 and tcp.flags.fin
or || 逻辑或 ip.scr==10.0.0.5 or ip.src==192.1.1.1
xor ^^ 逻辑异或 tr.dst[0:3] == 0.6.29 xor tr.src[0:3] == 0.6.29
not ! 逻辑非 not llc
[…​] 子序列 参阅下方“切片操作符”
in 成员集合 http.request.method in {“HEAD” “GET”}. 参阅下方“成员操作符”

切片操作符

Wireshark 允许你以相当复杂的方式选择序列的子序列。在标签之后可以放置一对方括号 [],其中包含逗号分隔的范围表示一个列表。
 
eth.src[0:3] == 00:00:83
上面的示例使用 n:m 格式指定单个范围。在这种情况下,n是开始位置偏移量,m是指定范围的长度。
 
eth.src[1-2] == 00:83
上面的示例使用 n-m 格式指定单个范围。在这种情况下,n是开始位置偏移量,m是结束位置偏移量。
 
eth.src[:4] == 00:00:83:00
上面的例子使用 :m 格式,它取序列从开始位置到偏移 m 的所有值,等价于 0:m
 
eth.src[4:] == 20:20
上面的示例使用 n: 格式,它取从起始位置偏移量 n 到序列末尾的所有内容。
 
eth.src[2] == 83
上面的示例使用 n 格式指定范围。在这种情况下,取序列中偏移量为 n 位置上的元素。这等同于 n:1。
 
eth.src[0:3,1-2,:4,4:,2] == 00:00:83:00:83:00:00:83:00:20:20:83
Wireshark 允许用逗号将单个范围串组成列表,形成如上所示的复合范围。
 

成员操作符

Wireshark 允许你调试字段在一组值或字段中的成员关系。在字段名之后,使用 in 操作符,后跟大括号 {} 括起来的集合项。例如,要显示 TCP 协议下且端口为 80、443 或 8080 的数据包,你可以用 tcp.port in {80 443 8080} ,这个集合同样可以包含一个范围:tcp.port in {443 4430…4434}
注:

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)

这是因为当任何字段通过过滤器时都会与规则进行比较,因此源端口为56789,目的端口为80的数据包也会匹配第二个过滤器,此时 56789 >= 4430 && 80 <= 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}

函数

函数 解释 示例
upper 将字符串字段转换为大写
lower 将字符串字段转换为小写 lower(http.server) contains “apache”
len 返回一个字符串或字节字段的字节长度 len(http.request.uri) > 100
count 返回一个框架中出现字段的数目 count(ip.addr) > 2
string 将非字符串字段转为字符串 string(frame.number) matches “[13579]$”

 

附录

①CaptureFilters 捕获过滤器规则
②显示调试Apache时的HTTP通信
③Capture and display Cheat Sheets

你可能感兴趣的:(网络安全,过滤器,正则表达式,wireshark,运维,安全)