Wireshark使用教程
一. Wireshark简介
Wireshark 是一款功能强大、广受欢迎的开源网络协议分析工具,帮助网络管理员、安全专家和开发人员深入了解网络流量,诊断网络问题,确保网络安全。包含实时数据捕获、强大过滤器、多种协议支持、支持多种捕获文件格式!
1. Wireshark抓包原理
Wireshark 的抓包功能依赖底层的数据链路层访问权限,使用 WinPCAP/Npcap 作为接口直接与网卡进行数据报文交换。使用的环境大致分为两种,一种是电脑直连网络的单机环境,另外一种就是应用比较多的即连接交换机的网络环境。
单机情况:Wireshark 直接抓取本机网卡的网络流量,默认正常工作模式,适用于分析本地通信。
交换机情况:Wireshark 通过端口镜像、ARP 欺骗等方式获取局域网中的网络流量。
-
端口镜像
利用交换机的接口作为镜像端口 SPAN,将局域网指定接口或 VLAN 的流量复制到镜像端口,Wireshark 运行在连接镜像端口的电脑上,从而可以捕获这里的数据流量(无法抓取加密流量)。 -
ARP 欺骗
使用工具(如 Ettercap 或 Arpspoof)发送伪造的 ARP 响应,欺骗局域网中的目标设备将其流量发送到攻击者的设备,Wireshark 伪装成中间人(MITM)捕获流量后再将数据转发给真正的网关。
Wireshark 的捕获机制是监听并复制数据包流经指定接口的数据供分析使用。
-
监听指定接口的数据流
Wireshark 会监控用户选择的网络接口(以太网、Wi-Fi 等)上的数据流。 -
复制数据包到本地分析
Wireshark 不会对网络上的实际数据包产生影响,而是将通过接口捕获到的数据包复制到本地内存中,并将其按照时间顺序记录。捕获到的数据包会被存储在内存或临时文件中,并可保存为 .pcap 文件供后续分析,若选不保存则是删除本地复制的数据包无法恢复。
2. Wireshark捕获模式
Wireshark 的捕获模式决定了网卡能够接收到的数据包范围。
-
正常模式(Normal Mode)
网卡只会捕获发送给自身的特定数据包如单播、广播和多播数据包,适合抓取与主机直接相关的流量排查本地问题。 -
混杂模式(Promiscuous Mode)
网卡会捕获经过网络接口的所有数据包,可用于分析局域网内的整体通信流量,能查看其他主机的通信。 -
监视模式(Monitor Mode)
主要用于无线网络分析 802.11 协议,能够截获未与网卡关联的所有无线数据帧(包括管理帧、控制帧和数据帧),用于调试 Wi-Fi 网络问题并测试无线网络的安全性。
3. Wireshark下载安装
安装包:Wireshark Installer
4. 选择网卡
打开 Wireshark 后,会直接进入「网卡选择界面」,WLAN 是我连接无线的网卡,我们抓一下这个网卡的流量,双击网卡名,自动开始抓包。
5. 停止抓包
点击左上角的「红色按钮」,可以停止抓包
6. 保存数据
点击右上角的「文件」,选择「保存」,可以保存抓包的数据;
也可以直接点击工具栏的保存按钮
二、界面介绍
1. Wireshark 的主界面包含6个部分:
菜单栏:用于调试、配置
工具栏:常用功能的快捷方式
过滤栏:指定过滤条件,过滤数据包
数据包列表:核心区域,每一行就是一个数据包
数据包详情:数据包的详细数据
数据包字节:数据包对应的字节流,二进制
2. 数据着色规则
说明:数据包列表区中不同的协议使用了不同的颜色区分。协议颜色标识定位在菜单栏View --> Coloring Rules。如下所示
3. 数据包详情
在数据包列表中选择指定数据包,在数据包详细信息中会显示数据包的所有详细信息内容。数据包详细信息面板是最重要的,用来查看协议中的每一个字段。各行信息分别为
-
Frame: 物理层的数据帧概况
-
Ethernet II: 数据链路层以太网帧头部信息
-
Internet Protocol Version 4: 互联网层IP包头部信息
-
Transmission Control Protocol: 传输层T的数据段头部信息,此处是TCP
-
Hypertext Transfer Protocol: 应用层的信息,此处是HTTP协议
4. TCP包的具体内容
从下图可以看到wireshark捕获到的TCP包中的每个字段。
三、基础操作
1. 调整界面大小
工具栏中的三个「放大镜」图标,可以调整主界面数据的大小。
+:放大主窗口文字
-:缩小主窗口文字
=:使主窗口文字回归正常大小
2. 设置显示列
数据包列表是最常用的模块之一,列表中有一些默认显示的列,我们可以添加、删除、修改显示的列。
1)添加显示列
右键选择添加列
想要在数据列表中显示某一个字段,可以将这个数据字段添加至显示列中。
在数据包详情中左键选中想要添加为列的字段,右键选择「应用为列」。
快捷键添加
想要在数据列表中显示某一个字段,可以将这个数据字段添加至显示列中。
在数据包详情中左键选中想要添加为列的字段,按 Ctrl + Shift + I,也可添加
列添加效果
添加为列的字段会在数据列表中显示。
2)隐藏显示列
暂时不想查看的列,可以暂时隐藏起来。
在显示列的任意位置右键,取消列名的「勾选」,即可隐藏显示列。
3)删除显示列
不需要查看的字段,可以从显示列中删除。
右键需要删除的列,点击最下方的「Remove this Column」
注意:隐藏字段时,在列名栏的任意位置右键即可;而删除字段时,需要在指定的列名位置右键,以防误删。
3. 设置时间
数据包列表栏的时间这一列,默认显示格式看起来很不方便,我们可以调整时间的显示格式。
点击工具栏的「视图」,选择「时间显示格式」,设置你喜欢的格式。
4. 标记数据包
对于某些比较重要的数据包,可以设置成高亮显示,以达到标记的目的。
选中需要标记的数据包,右键选择最上面的「标记/取消标记」。
选中数据包,按 Ctrl + M 也可以实现同样的效果,按两次可以取消标记。
5. 导出数据包
演示快速抓包时,我们讲过保存数据包的操作,保存操作默认保存所有已经抓取的数据包。但有时候,我们只需要保存指定的数据包,这时候可以使用导出的功能。
1)导出单个数据包
步骤一: 选中数据包,点击左上角的「文件」,点击「导出特定分组」。
步骤二:在「导出分组界面」,选择第二个 「Selected packets only」,只保存选中的数据包。
2)导出多个数据包
有时候我们需要导出多个数据包,Wireshark有一个导出标记的数据包的功能,我们将需要导出的数据包都标记起来,就可以同时导出多个数据包。
步骤一:点击左上角的「文件」,点击「导出特定分组」。
步骤二:在「导出分组界面」,勾选第三个 「Marked packets only」,只导出标记的数据包。
6. 开启混杂模式
局域网的所有流量都会发送给我们的电脑,默认情况下,我们的电脑只会对自己mac的流量进行解包,而丢弃其他mac的数据包。
开启混杂模式后,我们就可以解析其他mac的数据包,因此,我们使用Wireshark时,通常都会开启混杂模式。
步骤一:点击菜单栏的「捕获」按钮,点击「选项」。
步骤二:勾选 在所有接口上使用混杂模式。
六、过滤器操作
过滤器是Wireshark的核心功能,也是我们平时使用最多的一个功能。
Wireshark提供了两个过滤器:抓包过滤器 和 显示过滤器。两个过滤器的过滤思路不同。
抓包过滤器:重点在动作,需要的包我才抓,不需要的我就不抓。
显示过滤器:重点在数据的展示,包已经抓了,只是不显示出来。
1. 抓包过滤器
抓包过滤器在抓包前使用,它的过滤有一个基本的语法格式:BPF语法格式。
抓包过滤器类型Type(host、net、port)、方向Dir(src、dst)、协议Proto(ether、ip、tcp、udp、http、icmp、ftp等)、逻辑运算符(&& 与、|| 或、!非)
1) BPF语法
BPF(全称 Berkeley Packet Filter),中文叫伯克利封包过滤器,它有四个核心元素:类型、方向、协议 和 逻辑运算符。
- 类型Type:主机(host)、网段(net)、端口(port)
- 方向Dir:源地址(src)、目标地址(dst)
- 协议Proto:各种网络协议,比如:tcp、udp、http
- 逻辑运算符:与( && )、或( || )、非( !)
四个元素可以自由组合,比如:
- src host 192.168.31.1:抓取源IP为 192.168.31.1 的数据包
- tcp || udp:抓取 TCP 或者 UDP 协议的数据包
(1)协议过滤
比较简单,直接在抓包过滤框中直接输入协议名即可。
TCP,只显示TCP协议的数据包列表
HTTP,只查看HTTP协议的数据包列表
ICMP,只显示ICMP协议的数据包列表
(2)IP过滤
host 192.168.1.104
src host 192.168.1.104
dst host 192.168.1.104
(3)端口过滤
port 80
src port 80
dst port 80
(4)逻辑运算符&& 与、|| 或、!非
src host 192.168.1.104 && dst port 80 抓取主机地址为192.168.1.80、目的端口为80的数据包
host 192.168.1.104 || host 192.168.1.102 抓取主机为192.168.1.104或者192.168.1.102的数据包
!broadcast 不抓取广播数据包
2)使用方式
使用抓包过滤器时,需要先停止抓包,设置完过滤规则后,再开始抓包。
步骤一:停止抓包的前提下,点击工具栏的捕获按钮,点击选项。
步骤二:在弹出的捕获选项界面,最下方的输入框中输入过滤语句,点击开始即可抓包。
提示:抓包过滤器的输入框,会自动检测语法,绿色代表语法正确,红色代表语法错误。
2. 显示过滤器
显示过滤器在抓包后或者抓包的过程中使用。
1)语法结构
显示过滤器的语法包含5个核心元素:IP、端口、协议、比较运算符和逻辑运算符。
注意:协议名称需要输入小写。
- IP地址:ip.addr、ip.src、ip.dst
- 端口:tcp.port、tcp.srcport、tcp.dstport
- 协议:tcp、udp、http
- 比较运算符:> < == >= <= !=
- 逻辑运算符:and、or、not、xor(有且仅有一个条件被满足)
5个核心元素可以自由组合,比如:
- ip.addr == 192.168.32.121:显示IP地址为 192.168.32.121 的数据包
- tcp.port == 80 :显示端口为 80 的数据包
(1)比较操作符
比较操作符有== 等于、!= 不等于、> 大于、< 小于、>= 大于等于、<=小于等于。
(2)协议过滤
比较简单,直接在Filter框中直接输入协议名即可。注意:协议名称需要输入小写。
tcp,只显示TCP协议的数据包列表
http,只查看HTTP协议的数据包列表
icmp,只显示ICMP协议的数据包列表
(3) ip过滤
ip.src ==192.168.1.104 显示源地址为192.168.1.104的数据包列表
ip.dst==192.168.1.104, 显示目标地址为192.168.1.104的数据包列表
ip.addr == 192.168.1.104 显示源IP地址或目标IP地址为192.168.1.104的数据包列表
(4)端口过滤
tcp.port ==80, 显示源主机或者目的主机端口为80的数据包列表。
tcp.srcport == 80, 只显示TCP协议的源主机端口为80的数据包列表。
tcp.dstport == 80,只显示TCP协议的目的主机端口为80的数据包列表。
(5) Http模式过滤
http.request.method==“GET”, 只显示HTTP GET方法的。
(6)逻辑运算符为 and/or/not
过滤多个条件组合时,使用and/or。比如获取IP地址为192.168.1.104的ICMP数据包表达式为ip.addr == 192.168.1.104 and icmp
(7)按照数据包内容过滤
假设我要以IMCP层中的内容进行过滤,
步骤一:可以单击选中界面中的码流,在下方进行选中数据。如下
步骤二:右键单击选中后出现如下界面
步骤三:选中Select后在过滤器中显示如下
步骤四:后面条件表达式就需要自己填写
如下我想过滤出data数据包中包含"abcd"内容的数据流。包含的关键词是contains 后面跟上内容。
2)使用方式
在过滤栏输入过滤语句,修改后立即生效。
提示:过滤栏有自动纠错功能,绿色表示语法正确,红色表示语法错误。
七、TCP三次握手分析
1. TCP三次握手连接建立过程
Step1:客户端发送一个SYN=1,ACK=0标志的数据包给服务端,请求进行连接,这是第一次握手;
Step2:服务端收到请求并且允许连接的话,就会发送一个SYN=1,ACK=1标志的数据包给发送端,告诉它,可以通讯了,并且让客户端发送一个确认数据包,这是第二次握手;
Step3:服务端发送一个SYN=0,ACK=1的数据包给客户端端,告诉它连接已被确认,这就是第三次握手。TCP连接建立,开始通讯。
2. 抓包获取访问指定服务端数据包
-
Step1:启动wireshark抓包,打开浏览器输入www.huawei.com。
-
Step2:使用ping www.huawei.com获取IP。
-
Step3:输入过滤条件获取待分析数据包列表 ip.addr == 211.162.2.183
图中可以看到wireshark截获到了三次握手的三个数据包。第四个包才是HTTP的, 这说明HTTP的确是使用TCP建立连接的。
第一次握手数据包
客户端发送一个TCP,标志位为SYN,序列号为0, 代表客户端请求建立连接。 如下图。
数据包的关键属性如下:
-
SYN :标志位,表示请求建立连接
-
Seq = 0 :初始建立连接值为0,数据包的相对序列号从0开始,表示当前还没有发送数据
-
Ack =0:初始建立连接值为0,已经收到包的数量,表示当前没有接收到数据
第二次握手的数据包
服务器发回确认包, 标志位为 SYN,ACK. 将确认序号(Acknowledgement Number)设置为客户的I S N加1以.即0+1=1, 如下图
数据包的关键属性如下:
- SYN + ACK: 标志位,同意建立连接,并回送SYN+ACK
- Seq = 0 :初始建立值为0,表示当前还没有发送数据
- Ack = 1:表示当前端成功接收的数据位数,虽然客户端没有发送任何有效数据,确认号还是被加1,因为包含SYN或FIN标志位。(并不会对有效数据的计数产生影响,因为含有SYN或FIN标志位的包并不携带有效数据)
第三次握手的数据包
客户端再次发送确认包(ACK) SYN标志位为0,ACK标志位为1.并且把服务器发来ACK的序号字段+1,放在确定字段中发送给对方.并且在数据段放写ISN的+1, 如下图:
数据包的关键属性如下:
-
ACK :标志位,表示已经收到记录
-
Seq = 1 :表示当前已经发送1个数据
-
Ack = 1 :
表示当前端成功接收的数据位数,虽然服务端没有发送任何有效数据,确认号还是被加1,因为包含SYN或FIN标志位(并不会对有效数据的计数产生影响,因为含有SYN或FIN标志位的包并不携带有效数据)。
就这样通过了TCP三次握手,建立了连接。开始进行数据交互
数据交互过程的数据包
下面针对数据交互过程的数据包进行一些说明:
数据包的关键属性说明
-
Seq: 1
-
Ack: 1: 说明现在共收到1字节数据
-
Seq: 1
-
Ack: 951: 说明现在服务端共收到951字节数据
在TCP层,有个FLAGS字段,这个字段有以下几个标识:SYN, FIN, ACK, PSH, RST, URG。如下
其中,对于我们日常的分析有用的就是前面的五个字段。它们的含义是:SYN表示建立连接,FIN表示关闭连接,ACK表示响应,PSH表示有DATA数据传输,RST表示连接重置
八、TCP四次挥手分析
第一次挥手:
客户端进程发出释放报文,并且停止发送数据。释放数据报文首部之后,向服务端发送FIN包到服务器,并进入FIN_WAIT_1状态,即半关闭状态,等待服务器确认,但这个时候客户端仍然可以收到服务端发送过来的数据,只是停止自己这边发送给服务器数据。
第二次挥手
服务器收到FIN包之后,确认了客户端想要释放连接,随后服务器端会发送一个ACK包给客户端确认自己收到了此次客户端的FIN包,并随之进入了CLOSE_WAIT状态。客户端收到了服务端发来的ACK确认报文之后就会进入FIN_WAIT_2状态。
第三次挥手
服务器端发送ACK确认报文之后,经过CLOSE_WAIT阶段之后,做好了释放服务器端到客户端的连接准备,再次向客户端发送一个FIN报文。随后服务器端结束CLOSE_WAIT阶段,进入了LAST_ACK状态。
第四次挥手
客户端收到了服务器端发出的FIN报文,确认了服务器端已经做好释放连接的准备,向服务器端发送确认报文将ACK置为1之后进入TIME_WAIT阶段。
客户端在TIME_WAIT阶段之后经过2MSL时间段之后就进入了CLOSED阶段,服务器端在收到了客户端发送来的ACK确认报文段之后也进入了CLOSED阶段。
为什么要客户端要等待2MSL呢?为的是:
- 为了保证客户端发送的最后一个ACK报文段能够到达服务端。
- 确保由于网络堵塞等原因迟到且客户端重发的消息在本次连接中作废掉,而不会进入下一次连接中。
当客户端发出最后的ACK确认报文时,并不能确定服务器端能够收到该段报文。所以客户端在发送完ACK确认报文之后,会设置一个时长为2MSL的计时器。MSL指的是Maximum Segment Lifetime:一段TCP报文在传输过程中的最大生命周期。2MSL即是服务器端发出为FIN报文和客户端发出的ACK确认报文所能保持有效的最大时长。
服务器端在1MSL内没有收到客户端发出的ACK确认报文,就会再次向客户端发出FIN报文;
如果客户端在2MSL(Maximum Segment Lifetime 最长报文段寿命)内,再次收到了来自服务器端的FIN报文,说明服务器端由于各种原因没有接收到客户端发出的ACK确认报文。客户端再次向服务器端发出ACK确认报文,计时器重置,重新开始2MSL的计时;否则客户端在2MSL内没有再次收到来自服务器端的FIN报文,说明服务器端正常接收了ACK确认报文,客户端可以进入CLOSED阶段,完成“四次挥手”。
所以,客户端要经历时长为2SML的TIME-WAIT阶段;这也是为什么客户端比服务器端晚进入CLOSED阶段的原因