WireShark 抓包入门

这里我们通过一些简单的实验来进行 WireShark 的使用来介绍如何进行抓包

实验目的

  1. 了解并会初步使用Wireshark,能在所用电脑上进行抓包

  2. 了解IP数据包格式,能应用该软件分析数据包格式

  3. 查看一个抓到的包的内容,并分析对应的IP数据包格式

WireShark 简介

Wireshark是使用最广泛的一款开源抓包软件,常用来检测网络问题、攻击溯源、或者分析底层通信机制。它使用WinPCAP作为接口,直接与网卡进行数据报文交换

Wireshark抓包原理

Wireshark 使用的环境大致分为两种,一种是电脑直连互联网的单机环境,另外一种就是应用比较多的互联网环境,也就是连接交换机的情况:

单机情况下,Wireshark 直接抓取本机网卡的网络流量;

交换机情况下,Wireshark 通过端口镜像、ARP 欺骗等方式获取局域网中的网络流量

端口镜像:利用交换机的接口,将局域网的网络流量转发到指定电脑的网卡上

ARP欺骗:交换机根据MAC地址转发数据,伪装其他终端的MAC地址,从而获取局域网的网络流量

WireShark 如何使用

界面介绍

首先我们打开 WireShark 我们会进入到网卡选择界面:

这里我们使用的是 WIFI ,所以我们选择 WLAN ,双击后进入界面如下:

我们可以对抓包的数据进行保存

然后我们需要熟悉整个界面到底包含了哪些数据:

基础操作

调整界面大小

工具栏中有三个放大镜图标,从左到右分别是:放大、缩小、恢复默认设置

添加、隐藏与删除显示列

我们首先右键点击数据包详情的任意一条,然后可以选择应用为列,这样会我们就能在数据包列表中看到每个数据包的对应属性的相关数据

我们右键点击数据包列表的属性标题行,可以看到所有的列都显示在上面,点击取消勾选即可隐藏,我们也可以选中一个固定的列,点击 Remove 可以列删除掉,不再显示

注意:隐藏字段时,在列名栏的任意位置右键即可;而删除字段时,需要在指定的列名位置右键,以防误删。

设置时间

数据包列表栏的时间这一列,默认显示格式看起来很不方便,我们可以调整时间的显示格式,点击工具栏的「视图」,选择「时间显示格式」,设置你喜欢的格式

标记与导出数据包

对于某些比较重要的数据包,可以设置成高亮显示,以达到标记的目的。选中需要标记的数据包,右键选择最上面的标记/取消标记

选中数据包,按 Ctrl + M 也可以实现同样的效果,按两次可以取消标记

对于单个数据包导出:

选中数据包,点击左上角的文件,点击导出特定分组

在导出分组界面,选择第二个 Selected packets only,只保存选中的数据包

对于导出多个数据包:

有时候我们需要导出多个数据包,Wireshark有一个导出标记的数据包的功能,我们将需要导出的数据包都标记起来,就可以同时导出多个数据包。点击左上角的文件,点击导出特定分组:

注意:只有停止监听之后才能够进行导出数据包

开启混杂模式

局域网的所有流量都会发送给我们的电脑,默认情况下,我们的电脑只会对自己mac的流量进行解包,而丢弃其他mac的数据包。开启混杂模式后,我们就可以解析其他mac的数据包,因此,我们使用Wireshark时,通常都会开启混杂模式。点击菜单栏的捕获按钮,点击选项

勾选 在所有接口上使用混杂模式

过滤器操作

过滤器是 Wireshark 的核心功能,也是我们平时使用最多的一个功能

Wireshark 提供了两个过滤器:抓包过滤器 和 显示过滤器。两个过滤器的过滤思路不同

抓包过滤器:重点在动作,需要的包我才抓,不需要的我就不抓

显示过滤器:重点在数据的展示,包已经抓了,只是不显示出来

抓包过滤器

抓包过滤器在抓包前使用,它的过滤有一个基本的语法格式:BPF 语法格式

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 不抓取广播数据包

使用方式

使用抓包过滤器时,需要先停止抓包,设置完过滤规则后,再开始抓包。停止抓包的前提下,点击工具栏的捕获按钮,点击选项

抓包过滤器的输入框,会自动检测语法,绿色代表语法正确,红色代表语法错误

ip host www.baidu.com and icmp 表示只捕获主机IP为 www.baidu.com 的 ICMP 数据包

显示过滤器

显示过滤器是用于在抓取数据包后设置过滤条件进行过滤数据包。通常是在抓取数据包时设置条件相对宽泛,抓取的数据包内容较多时使用显示过滤器设置条件顾虑以方便分析。同样上述场景,在捕获时未设置捕获规则直接通过网卡进行抓取所有数据包

