WireShark抓包使用

一、WireShark简介

1、什么是WireShark?

​ Wireshark是一款最流行和强大的开源数据包抓包与分析工具,可以截取各种网络数据包,并可以查看网络数据包详细信息。

2、WireShark的用途

​ 该软件在网络安全与取证分析中起到了很大作用,作为一款网络数据嗅探与协议分析器,已经成为网络运行管理、网络故障诊断、网络应用开发与调试的必用工具。

二、WireShark的基础使用

使用须知

​ 1、wireshark能获取HTTP,也能获取HTTPS,但是不能解密HTTPS,所以wireshark看不懂HTTPS中的内容。

​ 2、使用wireshark的人必须了解网络协议,否则就看不懂wireshark了。

​ 3、wireshark是捕获机器上的某一块网卡的网络包,当你的机器上有多块网卡的时候,你需要选择一个网卡。

​ 4、wireshark的窗口介绍 在这里插入图片描述

数据包列表(Packlist List)

No :数据包的序列号
Time:数据抓取的时间
Source:源地址
Destination:目的地址
Protocol: 协议
Length:包长度
Info:数据包内容

我们可以选中数据包,右键追踪流 在这里插入图片描述 追踪流查看详细信息:

这样就可以比较清晰的看到一个数据流过程。还可以看到自己的cookie,host,浏览器信息,等http数据包的详细内容。 在这里插入图片描述 数据包细节(Packet Details): 在这里插入图片描述 5、着色规则:

​ 数据包列表区中不同的协议使用了不同的颜色区分。协议颜色标识定位在菜单栏【视图】–>【着色规则】。如下所示,可快速根据着色规则,筛选需要的数据:

可以粗略地看到,黑色背景代表报文的各类错误,红色背景代表各类异常情景,其它颜色代表正常。 在这里插入图片描述

Bad TCP:tcp.analysis.flags && !tcp.analysis.window_update
即TCP解析出错,通常重传,乱序,丢包,重复响应都在此条规则的范围内。

HSRP State Change:hsrp.state != 8 && hsrp.state != 16
HSRP即热备份路由协议(Hot Standby Router Protocol),这条规则表示状态非active和standby。

Spanning Tree Topology  Change:stp.type == 0x80
生成树协议的状态标记为0x80,生成树拓扑发生变化。

OSPF State Change:ospf.msg != 1
OSPF(Open Shortest Path First,开放式最短路径优先协议)的msg类型不是hello。

ICMP errors:icmp.type eq 3 || icmp.type eq 4 || icmp.type eq 5 || icmp.type eq 11 || icmpv6.type eq 1 || icmpv6.type eq 2 || icmpv6.type eq 3 || icmpv6.type eq 4
ICMP协议错误,协议的type字段值错误。

ARP:arp【即ARP协议】

ICMP:icmp || icmpv6【即icmp协议】

TCP RST:tcp.flags.reset eq 1【TCP流被RESET。】

SCTP ABORT:sctp.chunk_type eq ABORT【串流控制协议的chunk_type为ABORT(6)】

TTL low or unexpected:( ! ip.dst == 224.0.0.0/4 && ip.ttl < 5 && !pim) || (ip.dst == 224.0.0.0/24 && ip.dst != 224.0.0.251 && ip.ttl != 1 && !(vrrp || carp))【TTL异常。】

Checksum Errors:eth.fcs_bad==1 || ip.checksum_bad==1 || tcp.checksum_bad==1 || udp.checksum_bad==1 || sctp.checksum_bad==1 || mstp.checksum_bad==1 || cdp.checksum_bad==1 || edp.checksum_bad==1 || wlan.fcs_bad==1
【条件中的各类协议的checksum异常,在PC上抓包时网卡的一些设置经常会使Wireshark显示此错误。】

SMB:smb || nbss || nbns || nbipx || ipxsap || netbios【Server Message Block类协议。】

HTTP:http || tcp.port == 80 || http2【HTTP协议,这是很简陋的识别方法。】

IPX:ipx || spx【互联网络数据包交换(Internet work Packet Exchange)类协议。】

DCERPC:dcerpc【即DCE/RPC,分散式运算环境/远端过程调用(Distributed Computing Environment / Remote Procedure Calls)协议。】

