网络世界错综复杂,林子大了,什么鸟都有,怎么在万千世界中找到心仪的她,需要我们借助一定的过滤要求来找到所需要的一些报文,在网络世界中,主要根据的是报文中的标志位和一些属性进行区分,如何区分报文的种类以及如何过滤所需要的包,来一起了解吧!
在上篇文章我们讲述了如何在windows 的 wireshark 中抓取 http 报文 和 tcp 报文,如果你还没接触过 wireshark,可以先回头看看这篇文章,地址我放在这里:传送门, 看完再来看这篇,会更加利于理解。
下面是三个简单的问题,希望你看完后可以尝试捕捉一下对应报文,文末会给出对应的答案
问题1.:捕获 SYN-ACK 报文 (捕获过滤器)
问题2:捕获指定端口范围和指定域名 报文 (捕获过滤器)
问题3:从获取到报文中筛选指定ip地址的报文(显示过滤器)
首先我们先明白一些概念性的东西
wireshark的过滤器分为两个部分,捕获过滤器和显示过滤器
作用:用于减少抓取的报文体积,使用 BPF 语法,功能相对有限
表达式主要由两部分构成,一个是原语限定词,另一个是原语运算符,类似我们数学中的 条件 以及 与或非,根据这两个的神奇搭配,我们就可以配出各种我们所想要的条件。
type: 设置数字或者名称所指示类型
net:
portrange:
Dir: 设置网络出入方向
Proto:指定协议的类型
限定词是一些关键的属性,说明你要过滤的指标是什么,是 ip地址,还是端口,是域名 还是协议
例如: src or dst portrange 6000-8000 && tcp or ip6
上述表示要捕获的是 tcp报文或者 ipv6的报文,且源端口或者目标端口在 6000-8000的范围内,
原语运算符的主要作用就是限定搭配来获取丰富多彩的各类条件
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 的包 )
我们知道 TCP 的三次握手和四次挥手 都有着不同的报文,例如 ACK 报文,RST 报文, FIN 报文 等,在学习 TCP 协议的时候,如何捕获这些指定的报文呢?接下来我们根据原理进行学习,首先我们剖析一下 TCP 的报文结构:
先解释一下上面的相关名词:
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 所支持的各类协议,其中 TCP协议 部分如上图所示。
其中类型主要有以下的区分:
上面的类型匹配都是单体的,当然我们也可以对其进行组合,此时就需要组合操作符了,如下所示:
英文 | 符号 | 意义和例子 |
---|---|---|
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.中括号[] 切片
接下来,我们根据上面的内容来回答这三个问题:
问题1.:捕获 SYN-ACK 报文 (捕获过滤器)
问题2:捕获指定端口范围和指定域名 报文 (捕获过滤器)
问题3:从获取到报文中筛选指定ip地址的报文(显示过滤器)
答案1:捕获 SYN-ACK 报文,即 tcp[13] 的标志为中 SYN 和 ACK 均为1 ,对应的比特二进制数为 00010010, 即 18,因此表达式为:tcp[13] = 18
答案2:捕获指定端口范围和指定域名的报文,使用 portrange 来指定端口范围,host 指定域名。例如 百度的 端口在 8080-8090的端口,表达式应为:
host www.baidu.com && portrange 8080-8090
答案3:从获取到的报文中筛选指定ip地址的报文,假设我们需要过滤的ip地址为 192.168.31.66,则过滤式为:
ip.addr==192.168.31.66
其中源ip和目标ip都为 192.168.31.66 的才会显示
码字总结不易,如果对你有帮助希望能给个赞或者关注,后面我会出更多网络相关的文章,以上内容,如有书写不严谨之处,请指出。