网络分析工具——WireShark的使用(超详细)_世间繁华梦一出的博客-CSDN博客
WireShark介绍
WireShark是非常流行的网络封包分析工具,可以截取各种网络数据包,并显示数据包详细信息。常用于开发测试过程中各种问题定位。
:::danger
官方网址:
:::
Wireshark · Go Deep
WireShark软件安装
软件下载路径:
Wireshark · Go Deep
。按照系统版本选择下载,下载完成后,按照软件提示一路Next安装。
如果你是Win10系统,安装完成后,选择抓包但是不显示网卡,下载win10pcap兼容性安装包。下载路径:
Win10Pcap Download - WinPcap for Windows 10
Wireshark 抓包解析
先介绍一个使用wireshark工具抓取ping命令操作的示例,让读者可以先上手操作感受一下抓包的具体过程。
1、打开wireshark 2.6.5,主界面如下:
2、选择对应的网卡,右键,会出现Start Capture(开始捕获),点击即可进行捕获该网络信息,开始抓取网络包
3、执行需要抓包的操作,如ping www.baidu.com。
4、操作完成后相关数据包就抓取到了。为避免其他无用的数据包影响分析,可以通过在过滤栏设置过滤条件进行数据包列表过滤,获取结果如下。
说明:ip.addr == 180.101.50.188 and icmp 表示源主机IP或者目的主机IP为180.101.50.188的数据包。
5、wireshark抓包完成,就这么简单。关于wireshark过滤条件和如何查看数据包中的详细内容在后面介绍。
WireShark抓包界面
说明:数据包列表区中不同的协议使用了不同的颜色区分。协议颜色标识定位在菜单栏View --> Coloring Rules。如下所示
WireShark 主要分为这几个界面
1、Display Filter(显示过滤器), 用于设置过滤条件进行数据包列表过滤。菜单路径:Analyze --> Display Filters。
默认的过滤表项:2、Packet List Pane(数据包列表), 显示捕获到的数据包,每个数据包包含编号,时间截,源地址,目标地址,协议,长度,以及数据包信息。 不同协议的数据包使用了不同的颜色区分显示。
3、Packet Details Pane(数据包详细信息), 在数据包列表中选择指定数据包,在数据包详细信息中会显示数据包的所有详细信息内容。数据包详细信息面板是最重要的,用来查看协议中的每一个字段。各行信息分别为
(1)Frame: 物理层的数据帧概况
(2)Ethernet II: 数据链路层以太网帧头部信息
(3)Internet Protocol Version 4: 网络层IP包头部信息
(4)Transmission Control Protocol: 传输层的数据段头部信息,此处是TCP
(5)Hypertext Transfer Protocol: 应用层的信息,此处是HTTP协议
4、Dissector Pane(数据包字节区)
可以通过数据包字节区来确认过滤器的内容
TCP包的具体内容
从下图可以看到wireshark捕获到的TCP包中的每个字段。
Wireshark过滤器设置
初学者使用wireshark时,将会得到大量的冗余数据包列表,以至于很难找到自己自己抓取的数据包部分。wireshar工具中自带了两种类型的过滤器,学会使用这两种过滤器会帮助我们在大量的数据中迅速找到我们需要的信息。
(1)捕获过滤器
捕获过滤器的菜单栏路径为Capture --> Capture Filters。用于在抓取数据包前设置。
如何使用?可以在抓取数据包前设置如下。
Capture->Options
ip host 60.207.246.216 and icmp表示只捕获主机IP为60.207.246.216的ICMP数据包。获取结果如下:
(2)显示过滤器
显示过滤器是用于在抓取数据包后设置过滤条件进行过滤数据包。通常是在抓取数据包时设置条件相对宽泛,抓取的数据包内容较多时使用显示过滤器设置条件过滤以方便分析。同样上述场景,在捕获时未设置捕获规则直接通过网卡进行抓取所有数据包,如下
执行ping www.huawei.com获取的数据包列表如下
观察上述获取的数据包列表,含有大量的无效数据。这时可以通过设置显示器过滤条件进行提取分析信息。ip.addr == 211.162.2.183 and icmp。并进行过滤。
上述介绍了抓包过滤器和显示过滤器的基本使用方法。在组网不复杂或者流量不大情况下,使用显示器过滤器进行抓包后处理就可以满足我们使用。下面介绍一下两者间的语法以及它们的区别。
wireshark过滤器表达式的规则
捕获过滤器语法和实例
捕获过滤器类型
:::danger
Type(host、net、port)、
方向Dir(src、dst)、
协议Proto(ether、ip、tcp、udp、http、icmp、ftp等)、
逻辑运算符(&& 与、|| 或、!非)
:::
(1)协议过滤
比较简单,直接在抓包过滤框中直接输入协议名即可。
TCP,只显示TCP协议的数据包列表
HTTP,只查看HTTP协议的数据包列表
ICMP,只显示ICMP协议的数据包列表
(2)IP过滤
host 172.21.45.61
src host 172.21.45.61
dst host 172.21.45.61
(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 不抓取广播数据包
:::danger
捕获过滤器(Capture Filters):这些规则用于过滤在捕获数据包时要抓取的数据包。
- host <IP地址>:只捕获与指定 IP 地址有关的数据包。
- port <端口号>:只捕获指定端口号的数据包。
- src <IP地址>:只捕获源 IP 地址为指定地址的数据包。
- dst <IP地址>:只捕获目标 IP 地址为指定地址的数据包。
:::
显示过滤器语法和实例
(1)比较操作符
比较操作符有== 等于、!= 不等于、> 大于、< 小于、>= 大于等于、<=小于等于。
(2)协议过滤
比较简单,直接在Filter框中直接输入协议名即可。注意:协议名称需要输入小写。
tcp,只显示TCP协议的数据包列表
http,只查看HTTP协议的数据包列表
icmp,只显示ICMP协议的数据包列表
TCP过滤
tcp.flags 显示包含TCP标志的封包。
tcp.flags.syn == 0x02 显示包含TCP SYN标志的封包。
tcp.window_size == 0 && tcp.flags.reset != 1
(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方法的。
http.request.method == "POST"
http.request.uri == “/img/logo-edu.gif”
http contains “GET”
http contains “HTTP/1.”
// GET包
http.request.method == "GET" && http contains “Host: “
http.request.method == "GET" && http contains “User-Agent: “
// POST包
http.request.method == "POST" && http contains “Host: “
http.request.method == "POST" && http contains “User-Agent: “
// 响应包
http contains “HTTP/1.1 200 OK” && http contains “Content-Type: “
http contains “HTTP/1.0 200 OK” && http contains “Content-Type: “
一定包含如下
Content-Type:
(6)逻辑运算符为 and/or/not
过滤多个条件组合时,使用and/or。比如获取IP地址为192.168.1.104的ICMP数据包表达式为ip.addr == 192.168.1.104 and icmp
(7)按照数据包内容过滤
tcp[20:8]表示从20开始,取8个字符
tcp[offset,n]
udp[8:3]==81:60:03 // 偏移8个bytes,再取3个数,是否与==后面的数据相等?
udp[8:1]==32 如果我猜的没有错的话,应该是udp[offset:截取个数]=nValue
eth.addr[0:3]==00:06:5B
假设我要以IMCP层中的内容进行过滤,可以单击选中界面中的码流,在下方进行选中数据。如下选中Select后在过滤器中显示如下
后面条件表达式就需要自己填写。如下我想过滤出data数据包中包含"abcd"内容的数据流。包含的关键词是contains 后面跟上内容。
:::danger
显示过滤器(Display Filters):这些规则用于在已经捕获的数据包中进行过滤和显示。
- ip.addr == <IP地址>:只显示与指定 IP 地址有关的数据包。
- tcp.port == <端口号>:只显示指定端口号的 TCP 数据包。
- udp.port == <端口号>:只显示指定端口号的 UDP 数据包。
- http:只显示 HTTP 协议的数据包。
- dns:只显示 DNS 协议的数据包。
逻辑操作符:
-
and:逻辑与操作,连接两个条件。
-
or:逻辑或操作,指示满足其中一个条件的数据包。
-
not:逻辑非操作,用于否定条件。
:::
:::info
以下是一些示例过滤规则的用法: -
显示源 IP 地址为 192.168.1.100 的数据包:ip.src == 192.168.1.100
-
显示目标端口号为 80 或 443 的数据包:tcp.port == 80 or tcp.port == 443
-
显示源端口号不是 22(SSH)的数据包:not tcp.srcport == 22
:::
:::info
其他实例:
- 过滤MAC
eth.dst == A0:00:00:04:C5:84 // 过滤目标mac
eth.src eq A0:00:00:04:C5:84 // 过滤来源mac
eth.dstA0:00:00:04:C5:84
eth.dstA0-00-00-04-C5-84
eth.addr eq A0:00:00:04:C5:84 // 过滤来源MAC和目标MAC都等于A0:00:00:04:C5:84的
- 限制包长度
udp.length == 26 这个长度是指udp本身固定长度8加上udp下面那块数据包之和
tcp.len >= 7 指的是ip数据包(tcp下面那块数据),不包括tcp本身
ip.len == 94 除了以太网头固定长度14,其它都算是ip.len,即从ip本身到最后
frame.len == 119 整个数据包长度,从eth开始到最后
eth —> ip or arp —> tcp or udp —> data
- DHCP
注意:DHCP协议的检索规则不是dhcp/DHCP, 而是bootp
以寻找伪造DHCP服务器为例,介绍Wireshark的用法。在显示过滤器中加入过滤规则,显示所有非来自DHCP服务器并且bootp.type0x02(Offer/Ack/NAK)的信息:
**bootp.type0x02 and not ip.src==192.168.1.1**
:::
wireshark字符串过虑语法字符
-
wireshark基本的语法字符
:::danger
\d ** 0-9的数字
\D ** \d的补集(以所以字符为全集,下同),即所有非数字的字符
\w ** 单词字符,指大小写字母、0-9的数字、下划线
\W** \w的补集
\s ** 空白字符,包括换行符\n、回车符\r、\t、垂直制表符\v、换页符\f
\S** \s的补集
. 除换行符\n外的任意字符。
.* ** 匹配任意文本,不包括回车(\n)? 。 [0x00-0xff]* 匹配任意文本,包括\n
[…] ** 匹配[]内所列出的所有字符
**[^…] ** 匹配非[]内所列出的字符
::: -
定位字符 所代表的是一个虚的字符,它代表一个位置,你也可以直观地认为“定位字符”所代表的是某个字符与字符间的那个微小间隙。
:::danger
^ ** 表示其后的字符必须位于字符串的开始处
$ ** 表示其前面的字符必须位于字符串的结束处
\b 匹配一个单词的边界
**\B ** 匹配一个非单词的边界
::: -
重复描述字符
:::danger
{n} 匹配前面的字符n次
{n,} 匹配前面的字符n次或多于n次
{n,m} 匹配前面的字符n到m次
? 匹配前面的字符0或1次
+ 匹配前面的字符1次或多于1次
* 匹配前面的字符0次或式于0次
:::
WireShark抓包实例
DHCP抓包
在未连接网线之前。wireshark是没有数据的
连接网络,插上网线之后,再看wireshark的状态
下面我们来看看DHCP在连接网络后,具体做了哪些事情,详细看看分配Ip地址的过程。
由上图可以看出,DHCP只发送了2个包,DHCP Request,ACK,按道理来说应该是有4个包,这原因是因为本身电脑已经不是第一次联网了,ip地址之前已经被分配过,所以就缺少了步骤。
首先我们将目前的ip地址先Release掉,然后重新申请一下,renew。。
现在我们重新看看DHCP的抓包
Look,Look,这次被重新分配了172.21.45.254的ip地址,出现了梦寐以求的4个包,这样就和DHCP协议的书上说的对应起来了。
下面,我们再看着这张图来过一遍流程
- 先以广播的方式发送一个Discover包,来寻找服务器的位置
- DHCP服务器收到Discover报文后,就会在所配置的地址池中查找一个合适的IP地址,加上相应的租约期限和其他配置信息(如网关、DNS服务器等),构造一个Offer报文,发送给DHCP客户端,告知用户本服务器可以为其提供IP地址。
- 发送一个广播的Request请求报文,通告选择的服务器,希望获得所分配的IP地址。
- 根据Request报文中携带的用户MAC来查找有没有相应的租约记录,如果有则发送ACK应答报文,通知用户可以使用分配的IP地址。
TCP三次握手
TCP三次握手连接建立过程
- 客户端发送一个SYN=1,ACK=0标志的数据包给服务端,请求进行连接,这是第一次握手;
- 服务端收到请求并且允许连接的话,就会发送一个SYN=1,ACK=1标志的数据包给发送端,告诉它,可以通讯了,并且让客户端发送一个确认数据包,这是第二次握手;
- 服务端发送一个SYN=0,ACK=1的数据包给客户端,告诉它连接已被确认,这就是第三次握手。TCP连接建立,开始通讯。
具体的原理可以查看之前所发表的文章
- wireshark抓包获取访问指定服务端数据包
Step1:启动wireshark抓包,打开浏览器输入www.baidu.com。
Step2:使用ping www.baidu.com获取IP180.101.50.188。
- 先看第一次握手
- 第二次握手
- 第三次握手
- 发送数据
TCP四次挥手
:::danger
四次挥手可以参考:
:::
经典TCP三次握手,四次挥手_tcp syn包_牛马小风的博客-CSDN博客
- 第一次挥手
- 第二次挥手
- 第三次挥手
- 第四次挥手
:::danger
更详细参考别人的如下作品
:::
A000663_Aaron_Wu_A000664_Willow_Wang_TCPIP_Study_Report.docx
抓取ARP
- ARP的协议结构
- 查看arp缓冲表
cmd:输入 arp -a
- 选择ping 一个arp表中没有的IP,选择ping 172.21.53.40
- 过滤筛选arp,以筛选出arp报文,然后找到这个包
arp一次请求由广播的请求报文和单播的应答报文组成,所以这一组报文的源MAC地址和目的MAC地址是对调的。请求报文广播说“谁有172.21.53.40的mac地址?告诉172.21.53.14吧!”,响应的报文对请求的地址单播说“172.21.53.40的mac地址是c0:18:50:a5:39:83”
- 回到dos窗口,输入arp -a,可以看到172.21.53.40的mac地址已经记录在ARP缓存表了。