主要内容:
5.1 WireShark 简介和抓包原理及过程
5.2 实战:WireShark 抓包及快速定位数据包技巧
5.3 实战:使用WireShark 对常用协议抓包并分析原理
5.4 实战:WireShark 抓包解决服务器被黑上不了网
5.1 WireShark 简介和抓包原理及过程
5.1.1 WireShark 简介
Wireshark 是一个网络封包分析软件。网络封包分析软件的功能是撷取网络封包,并尽可能显示出最为详细的网络封包资料。Wireshark使用WinPCAP作为接口,直接与网卡进行数据报文交换。
Wireshark 官网:https://www.wireshark.org/
5.1.2 WireShark 的应用
网络管理员使用Wireshark 来检测网络问题,网络安全工程师使用Wireshark 来检查资讯安全相关问题,开发者使用Wireshark 来为新的通讯协定除错,普通使用者使用Wireshark 来学习网络协定的相关知识。当然,有的人也会“居心叵测”的用它来寻找一些敏感信息……
5.1.3 WireShark 快速分析数据包技巧
(1) 确定Wireshark 的物理位置。如果没有一个正确的位置,启动Wireshark 后会花费很长的时间捕获一些与自己无关的数据。
(2) 选择捕获接口。一般都是选择连接到Internet网络的接口,这样才可以捕获到与网络相关的数据。否则,捕获到的其它数据对自己也没有任何帮助。
(3) 使用捕获过滤器。通过设置捕获过滤器,可以避免产生过大的捕获数据。这样用户在分析数据时,也不会受其它数据干扰。而且,还可以为用户节约大量的时间。
(4) 使用显示过滤器。通常使用捕获过滤器过滤后的数据,往往还是很复杂。为了使过滤的数据包再更细致,此时使用显示过滤器进行过滤。
(5) 使用着色规则。通常使用显示过滤器过滤后的数据,都是有用的数据包。如果想更加突出的显示某个会话,可以使用着色规则高亮显示。
(6) 构建图表。如果用户想要更明显的看出一个网络中数据的变化情况,使用图表的形式可以很方便的展现数据分布情况。
(7) 重组数据。当传输较大的图片或文件时,需要将信息分布在多个数据包中。这时候就需要使用重组数据的方法来抓取完整的数据。Wireshark 的重组功能,可以重组一个会话中不同数据包的信息,或者是重组一个完整的图片或文件。
5.2 实战:WireShark 抓包及快速定位数据包技巧
5.2.1 常见协议包
主要分析以下几种协议类型。
ARP 协议
ICMP 协议
TCP 协议
UDP 协议
DNS 协议
HTTP 协议
5.2.2 使用WireShark 进行抓包
启动WireShark
选择我们的网卡
**双击网卡之后就会自动进行抓包
5.2.3 混杂模式介绍
1、混杂模式概述:混杂模式就是接收所有经过网卡的数据包,包括不是发给本机的包,即不验证MAC 地址。普通模式下网卡只接收发给本机的包(包括广播包)传递给上层程序,其它的包一律丢弃。
一般来说,混杂模式不会影响网卡的正常工作,多在网络监听工具上使用。
2、关闭和开启混杂模式方法
关闭和开启混杂模式前,需要停止当前抓包。如下,停止捕获。
**在程序的工具栏中点击“ 捕获 ”—-》“ 选项 ”
在选项设置界面中的“ 输出 ”设置栏的左下方勾选“ 在所有接口上使用混杂模式 ”
这样就开启了。默认就是开启混杂模式。
5.2.4 WireShark 的过滤器使用
我们开启混淆模式来做一下感受,我们再次捕获—-在所有接口上使用混杂模式就可以直接进行抓包
**下面我们打开浏览器访问以下百度。
访问完成后点击停止抓包即可,我们不需要抓太多的数据包。
我们可以看到有很多数据包但是我们怎么才能找到对应的数据包类型呢?
**这里就是我们的过滤器,我们可以根据自己的条件筛选自己想要的数据包。
注意:筛选条件我们都使用小写就好了,大写的话会不识别。
例1:使用过滤器筛选TCP 的数据包
例2:使用过滤器筛选arp 的数据包
例3:使用过滤器筛选udp 的数据包
我们使用过滤器输入“udp”以筛选出 udp 报文。但是为什么输入udp 之后出现那么多种协议呢?原因就是oicq 以及dns 都是基于udp 的传输层之上的协议
扩展:客户端向DNS 服务器查询域名,一般返回的内容都不超过512 字节,用UDP 传输即可。不用经过三次握手,这样DNS 服务器负载更低,响应更快。理论上说,客户端也可以指定向DNS 服务器查询时用TCP,但事实上,很多DNS 服务器进行配置的时候,仅支持UDP 查询包。
例4:使用过滤器筛选http 的数据包
例5:使用过滤器筛选dns 的数据包
其实我们不仅可以对协议类型进行筛选,我们还有跟多的筛选条件,比如源地址目的地址等等。。。
例6:筛选源地址是192.168.1.33 或目的地址是192.168.1.1
在终端ping 192.168.1.1
然后修改筛选器条件为:
ip.src_host == 192.168.1.33 or ip.dst_host == 192.168.1.1
这个判断条件是什么意思呢?
**
ip.src_host == 192.168.1.33 表示源IP 地址
ip.dst_host == 192.168.1.1 表示目的地址
我们中间用or 进行了拼接,表示或当然我们也可以使用and 表示与,or 表示满足左右其中一个条件就会显示符合条件的数据包,and 表示左右2 个条件都满足才会显示。
or
and
我们可以很直观的看到结果的不同。
5.3 实战:使用WireShark 对常用协议抓包并分析原理
5.3.1 常用协议分析-ARP 协议
地址解析协议(英语:Address Resolution Protocol,缩写:ARP)是一个通过解析网络层地址来找寻数据链路层地址的网络传输协议,它在IPv4 中极其重要。ARP 是通过网络地址来定位MAC 地址。
开始抓包—-过滤arp
我们使用nmap 来基于ARP 协议进行扫描
┌──(root xuegod53)-[~]
└─# nmap -sn 192.168.1.1
我们看一下我们抓取到的数据包
分析第一个请求包
查看Address Resolution Protocol (request) ARP 请求包内容:
Address Resolution Protocol (request) #ARP 地址解析协议request 表示请求包
Hardware type: Ethernet (1) #硬件类型
Protocol type: IPv4 ( 0x0800 ) #协议类型
Hardware size: 6 #硬件地址
Protocol size: 4 #协议长度
Opcode:_ request ( 1 ) #操作码,该值为 1 表示 ARP 请求包
Sender MAC address: VMware_b9:3a:6a (00:0c:29:b9:3a:6a) # 源MAC 地址
Sender IP address: 192.168.1.33 #源 IP 地址
Target MAC address: 00:00:00_00:00:00 (00:00:00:00:00:00) # 目标MAC 地址
Target IP address: 192.168.1.1 #目标IP 地址
分析第二个数据包ARP 的应答数据包
查看:Address Resolution Protocol (reply) ARP 地址解析协议
Address Resolution Protocol (reply) #ARP 地址解析协议reply 表示回复包
Hardware type: Ethernet (1) #硬件类型
Protocol type: IPv4 ( 0x0800 ) #协议类型
Hardware size: 6 #硬件地址
Protocol size: 4 #协议长度
Opcode:_ reply ( 2 ) #操作码,该值为2 表示ARP 回复包
Sender MAC address: HuaweiTe_f3:22:56 (38:88:1e:f3:22:56) # 源MAC 地址
Sender IP address: 192.168.1.1 #源IP 地址
Target MAC address: VMware_b9:3a:6a (00:0c:29:b9:3a:6a) # 目标MAC 地址
Target IP address: 192.168.1.33 #目标IP 地址
总结:我们可以看到到应答包补全了自己的MAC 地址,目的地址和源地址做了替换我们再来看两个数据包的请求和过程
192.168.1.33 广播:谁有192.168.1.1 的MAC 地址?
192.168.1.1 应答:192.168.1.1 的MAC 地址是xxxxxxxxxxx
很有趣的一个过程不是吗?
5.3.2 常用协议分析-ICMP 协议
我们把之前的数据包清空掉然后筛选ICMP 协议的数据包
打开一个终端
┌──(root㉿kali)-[~]
└─# ping 12306.cn -c 1
我们只发送一个ping 包,方便我们分析发送完之后停止抓包即可。
我们先看请求包的内容我们可以看到这是个4 层的协议包
下面我们开始分析ICMP 协议包:
ICMP 协议分析请求包
ICMP 协议分析应答包
工作过程:
本机发送一个ICMP Echo Request 的包
接收方返回一个ICMP Echo Reply,包含了接受到数据拷贝和一些其他指令
5.3.3 常用协议分析-TCP 协议
首先是清空数据包然后筛选tcp 开始抓包
我们模拟一下tcp 会话建立,那最简单的方式是什么呢?
我们通过Xshell 远程连接Kali Linux 就会捕获到完整的TCP3 次握手的链接。
抓完数据包之后我们就停止抓包,接下来我们开始分析TCP 的数据包
TCP 协议最核心的概念无非就是3 次握手4 次断开,我们先讲TCP 的3 次握手
查看TCP 协议:
我们先来看第一个数据包SYN 数据包
下面这样图是打开标志位的详细信息
我们从以上信息就可以看出这是一个SYN 数据包,SYN=1 表示发送一个链接请求。这时Seq 和ACK 都是0
我们分析第二个数据包
Flags 位信息
我们可以看到服务端收到SYN 连接请求返回的数据包SYN=1,ACK=1 表示回应第一个SYN 数据包。
我们看第三个数据包
到这里三次握手过程就结束了。
我们生成一个图表来观察数据交互的过程
点击显示过滤器
前面3 个就是TCP 建立链接的过程,后面的就是相互通信的过程了这个时候seq 就会根据数据包的大小改变。
我们清空一下数据包来看一下断开链接是一个什么样的过程.
我们在Xshell 窗口中输入exit 退出
我们重新到WireShark 生成图标
我们分析一下过程,我们在终端输入EXIT 实际上是在我们Kali 上执行的命令,表示我们SSHD 的Server 端向客户端发起关闭链接请求。
第一次挥手:服务端发送一个[FIN+ACK],表示自己没有数据要发送了,想断开连接,并进入FIN_WAIT_1 状态
第二次挥手:客户端收到FIN 后,知道不会再有数据从服务端传来,发送ACK 进行确认,确认序号为收到序号+1(与SYN 相同,一个FIN 占用一个序号),客户端进入CLOSE_WAIT 状态。
第三次挥手:客户端发送[FIN+ACK] 给对方,表示自己没有数据要发送了,客户端进入LAST_ACK 状态,然后直接断开TCP 会话的连接,释放相应的资源。
第四次挥手:服务户端收到了客户端的FIN 信令后,进入TIMED_WAIT 状态,并发送ACK 确认消息。服务端在TIMED_WAIT 状态下,等待一段时间,没有数据到来,就认为对面已经收到了自己发送的ACK 并正确关闭了进入CLOSE 状态,自己也断开了TCP 连接,释放所有资源。当客户端收到服务端的ACK 回应后,会进入CLOSE 状态并关闭本端的会话接口,释放相应资源。
5.3.4 常用协议分析-HTTP 协议
我们还是筛选TCP 协议因为HTTP 是TCP 的上层协议,所以我们过滤TCP 的数据会包含HTTP 协议的数据包
我们打开一个终端输入下面命令。
┌──(root㉿kali)-[~]
└─# curl -I baidu.com
curl 是一个在命令行下工作的文件传输工具,我们这里用来发送http 请求
-I 大写的i 表示仅返回头部信息。
我们可以看到我们抓到了TCP 的3 次握手4 次断开
第4 个和第6 个是我们的HTTP 数据包
第一步:我们我们发送了一个HTTP 的HEAD 请求
第二步:服务器收到我们的请求返回了一个Seq/ACK 进行确认
第三步:服务器将HTTP 的头部信息返回给我们客户端状态码为200 表示页面正常
第四步:客户端收到服务器返回的头部信息向服务器发送Seq/ACK 进行确认
发送完成之后客户端就会发送FIN/ACK 来进行关闭链接的请求。
5.4 实战:WireShark 抓包解决服务器被黑上不了网
场景:服务器被黑上不了网,可以ping 通网关,但是不能上网。模拟场景
修改主机TTL 值为1,下面的方式是我们临时修改内核参数。
┌──(root㉿kali)-[~]
└─# echo “1” > /proc/sys/net/ipv4/ip_default_ttl
拓展:
TTL :数据报文的生存周期。
默认linux 操作系统值:64,每经过一个路由节点,TTL 值减1。TTL 值为0 时,说明目标地址不可达并返回:Time to live exceeded
作用:防止数据包,无限制在公网中转发。我们测试结果
└─# ping 192.168.1.1 -c 1
└─# ping baidu.com -c 1
我们可以看到提示我们Time to live exceeded 这表示超过生存时间,
我们判断和目标之间经过多少个网络设备是根据目标返回给我们的TTL 值来判断的,因为我们发送的数据包是看不到的。
下面我们来实战抓包分析数据包
开启抓包,过滤icmp 协议
└─# ping baidu.com -c 1
然后回到WireShark 中查看数据包
由于图片较长下面给大家截取重要部分的信息提示截图的是info 字段内容
我们可以看到第一个包是发送了一个ping 请求包ttl=1
然后呢我们收到了192.168.1.1 返回给我们的数据包告诉我们超过数据包生存时间,数据包被丢弃。
那我们把TTL 值修改成2 会有什么效果呢?
└─# echo “2” > /proc/sys/net/ipv4/ip_default_ttl
└─# ping baidu.com -c 1
我们对比数据包发现返回我们数据包被丢弃的源地址变成了112.103.140.1,这证明了数据包在网络中已经到达了下一个网络设备才被丢弃,由此我们还判断出我们的运营商网关地址为112.103.140.1 但是我们并没有到达目标主机。
我们恢复系统内核参数
└─# echo “64” > /proc/sys/net/ipv4/ip_default_ttl
└─# ping baidu.com -c 1
目标返回给我们的TTL 值为54,这表示我们的TTL 值需要大于64-54=10 才可以访问baidu.com
MTR 可以检测我们到达目标网络之间的所有网络设备的网络质量,
默认系统是没有安装MTR 工具的我们手动安装一下
└─# apt install -y mtr
例:检测到达baidu.com 所有节点的通信质量
└─# mtr baidu.com
我们可以看到从我当前主机到目标主机之间经过12 跳。