曲径通幽论坛

标题: 使用 wireshark 的过滤功能(过滤器及表达式) [打印本页]

作者: beyes    时间: 2013-1-8 23:42
标题: 使用 wireshark 的过滤功能(过滤器及表达式)
有效的使用 wireshark 的过滤功能,可以为我们提取数据化繁为简。

过滤功能由两个过滤器提供,分别是“捕捉过滤器”(Capture filters)和“显示过滤器”(Display filters)。

捕捉过滤器主要用于捕捉数据前设置过滤条件;显示过滤器主要用于从捕捉结果中过滤出想要的数据。

使用捕捉过滤器,可以先进入到捕获选项设置界面:
[attach]1194[/attach](图-1)

如上图,先勾选某个网卡,然后双击它,在弹出的对对话框中进行过滤器的设置,如下面的 port 25 ,它表示只对往来 25 端口的数据感兴趣:
[attach]1196[/attach](图-2)
设置完并启动 wireshark,这时它就不会与默认设置那样,什么都抓,而只是捕获符合条件的内容。如在 cmd 里执行 telnet smtp.163.com 25 ,那么可以看到 wireshark 的捕获:
[attach]1197[/attach](图-3)

在设置过滤表达式时,我们看到后面的 "Compile BPF" 按钮,上面的 BPF 的全称是“Berkeley Packet Filter"。在安装 Wireshark 时(Windows 版),会要求安装 WinCap 包(Linux 上使用 libpcap 库)。WinCap 所识别的格式就是 BPF 。

使用 BPF 语法创建的过滤器称之为”表达式“(expression),每一个表达式由一个或多个”基本体"(primitive)所构成;“基本体“又是由一个或多个”限定词“(qualifer),并跟着一个 ID 名构成。

BFP 限定词
限定词(Qualifier)描述 举例
TypeID 的指向类型host, net, port
Dir指定 ID 的传输方向 src, dst
Proto 限制匹配某种特定的协议 ether, ip, tcp, udp, http, ftp

ID名 通常是一个数字,如端口号;一个 IP 地址;一个网段标识。一个表达式构成可如下所示:
[attach]1198[/attach](图-4)
表达式中可用逻辑操作符:&& (与), || (或), ! (非) 。

表达式示例 1:
dst 119.147.74.117 && port 80
上面的例子表示,访问目标 IP 119.147.74.117,并且要对应其 80 端口的通信才会被捕捉。

表达式示例 2:
host 192.168.1.110
只关心和 192.168.1.100 这台主机往来的记录。当然,也可以指定一个 IPv6 的地址,如:host 2012:bd8:8813::8a83:330:3920 。但是 IP 地址是有可能经常改变的,但是 MAC 就不会,那么可以指定 MAC 来捕获,此时使用 ether 协议限定词:
ether host 6C-F0-49-EE-76-DC
另外,如果想截获访问某个网站的数据时,可能觉得先 ping 出其域名所对应的 IP 比较麻烦,那么可以直接用 host 加域名的写法,如 host www.groad.net

表达式示例 3:
src host 192.168.1.110
捕获源主机 IP 为 192.168.1.110 的通信。

表达式示例 4:
dst 192.168.2.4
捕获目的主机 IP 为 192.168.2.4 的通信。

表达式示例 5:
port 8080
捕获仅来往于 8080 端口的通信。

表达式示例 6:
!port 8080
捕获除了 8080 端口的其他所有端口的通信。

表达式示例 7:
dst port 80
捕获目的端口为 80 的通信。

表达式示例 8:
icmp
捕获 ICMP 通信。

表达式示例 9:
!ip6
捕获非 IPv6 的通信。

实际上,BPF 语法的一个强大之处是可以精确到字节的过滤。比如在 ICMP 的头部的第 1 个字节表示 ICMP 消息类型,如值为0 时表示应答,8 时表示请求,3 时表示目的地不可到达。我们在指定过滤器时,可以精确到指定这个字节,如设置 icmp[0] == 8 时,那么将仅过滤出请求的通信:
[attach]1199[/attach](图-5)

当然,可以利用上面的逻辑操作符来指定条件,如:icmp[0] == 8 || icmp[0] == 0 ,这表示只关心请求和应答的消息类型。需要注意的是,定义字节是从第 0 个开始的。

但是,也不要认为只能检查 1 个字节,如果想连续匹配多个字节,那么可以如下形式使用:
icmp[0:2] == 0x0301
上面中括号里的 0:2 表示,从第 0 个字节开始,且匹配长度为 2 。也就是说,这次匹配,会检测 ICMP 的消息类型,以及 code 的值,查看它们是否分别为 0x03 和 0x01 。

不仅是使用 "==“ 符号的匹配,还可以进行 "&" 之类的逻辑运算。在 TCP 报文首部中,第 13 个字节中的位可以表示 URG, ACK, PSH, PST, SYN, FIN 这些标志。如果如下指定:
tcp[13] & 24 == 0x18
则表示需要匹配同时置 ACK 和 PSH 这两个标志:
[attach]1200[/attach](图-6)
为了方便起见,列出了检测这几个标志的表达式:
tcp[13] & 1 == 1   ;匹配 FIN 标志
tcp[13] & 2 == 2   ;匹配 SYN 标志
tcp[13] & 4 == 4   ;匹配 RST 标志
tcp[13] & 8 == 8   ;匹配 PSH 标志
tcp[13] & 16 == 16 ;匹配 ACK 标志
tcp[13] & 32 == 32 ;匹配 URG 标志

  

显示过滤器
显示过滤器是对捕获结果的一种过滤,它位于程序主面板的上方:
[attach]1201[/attach](图-7)
旁边的 “Expression” 按钮可以让你从一个相当大的表达式库里选择相应的表达式以满足你的过滤要求:
[attach]1202[/attach](图-8)
比如我选择 tcp.ack == 1 这个条件后,再点一下 "Apply" 按钮,那么就会将上面(图-6)中的结果过滤只剩一下 1 条:
[attach]1203[/attach]


表达式中常用到的比较操作符为:
==  等于
!=   不等于
>    大于
<    小于
>=   大于等于
<=   小于等于
又如:ip.addr == 192.168.1.110 or ip.addr == 192.168.1.88

表达式中常用到的逻辑操作符为:
and   两个条件必须为真
or   只要有一个条件为真
xor  仅有一个条件为真
not  没有条件为真
又如下面的几个表达式:
!tcp.port == 3389    ;过滤掉 RDP 通信
tcp.flags.syn == 1   ; TCP 包头中匹配 SYN 标志
tcp.flags.rst == 1     ; TCP 包头中匹配 RST 标志
!arp                         ; 过滤掉 ARP 通信
http                          ; 所有的 HTTP 通信
tcp.port == 23  || tcp.port 21   ; Telnet 或者 FTP
smtp || pop  || imap      ; EMAL 相关的几个通信(SMTP, POP, IMAP)

更多的显示过滤表达式可以参考:http://www.wireshark.org/docs/dfref/




欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) Powered by Discuz! X3.2