网络世界错综复杂,林子大了,什么鸟都有,怎么在万千世界中找到心仪的她,需要我们借助一定的过滤要求来找到所需要的一些报文,在网络世界中,主要根据的是报文中的标志位和一些属性进行区分,如何区分报文的种类以及如何过滤所需要的包,来一起了解吧!

一、前言:

  在上篇文章我们讲述了如何在windows 的 wireshark 中抓取 http 报文 和 tcp 报文,如果你还没接触过 wireshark,可以先回头看看这篇文章,地址我放在这里:传送门, 看完再来看这篇,会更加利于理解。

下面是三个简单的问题,希望你看完后可以尝试捕捉一下对应报文,文末会给出对应的答案

问题1.:捕获 SYN-ACK 报文 (捕获过滤器)
问题2:捕获指定端口范围和指定域名 报文 (捕获过滤器)
问题3:从获取到报文中筛选指定ip地址的报文(显示过滤器)

首先我们先明白一些概念性的东西

二、开始学习

1.过滤器有哪几种

wireshark的过滤器分为两个部分,捕获过滤器和显示过滤器

1.1 捕获过滤器

作用:用于减少抓取的报文体积,使用 BPF 语法,功能相对有限

1.Expression 表达式

表达式主要由两部分构成,一个是原语限定词,另一个是原语运算符,类似我们数学中的 条件 以及 与或非,根据这两个的神奇搭配,我们就可以配出各种我们所想要的条件。

1.1 primitives 原语:由名称或数字,以及描述它的多个限定词组成
1.11 主要的限定词

type: 设置数字或者名称所指示类型

  • host、port (过滤端口或者是 host) ,例如 host www.baidu.com && port 443, 表示捕捉百度https的报文

net:

  • 设置子网过滤、net 192.168.0.0 mask 255.255.255.0 等价于 net 192.168.0.0/24

portrange:

  • 设置端口范围过滤,例如 portrange 6000-8000 ,表示要捕获的端口在 6000到8000之间

Dir: 设置网络出入方向

  • src、dst、src or dst 、src and dst (src 表示源地址,dst 表示目标地址)
  • ra、ta、addr1、addr、addr3、addr4(仅仅对 IEEE 802.11 Wireless LAN 有效)

Proto:指定协议的类型

  • ether 、fddi 、tr 、wlan 、ip 、ip6 、arp 、decnet 、 tcp 、 udp 、icmp 、igmp 、icmp 、igrp 、pim 、ah 、esp 、vrrp
1.12 其他限定词
  • gateway: 指明网关IP地址、等价于 ether host ehost and not host host
  • broadcase: 广播报文,例如 ether broadcase 或者 ip broadcast
  • multicast:多播报文,例如 ip multicast 或者 ip6 multicast
  • less, greater: 小于或者大于

限定词是一些关键的属性,说明你要过滤的指标是什么,是 ip地址,还是端口,是域名 还是协议

1.2 原语运算符
  • 与: && 或者 and
  • 或: || 或者 or
  • 非: !或者 not

例如: src or dst portrange 6000-8000 && tcp or ip6

上述表示要捕获的是 tcp报文或者 ipv6的报文,且源端口或者目标端口在 6000-8000的范围内,

原语运算符的主要作用就是限定搭配来获取丰富多彩的各类条件



1.3 一些常用的示例
• host 192.168.1.1 || host 192.168.12.0 (只捕获 ip 地址为 192.168.1.1 以及 192.168.12.0 的数据包 )
• src host 192.168.1.1 && dst port 80 (只捕获源ip地址为 192.168.1.1 且 目的端口为 80 的数据包 )
• ether host 80:f6:2e:ce:3f:00 (过滤目标或源地址是80:f6:2e:ce:3f:00的数据包)
• host boke.wsfnk.com && port 443 (表示域名是 boke.wsfnk.com 且端口是 443, 也就是 https 的包 )
1.4 捕获 TCP 协议各种类型的报文 !!!

我们知道 TCP 的三次握手和四次挥手 都有着不同的报文,例如 ACK 报文,RST 报文, FIN 报文 等,在学习 TCP 协议的时候,如何捕获这些指定的报文呢?接下来我们根据原理进行学习,首先我们剖析一下 TCP 的报文结构:

wireshark info字段搜索内容 wireshark怎么搜索字符串_wireshark


先解释一下上面的相关名词:

  • Source port :即源端口,占两个字节大小
  • Destination port : 即目标端口,占两个字节大小
  • sequence number :序号,TCP 每个连续的报文都有对应的序号标志,占四个字节大小
  • Acknowledgment number : ACK报文的序号,只有 ACK 标志为 1才有效,
  • Window Size :窗口大小
  • Data offset :和IP数据包头部一样,也有个Options字段,长度是不固定的,而为了要确认整个TCP封包大小,就需要这个标志来说明整个封包区段的起始位置。
    这个字段指出TCP报文段的数据起始处距离 TCP报文段的起始处有多远。“数据偏移”的单位不是字节而是32bit字(4字节为计算单位)
  • reserved :保留字段 占6比特,保留为今后使用,但目前应置为0。
  • checkSum: TCP 校验和,占两个字节大小
  • Urgent pointer: 紧急指针(Urgent Pointer) 占2字节
  • options :选项(Options) 长度可变,TCP首部可以有多达40字节的可选信息,用于把附加信息传递给终点,或用来对齐其它选项。

tcp的标志字段在tcp头的第14字节存储, 对应的 8 个比特对应着 NS,CWR,ECE,URG,ACK,PSH,RST,SYN,FIN ,比特对应的值如果是1,说明该标识生效,常见的有如下几种:

