参考资料:
①https://wiki.wireshark.org/CaptureFilters
②https://www.wireshark.org/docs/wsug_html_chunked/ChCapCaptureFilterSection.html
规则部分
一个过滤规则包含一组原始表达式,每个表达式用 and 或 or 这类关键词连接:
[not] 表达式 [and|or [not] 表达式 …]
捕获与指定地址之间的 telnet 通信数据包
tcp port 23 and host 10.0.0.5
这个示例展示了与IP 10.0.0.5之间的 telnet 通信数据包的捕获过滤规则。
捕获所有不是来自于10.0.0.5的通信数据包
tcp port 23 and not src host 10.0.0.5
[src|dst] host <host>
此表达式允许你对你与目标主机IP地址或域名之间的通信进行筛选。你可以在表达式前加上 src 或者 dst 以表示你希望捕获是来源于对象还是发送到对象的数据包;如果不加,则你与你设定的对象的所有通信数据包都会被捕获。
ether [src|dst] host <ehost>
此表达式允许你与以太网上的目标主机之间的通信进行筛选。你可以在 ether 和 host 加上关键字 src 或者 dst,同上。
gateway host <host>
此表达式允许捕获你与作为网关的目标主机之间的通信,即以太网通信的主机,不是IP通信。
[src|dst] net <net> [{mask <mask>}|{len <len>}]
此表达式允许你筛选网络号(network numbers),另外,如果与你的网络不同也可以指定掩码和CIDR前缀。
[tcp|udp] [src|dst] port <port>
此表达式允许你筛选TCP与UDP协议及端口号,如果不作指定将默认捕获所有符合条件的数据包。
less|greater <length>
此表达式允许你根据数据包的长度进行过滤。
ip|ether proto <protocol>
此表达式允许你在以太网层或IP层对指定协议进行过滤。
ether|ip broadcast|multicast
此表达式允许你在以太网层或IP层对广播或组播进行过滤。
<expr> relop <expr>
此表达式允许你对数据包中的具体内容进行筛选。
更多信息请参阅 pcap-filter
具体示例部分
Wireshark 捕获过滤器使用的语法与 tcpdump、WinDump、Analyzer 这类使用 libpcap/WinPcap 库的程序一致。
捕获过滤规则 ≠ 显示过滤规则
别把捕获过滤规则(如 tcp port 80)和显示过滤规则(如 tcp.port == 80)搞混了,前者限制更多并且用于减少捕获到的数据包的数目,而后者是从已经捕获的数据包中筛选出或隐藏掉一些数据包。
捕获过滤规则是在开始抓包之前设置的,抓包途中不能修改;但显示过滤规则不受此限制,你可以随时修改它们。
在 Wireshark 主界面中,你可以在上方列表中找到捕获(Capture)过滤器,然后在显示数据包列表上方可以找到显示过滤器,如下图所示:
示例
只捕获与 IP 172.18.5.4 之间的通信数据包:
host 172.18.5.4
捕获与某个IP地址区间的通信数据包:
net 192.168.0.0/24
net 192.168.0.0 mask 255.255.255.0
捕获来自某个IP地址区间的通信数据包:
src net 192.168.0.0/24
src net 192.168.0.0 mask 255.255.255.0
捕获向某个IP地址区间发送的通信数据包:
dst net 192.168.0.0/24
dst net 192.168.0.0 mask 255.255.255.0\
只捕获DNS(端口 53)通信数据包:
port 53
捕获服务器上除了HTTP和SMTP以外的通信数据包(以下二者等效):
host www.example.com and not (port 80 or port 25)
host www.example.com and not port 80 and not port 25
捕获除去所有ARP的数据包同时捕获DNS通信数据包:
port not 53 and not arp
捕获某个端口范围内的通信数据包:
(tcp[0:2] > 1500 and tcp[0:2] < 1550) or (tcp[2:2] > 1500 and tcp[2:2] < 1550)
或者 libpcap版本大于等于0.9.1时:
tcp portrange 1501-1549
只捕获以太网 EAPOL:
ether proto 0x888e
不捕获以太网LLDP组播组框架相关:
not ether dst 01:80:c2:00:00:0e
仅捕获IPv4,能过滤掉较低层的数据包,有时非常有用:
ip
仅捕捉单播——只捕获进出你的机器的数据包,而不捕获广播和组播,这有助于去掉一些不需要的影响:
not broadcast and not multicast
捕获IPv6所有节点(路由器和邻居通告报文)通信:
dst host ff02::1
捕获HTTP GET请求。TCP header 后的这几个字节 ‘G’, ‘E’, ‘T’, 和 ’ ’ (十六进制值分别为 47, 45, 54 和 20),“tcp[12:1] & 0xf0) >> 2” 为 TCP header 长度。
port 80 and tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420
可能有用的过滤规则
Blaster 和 Welchia 均为RPC蠕虫。
- Blaster worm:
dst port 135 and tcp port 135 and ip[2:2]==48
- Welchia worm:
icmp[icmptype]==icmp-echo and ip[2:2]==92 and icmp[8:4]==0xAAAAAAAA
该过滤规则筛选一个92字节长的 ICMP 回显请求,并且有着以4个字节的A(十六进制)开头的 ICMP 有效载荷长度。这是 Welchia 蠕虫试图破坏系统的签名。
许多蠕虫利用主机上的135、445和1433端口传播,该过滤规则独立于一些特定的蠕虫,在这些端口上寻找来自局域网的SYN报文,请更改设置以映射到你自己的网络:
dst port 135 or dst port 445 or dst port 1433 and tcp[tcpflags] & (tcp-syn) != 0 and tcp[tcpflags] & (tcp-ack) = 0 and src net 192.168.0.0/24
- Heartbleed Exploit
tcp src port 443 and (tcp[((tcp[12] & 0xF0) >> 4 ) * 4] = 0x18) and (tcp[((tcp[12] & 0xF0) >> 4 ) * 4 + 1] = 0x03) and (tcp[((tcp[12] & 0xF0) >> 4 ) * 4 + 2] < 0x04) and ((ip[2:2] - 4 * (ip[0] & 0x0F) - 4 * ((tcp[12] & 0xF0) >> 4) > 69))
默认过滤规则
Wireshark 会判断其是否在一个远程主机上工作(例如通过SSH或远程桌面),如果是,则会设置一个默认的过滤规则来阻止捕获远程会话的流量。它按照以下顺序检查环境变量:
| 环境变量 | 内容 |
|---|---|
| SSH_CONNECTION | not (tcp port srcport and addr_family host srchost and tcp port dstport and addr_family host dsthost) |
| SSH_CLIENT | not (tcp port srcport and addr_family host srchost and tcp port dstport) |
| REMOTEHOST | not addr_family host host |
| DISPLAY | not addr_family host host |
| CLIENTNAME | not tcp port 3389 |
(addr_family 为 ip 或 ip6)
附录
①字符串匹配过滤规则生成器
②DisplayFilters:更多关于捕获后显示数据包的过滤规则。(TODO)