Routing:hsrp || eigrp || ospf || bgp || cdp || vrrp || carp || gvrp || igmp || ismp【路由类协议。】

TCP SYN/FIN:tcp.flags & 0x02 || tcp.flags.fin == 1【TCP连接的起始和关闭。】

TCP:tcp【TCP协议。】

UDP:udp【UDP协议。】

Broadcast:eth[0] & 1【广播数据。】


​ 6、显示过滤器:用于设置过滤条件进行数据包列表的过滤,菜单路径:【分析】->Display Filters 在这里插入图片描述 7、数据列表区:显示捕获到的数据包,每个数据包包含编号,时间戳,源地址,目标地址,协议,长度,以及数据包信息,不同协议的数据包使用不同的颜色区分显示 在这里插入图片描述 8、数据详细区:在数据列表中显示指定的数据包,在数据包详细信息中会显示数据包的所有详细信息内容,数据包详细信息面板是最重要的,用来查看协议中的每一个字段,各行信息分别为

(1)Frame:物理层的数据帧情况 在这里插入图片描述 (2)Ethernet II:数据链路层以太网帧头部信息 在这里插入图片描述

(3)Internet ProtocolVersion 4:互联网层ip包,头部信息 在这里插入图片描述 (4)Transmiss control Protocal:传输层的数据段,头部信息,此处是TCP 在这里插入图片描述

在TCP层,有个FLAGS字段,这个字段有以下几个标识:SYN, FIN, ACK, PSH, RST, URG。对于我们日常的分析有用的就是前面的五个字段。它们的含义是:SYN表示建立连接,FIN表示关闭连接,ACK表示响应,PSH表示有DATA数据传输,RST表示连接重置。

(5)Hypertext Transfer Protocol:应用层的信息,此处是HTTP协议 在这里插入图片描述

如何抓包

方式一:服务器命令

​ tcpdump -i any -w test.pcap

​抓取所有网络接口数据包,并保存到当前路径的test.pcap文件中; Linux tcpdump命令用于倾倒网络传输数据; 命令格式:tcpdump -i 接口 -w 保存的路径 host 主机IP and port 端口号 -s0 -C 包大小

Linux tcpdump可以将网络中传送的数据包的“头”完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来帮助你去掉无用的信息。

-i:interface 指定tcpdump 需要监听的接口. 如果没有指定, tcpdump 会从系统接口列表中搜寻编号最小的已配置好的接口(不包括 loopback 接口).

-w: 把包数据直接写入文件而不进行分析和打印输出. 这些包数据可在随后通过-r 选项来重新读入并进行分析和打印.

-s:snaplen 设置tcpdump的数据包抓取长度为snaplen, 如果不设置默认将会是68字节.

-C:file-size (nt: 此选项用于配合-w file 选项使用) 该选项使得tcpdump 在把原始数据包直接保存到文件中之前, 检查此文件大小是否超过file-size. 如果超过了, 将关闭此文件,另创一个文件继续用于原始数据包的记录. 新创建的文件名与-w 选项指定的文件名一致, 但文件名后多了一个数字.该数字会从1开始随着新创建文件的增多而增加.

方式二:wireShark工具抓包

1、截取准备:打开wireshark工具,选择菜单栏上【捕获】->【选项】->选择对应网卡或所有网卡->【开始】(如果捕获选项列表为空,【捕获】->【刷新接口列表】)

如下图: 在这里插入图片描述 2、开始,以及停止抓包

抓取的文件可在导航栏【文件】->【保存】或直接进行分析 在这里插入图片描述

如何根据抓取的包进行分析

​ 将抓取的包直接通过WireShark工具打开,打开如下;

分析之前先了解下wireshark的功能菜单;过滤器和着色规则筛选我们需要的内容 在这里插入图片描述

1.SYN,FIN会消耗一个序号,单独的ACK不消耗序号

2、WIN表示可以接收数据的滑动窗口(接收缓冲区)是多少,如果A发到B的包的win为0,就是A告诉B说我现在滑动窗口为0了,饱了,你不要再发给我了,就说明A端环境有压力

3、ACK可以理解为应答。A发给B的ack是告诉B,我已收到你发的数据包,收到ack号这里了,你下次要发seq为ack号的给我

4、连续传输的时候,且无乱序,无丢包的情况下:上一个包的seq + len = 下一个包的 seq,如:

