本文会对Wireshark做简单介绍,带大家熟悉一下Wireshark的界面,以及如何使用过滤器。
接着会带大家查看TCP五层模型下,带大家回顾各层首部的格式。
最后会演示 Wireshark 如何抓取三次握手和四次挥手包的过程。
目录
一.Wireshark简介
大家可能之前用过 BurpSuite,Wireshark和它相比有哪些区别呢?
Burpsuite 只是抓的应用层数据包,而 Wireshark 七层网络模型都能抓。
不过Wireshark不是入侵检测系统,对于网络上的异常流量,Wireshark不会警示或提示。
且无法对流量包进行更改,只能查看流量包。
下载地址:Wireshark · Download
二. 界面介绍
共分为五大块:菜单栏,工具栏,显示过滤器,捕获过滤器和网卡模块。
显示过滤器是对抓到的包进行过滤;
捕获过滤器是提前设置好想抓的对象。
抓包界面也分三大块:
从上到下分别是数据包列表,数据包的详细信息和详细信息十六进制表示。
在编辑-首选项-外观,也可以按自己习惯修改布局。
三. 过滤器
功能列表不可能一一介绍完,这里介绍最重要的过滤器。
1. 捕获过滤器
前面说过,捕获过滤器是提前设置好捕获的对象
点击捕获-选项:
这里的混杂模式 是指不仅抓本机MAC地址的包,所有经过网卡的包都会捕获。
捕获过滤器就在下方的框内输入即可
比如想捕获端口为443的包:输入 port 443
还有很多选项,比如
地址:host、src、dst 协议:ip、tcp、http、ftp 等
如查找目的地址为本机且协议是tcp的包:dst 127.0.0.1 && tcp
这里再举些例子:
src host 192.168.2.11 && dst port 80 #抓取源地址为192.168.2.11,并且目的端口为80
的流量
host 192.168.2.11 || host 192.168.2.22 #抓取192.168.2.11或者192.168.2.22的流量
数据
!broadcast #不抓取广播包
src ether host 98:1a:35:98:09:6f #抓取源mac地址为98:1a:35:98:09:6f的数据包
2. 显示过滤器
显示过滤器是对抓完的包再进行过滤
这里也列出一些例子:
http、tcp #按照协议搜索
ip.src_host=192.168.2.16 #src_host按照源ip地址进行搜索
ip.src_host=192.168.2.16 or ip.dst_host=192.168.2.1 # dst_host是目标主机ip地址
tcp.flags.ack == 0 and tcp.flags.syn == 1 # 这是过滤出,tcp请求中ack标记为0,syn标记为1的包
ip.addr=192.168.2.33 # 是要ip地址为192.168.2.33的全部展示出来,不管是目标地址还是源地址。
tcp.srcport == 443 # 源端口为443的数据包
not arp # 不获取arp数据
tcp.port == 443 # 过滤端口443的数据包
这里还有一种过滤器选择方法:
我们选择一项右击,选择作为过滤器应用,也可以进行显示过滤。
四. 保存流量包
比如我们想导出特定几个流量包,怎么导出呢?
选中我们要标记的包右键标记或者 Ctrl + M
再点击 文件 - 导出特定分组,选择最下面的 Marked packets only
五. 协议数据包详解
OSI 七层模型和 TCP/IP 五层模型相信大家并不陌生:
Wireshark 呈现出的方式是五层模型方式:
我们依次来看一下:
1. 物理层
2. 数据链路层
数据链路层抓的是以太网MAC帧,格式如下:
细心的同学会发现,为什么Wireshark这个没有FCS字段
因为 Wireshark 抓取的MAC帧直接丢掉了帧尾,默认丢弃了这个校验字段。
3. 网络层
IP层咱先回顾一下IP首部字段:
再来对比看一下:
4. 传输层
传输层协议主要是TCP和UDP,我们这里先看TCP:
对应看下包:这里的1000就是数据偏移,保留位是 ....
数据偏移其实就是表示这个TCP的首部长度,以4B为单位,所以为32B
标志位字段展开就是六个标志
各个标志位的含义如下:
--------------------------------------------------------------------------------------------------------------------------------
下面演示三次握手和四次挥手的抓包过程:
三次握手
首先看下三次握手的过程图:
具体的三次握手细节可以看 湖科大计网
实验过程如下:
我们随便访问一个网站,通过 源地址、目标地址和info 能找到三次握手的包
也可以设置显示过滤器为 tcp.flags.syn == 1 进行查找
然后存储下来,我们来进行分析:
第一个包,开始时服务器端处于监听状态,客户端发送TCP连接请求报文段
并设置 seq=x,SYN=1,进入 SYN-SENT 状态
---------------------------------------------------------------------------------------------------------------------------------
第二个包,服务器端接收到后,向客户端发送确认消息
设置 SYN=1,ACK=1,seq=y,ack=x+1,并进入 SYN-RCVD 状态
---------------------------------------------------------------------------------------------------------------------------------
第三个包,客户端收到后,向服务器端发送TCP确认报文段表示收到
设置 ACK=1,seq=x+1,ack=y+1,进入 ESTABLISHED 状态
最后,服务器收到确认请求,就知道可以进行通信了,也进入 ESTABLISHED 状态。
四次挥手
四次挥手的过程图:
实验过程如下:
我们搜索 tcp.flags.fin == 1
搜到两条先标记,然后搜 tcp.flags,就能找到四次挥手的四个包了,标记保存。
第一个包,客户端向服务器发送FIN请求,并确认收到之前的数据
设置 FIN=1,ACK=1,seq=u,ack=v,并进入终止等待1状态
---------------------------------------------------------------------------------------------------------------------------------
第二个包, 服务器收到客户端的包,返回确认包
设置 ACK=1,seq=v,ack=u+1,服务器端进入关闭等待状态,客户端进入终止等待2状态
---------------------------------------------------------------------------------------------------------------------------------
第三个包,主要是为了防止第二包发完后,服务器端还有数据要发送给客户端
发送完后,服务器端也告知客户端自己要请求断开连接,并确认收到了之前的数据包
设置 FIN=1,ACK=1,seq=w,ack=u+1,服务器端进入最后确认状态
---------------------------------------------------------------------------------------------------------------------------------
第四个包,客户端确认收到服务器端的释放请求
设置 ACK=1,seq=u+1,ack=w+1,客户端进入时间等待状态,因为怕服务器端没收到这个确认包。客户端等待2MSL看服务器端是否会超时重传,没反应就进入关闭状态。
感谢你能看到这 o(* ̄▽ ̄*)ブ