别把捕获过滤规则(如 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