场景一:零窗口win=0

在这里插入图片描述 TCP零窗口是指机器中的窗口大小在指定的时间内保持为零的时间,这意味着客户端此时无法接收更多信息,并且TCP传输将暂停,直到它可以处理其接收缓冲区中的信息。

1、作为接收方,有接收窗口,也就是接收缓冲区,win=xxx 告诉对方,我的接收窗口大小。

2、当我的接收窗口满了,也就是win=0,Wireshark显示【TCP ZeroWindow】,这个时候,对方不能再发送数据。

3、作为发送方,有发送窗口,发送窗口可以理解为,一口气可以发送多少数据。发送窗口不光要考虑对方的接收窗口,还要考虑网络情况,也就是拥塞窗口,等于它们的最小值。

零窗口故障排除由于这样或那样的原因,提示零窗口的机器将不再从主机接收任何数据。可能是机器当时正在运行太多进程,并且其处理器是最大的。或者可能是TCP接收器中存在错误,例如Windows注册表配置错误。尝试确定TCP零窗口发生时客户端正在做什么。

场景二:TCP的三次握手

Wireshark抓包分析TCP三次握手 (1)TCP三次握手连接建立过程 Step1:客户端发送一个SYN=1,ACK=0标志的数据包给服务端,请求进行连接,这是第一次握手; Step2:服务端收到请求并且允许连接的话,就会发送一个SYN=1,ACK=1标志的数据包给发送端,告诉它,可以通讯了,并且让客户端发送一个确认数据包,这是第二次握手; Step3:服务端发送一个SYN=0,ACK=1的数据包给客户端端,告诉它连接已被确认,这就是第三次握手。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三次握手,建立了连接。开始进行数据交互。

三、WireShark的过滤器的使用

1、过滤器的使用

​ 在刚使用wireshark时,可能会得到大量的冗余数据包列表,以致于很难找到自己想要抓取的数据包部分。

​ wireshark自带了两种类型的过滤器,熟练使用这两种过滤器能够帮助我们在大量的数据中迅速找到我们需要的信息。

方式一、捕获过滤器

用于抓取数据包之前设置:【捕获】->【Display Filters】 在这里插入图片描述 捕获过滤器的使用:捕获主机ip为172.23.22.86的tcp数据包 在这里插入图片描述 捕获结果如下: 在这里插入图片描述

方式二、显示过滤器

菜单栏:【分析】->【Display Filters】

显示过滤器是用于在抓取数据包后设置过滤条件进行过滤数据包。通常是在抓取数据包时设置条件相对宽泛,抓取的数据包内容较多时使用显示过滤器设置条件顾虑以方便分析,如下 在这里插入图片描述

2、wireshark过滤器表达式的规则

1、协议过滤

比如TCP只显示TCP协议,

2、IP过滤

​	比如ip.src==172.23.22.86显示源地址为172.23.22.86

​	ip.dst==172.23.28.240显示目标地址为172.23.28.240

​	ip.addr==172.23.28.240显示ip地址为172.23.28.240的数据包

3、端口过滤

​	tcp.port==8081,端口为8081的

​	tcp.srcport==8081,只显示TCP协议的源端口为8081的

4、Http模式过滤

​	http.request.method=="GET",只显示HTTP GET方法的

5、逻辑运算符为AND/OR

!tcp:显示非tcp协议的数据包

常用过滤表达式:

过滤表达式:多个过滤器之间用and、or、xor、not合并成一个语句

过滤表达式用途
http只查看http协议
ip.src == 172.23.22.86 or ip.dst == 172.23.22.86源地址或者目标地址是172.23.22.86
ip.addr == 172.23.28.240 and tcp.port == 6789ip为172.23.28.240且端口号为6789的数据包
frame.len<=150小余等于150长度的数据包
tcp.flags.syn==1具有SYN标志位的TCP数据包
tcp/flags.rst==1具有RST标志位的TCP数据包

可以使用6种比较运算符

英文写法C语言写法含义
eq==等于
ne!=不等于
gt>大于
lt<小于
ge>=大于等于
le<=小于等于

Logical expressions(逻辑运算符)

英文写法C语言写法含义
and&&逻辑与
or||逻辑或
xor^^逻辑异或
not!逻辑非