显示过滤器在抓包后或者抓包的过程中使用

语法结构

显示过滤器的语法包含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层中的内容进行过滤,可以单击选中界面中的码流,在下方进行选中数据如下:

右键单击选中后出现如下界面:

选中选中后在过滤器中显示如下:

后面条件表达式就需要自己填写。如下我想过滤出data数据包中包含”abcd”内容的数据流。包含的关键词是contains 后面跟上内容

使用方式

在过滤栏输入过滤语句,修改后立即生效。

过滤栏有自动纠错功能,绿色表示语法正确,红色表示语法错误

数据包结构

各行信息分别为

(1)Frame: 物理层的数据帧概况

(2)Ethernet II: 数据链路层以太网帧头部信息

(3)Internet Protocol Version 4: 互联网层IP包头部信息

(4)Transmission Control Protocol: 传输层T的数据段头部信息

(5)Hypertext Transfer Protocol: 应用层的信息

源端口/目的端口

端口是传输层与应用层的服务接口。用于标示和区分源端设备和目的端设备的应用进程。此次抓包的结果为源端口(source port:56274)目的端口(destination port:443)

确认号(Sequence number)

Sequence Number 这个是发送序列号,用来标识从源端向目的端发送的数据字节流,它表示在这个报文端中的第一个数据字节的顺序号,序列号是 32 位的无符号类型,序列号表达达到 2^32 – 1 后又从 0 开始,当建立一个新的连接时,SYN 标志为 1 ,系列号将由主机随机选择一个顺序号 ISN(Initial Sequence Number) 。此报文中的序列号是 1

确认号(32bit)

Acknowledgment Number 它包涵了发送确认一端所期望收到的下一个顺序号。因此确认序列号应当是上次成功接收到数据的顺序号加1。只有 ACK 标志为1时确认序号字段才有效

首部长度(Header length)

占四位,指出TCP首部共有多少4个字节,长度在20-60之间。在报文中是20字节。

URG(Urgent Pointer Field Significant):

当 URG=1 时,表面紧急指针有效。他告诉系统次报文中有紧急数据需要快速处理。在这里的报文中为零说明没有紧急报文

ACK(Acknowledgement Field Signigicant):确认号字段,该字段为1时表示应答字段有效,即 TCP 应答号将包含在 TCP 报文中。

PSH(Push Function): 推送功能,所谓推送功能指的是接收端在接收到数据后立即推送给应用程序,而不是在缓冲区中排队。

RST(Reset the connection): 重置连接。当为1时表面出现差错,必须释放连接,重新建立连接

SYN(Synchronize sequence numbers):同步序列号,用来发起一个连接请求。

FIN(No more data from sender):表示发送端发送任务已经完成。

窗口字段(16bit)

表示现在运行对方发送的数据量。也就是告诉对方,从本报文段的确认号开始允许对方发送的数据量。由报文可以看出该窗口允许发送262144([Calculated window size: 262144])的数据量。

校验和(Checksum)

占2字节。校验和字段检验的范围包括首部和数据,用于校验TCP报头部分和数据部分的正确性。(Checksum: 0xc4f9 [unverified])

UDP报文分析

Wireshark 抓包分析 TCP 三次握手

  1. TCP 三次握手连接建立过程

Step1:客户端发送一个 SYN=1,ACK=0 标志的数据包给服务端,请求进行连接,这是第一次握手

Step2:服务端收到请求并且允许连接的话,就会发送一个 SYN=1,ACK=1 标志的数据包给发送端,告诉它,可以通讯了,并且让客户端发送一个确认数据包,这是第二次握手

Step3:服务端发送一个 SYN=0,ACK=1 的数据包给客户端端,告诉它连接已被确认,这就是第三次握手。TCP 连接建立,开始通讯

  1. wireshark抓包获取访问指定服务端数据包

Step1:启动 wireshark 抓包,打开浏览器输入 www.huawei.com。

Step2:使用 ping www.huawei.com 获取 IP。

Step3:输入过滤条件获取待分析数据包列表 ip.addr == 61.161.0.140

图中可以看到 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, 如下图

数据包的关键属性如下:

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: 1136: 说明现在服务端共收到 1136 字节数据

在 TCP 层,有个 FLAGS 字段,这个字段有以下几个标识:SYN, FIN, ACK, PSH, RST, URG。如下

其中,对于我们日常的分析有用的就是前面的五个字段。它们的含义是:SYN 表示建立连接,FIN 表示关闭连接,ACK 表示响应,PSH 表示有 DATA 数据传输,RST 表示连接重置