**1:URG:(置一有效)紧急指针,表明发送端向另一端使用紧急方式发送数据。
2:ACK:(置一有效)表示确认序号。
3:PSH:(置一有效)表示接收方应该尽快将这个报文交给应用层。
4:RST:(置一有效)表示重建连接。
5:SYN:(置一有效)用来发起一个连接。
6:FIN:(置一有效)表示发送方的表示完成任务,接收方的表示同意断开连接。**
  • 捕获SYN包。二进制数为 00000010,相对应的十进制数为2 。
    tcp[13] = 2
  • 捕获针对SYN的ACK包。二进制数为 00010010,相对应的十进制数为18.
    tcp[13] = 18
  • 捕获SYN包和SYN的ACK包。 即 tcp[13] & 00000010 = 00000010 ,这个意思是说只要只要 SYN 这个标志为 1 ,其他的是 1 或者 0 都可以,这里利用掩码的知识,即 0 & 0 = 0, 0 & 1 = 0 , 1& 1 =1,因此,如下表示:
    tcp[13] & 2 = 2
  • 只抓取PSH-ACK数据的包。
    tcp[13] = 24
  • 取FIN-ACK数据包。
    tcp[13] & 1 = 1
  • 只捕获RST数据包。
    tcp[13] & 4 = 4

这里的 tcp[13] 的意思是,TCP 报文的第14个字节,一个字节是8bit ,每个比特刚好对应着上面的八个标志,有 1 或 0 的取值

二、显示过滤器

作用:对已经抓取到的报文过滤显示,功能强大

wireshark info字段搜索内容 wireshark怎么搜索字符串_原语_02


我们可以通过 视图菜单,来找到 wireshark 所支持的各类协议,其中 TCP协议 部分如上图所示。

其中类型主要有以下的区分:

2.1 过滤类型
  • Unsigned integer: 无符号整型,例如 ip.len le 1500 ,意思就是 ip包的长度小于1500字节(这里注意,有些文章把单位当作了比特,一堆傻缺还复制来复制去)
  • Signed integer: 有符号整形,就是有正负之分
  • Boolean: 布尔值,例如 tcp.flags.syn ,即 syn 标志,true or false
  • Ethernet address: 用 : 、- 或者 . 分割的6 字节的地址,比如 eth.dst == ff:ff:ff:ff:ff
  • IPv4 address: ipv4 地址过滤,例如 ip.addr == 192.168.1.1 表示只要 显示 ip 为 192.168.1.1 的包
  • IPv6 address: ipv6 地址过滤,例如 ipv6.addr == :: 1
  • Text string: 字符串类型的值过滤,如:http.request.uri == “https://www.baidu.com/” 即请求的 uri 为百度首页的包才显示
2.2 组合符

上面的类型匹配都是单体的,当然我们也可以对其进行组合,此时就需要组合操作符了,如下所示:

英文

符号

意义和例子

and

&

逻辑与, 及两个条件均需成立,例如 ip.src ==10.0.0.1 and tcp.flags.fin

or

||

逻辑或,及两个条件满足其中均可,例如 ip.src == 10.0.0.1 or ip.src== 92.168.1.1

xor

^^

逻辑异或,即两个跳进同时成立才算成立,否则就算不成立 例如, tr.dst[0:3] == 0.6.29 xor tr.src[0:3] == 0.6.29

[…]


切片符,从0开始

in


集合运算

除了上面这些常用的,还有一些其他的操作符
1.大括号{} 集合操作符
例如:tcp.port in {443 80…88} 的意思是 tcp 的端口 在 443 和 80-88 之间的显示,其效果等效于 tcp.port == 443 || (tcp.port >=80 && tcp.port <=88)

2.中括号[] 切片

  • [n:m] ,n代表起始偏移量,m 的是长度 ,例如 [0:3] 就是获取前三位
  • [n-m] 表示 n 是起始偏移量, m 是截止偏移量 ,例如 [0-3] 就是获取前四位
  • [:m] 表示的是从开始到m截止偏移量,例如 [:5] 就是获取前六位,和 [0-5] 是一个意思哦
  • [m:] 表示从 m开始,到末尾,例如 [5:] 就是获取从第六个开始到后面的所有
  • [m] 表示取第 m 处的字节
  • [,] 用逗号分割,允许上述方法同时出现,例如 [0:3,2-3,4:]
2.3 常用函数
  • upper 转为大写
  • lower 转为小写
  • len 获取长度,单位是 字节 (important,别记错了)
  • count 返回一个帧中某个字段出现的次数
  • string 转为string类型

三、问题解密

接下来,我们根据上面的内容来回答这三个问题:
问题1.:捕获 SYN-ACK 报文 (捕获过滤器)
问题2:捕获指定端口范围和指定域名 报文 (捕获过滤器)
问题3:从获取到报文中筛选指定ip地址的报文(显示过滤器)

答案1:捕获 SYN-ACK 报文,即 tcp[13] 的标志为中 SYN 和 ACK 均为1 ,对应的比特二进制数为 00010010, 即 18,因此表达式为:tcp[13] = 18

wireshark info字段搜索内容 wireshark怎么搜索字符串_wireshark_03


答案2:捕获指定端口范围和指定域名的报文,使用 portrange 来指定端口范围,host 指定域名。例如 百度的 端口在 8080-8090的端口,表达式应为:

host www.baidu.com && portrange 8080-8090

wireshark info字段搜索内容 wireshark怎么搜索字符串_TCP_04

答案3:从获取到的报文中筛选指定ip地址的报文,假设我们需要过滤的ip地址为 192.168.31.66,则过滤式为:

ip.addr==192.168.31.66

其中源ip和目标ip都为 192.168.31.66 的才会显示

wireshark info字段搜索内容 wireshark怎么搜索字符串_原语_05