WireShark 抓包分析

与 TCP 相比,UDP 仅有源/目的端口,长度,校验和及数据,因此不难看出 UDP 的无连接,不提供可靠性,无流量控制,传输速度快,协议开销小的特点

三次握手分析

发送连接请求,syn=1,seq=0

服务器收到请求,SYN=1 ,ACK=1,请求号seq=0 ,确认号 ack=1

客户收到确认,发送 ACK=1,确认号 ack=1,请求号 seq=1,服务器收到后建立连接

Tcp终止连接

客户发送终止请求 FIN=1 ,seq=52828。

服务器收到请求,发送 ACK=1,请求号seq=2609.确认号ack= 52829.

之后服务器再次确认,发送 FIN=1,ACK=1,seq=455395, seq=4611

客户收到确认,再发送 ACK=1,ask=455396,seq=4611

网络层协议分析

ip 的格式图:

实验步骤及结果

首先打开 WireShark ,我们能看到共有四部分在工作,有三个虚拟网卡和一个 WLAN ,所以这里可以知道我们使用的是 WIFI 连接网络:

这里双击 WLAN 进入后界面如下:

这里我们需要选择一条抓包数据进行分析,这里我们选择第一条:

下面我们进行抓包分析:

TCP 报文格式如下:

数据包内容如下:

Wireshark抓包分析:

版本号:【 Version: 4】标明了IP协议的版本号,目前为4。

头部长度:IP 报头的长度。固定部分的长度( 20 字节)和可变部分的长度之和。共占 4 位。最大为 1111 ,即 10 进制的 15,代表 IP 报头的最大长度可以为 15 个 32bits(4字节),也就是最长可为 15*4=60 字节,除去固定部分的长度 20 字节,可变部分的长度最大为 40 字节。IP 报文中 20bit 的数量【Header Length: 20 bytes (5)】

服务类型:占 8 位,用来获得更好的服务,但实际上一直没有被使用过。1998年IETF把这个字段改名为区分服务DS(Differentiated Services)。只有在使用区分服务时,这个字段才起作用。【Differentiated Services Field: 0x00 (DSCP: CS0, ECN: Not-ECT)】。

总长度:整个数据包的长度,最长可达65535字节【Total Length: 54】。

标识:IP软件在存储器中维持一个计数器,每产生一个数据报,计数器就加1,并将此值赋给标识字段。但这个“标识”并不是序号,因为IP是无连接服务,数据报不存在按序接收的问题。

【Identification: 0x30b8 (12472)】

标志(Flags):共3位。R(Reserved bit)、DF(Don’t fragment)、MF(More fragment)三位。目前只有后两位有效,DF 位:为1表示不分片,为 0 表示分片。MF:为1表示不是最后一片,还有其他分片,为 0 表示这是最后一片。

片偏移(Fragment offset):该字段是与 ip 分片后,相应的 ip 片在总的 ip 片的位置。该字段的单位是 8 字节。

生存时间(Time to live):IP 报文所允许通过的路由器的最大数量。每经过一个路由器,TTL 减 1,当为 0 时,路由器将该数据报丢弃。TTL 字段是由发送端初始设置一个 8 bit 字段.推荐的初始值由分配数字 RFC 指定。

协议(Protocol):指出 IP 报文携带的数据使用的是那种协议,以便目的主机的 IP 层能知道要将数据报上交到哪个进程(不同的协议有专门不同的进程处理)。和端口号类似,此处采用协议号,UDP 的协议号为 17。

首部校验和(Header checksum):计算 IP 头部的校验和,检查 IP 报头的完整性。这里无法校验。【Header checksum: 0x590c [validation disabled]】

源IP地址(source):标识IP数据报的源端设备,由图可知该源IP地址为 60.28.172.219。

目的IP地址(destination):标识IP数据报的目的地址,由图可知该目的IP地址为 192.168.3.7。

Icmp分析

Wireshark抓包分析(这是 ping 192.168.3.7 的抓包)

过滤器输入 ICMP(ICMP 是 ping 操作一般使用的发的数据包报文协议)

Type:8 code:0由表可知时ping请求

Checksum:校验和成功。

WireShark 抓包分析:

源mac地址:6c:6a:77:fd:a8:fe

目的mac地址: 04:79:75:8e:2f:4e

类型: Ethernet II

参考资料

  1. 第七组抓包分析

  2. Wireshark零基础使用教程(超详细)

  3. Wireshark的抓包和分析,看这篇就够了!

转自:https://blog.csdn.net/m0_59161987/article/details/128477400