数据包抓取与分析
目录
一、实验目的
二、实验内容
三、实验环境
四、实验步骤与过程
一、实验目的
学习安装、使用协议分析软件,掌握基本的数据报捕获、过滤和协议的分析技巧,能对抓取数据包进行分析。
二、实验内容
协议分析软件的安装和使用、学会抓取数据包的方法并对对抓取数据包进行分析。
三、实验环境
使用Windows操作系统;Internet连接抓包软件Wireshark。
四、实验步骤与过程
WireShark的使用 选择接口过滤器安装Wireshark后,打开Wireshark,可以看到如图 1所示的界面,提示我们选择对应接口的过滤器,在此我选择“以太网”进行抓包
图 1 选择接口过滤器
Wireshark的界面打开Wireshark后,可以看到如图 2的界面。Wireshark的界面主要分为如下几个部分:
显示过滤器:主要用于过滤封包封包列表:显示所有捕获到的封包,有源地址和目标地址,端口号。不同的颜色代表了不同封包的类型与状态封包详细信息:显示封包中的内容以及各个字段十六进制数据:展示十六进制的封包原始数据地址栏:显示封包的统计信息与杂项
图 2 Wireshark主界面图
Wireshark过滤器
在上一节中,我们介绍了Wireshark的界面,以及各个功能,接下来着重介绍Wireshark中过滤器的功能。过滤器可以在大量的数据中快速准确的找到我们需要的信息。
图 3 捕获过滤器
过滤器主要分两种, 图 2主界面上的显示过滤器和图 3上的捕获过滤器。显示过滤器用来在已捕获的记录中显示所需要的记录。捕获过滤器主要用来过滤即将捕获的封包,以免捕获过多的记录。
图 4 显示过滤器
如图 4,显示过滤器通过过滤表达式实现过滤。具体可以通过如下几个规则进行过滤:
协议过滤:如tcp,则只显示tcp协议IP过滤:如ip.src==192.168.1.102显示源地址为192.168.1.102的封包,ip.dst== 192.168.1.102则显示目标地址为192.168.1.102的封包。端口过滤:如tcp.port ==80,只显示端口为80的tcp协议的封包,又如tcp.srcport == 80, 只显示TCP协议的源端口为80的封包Http过滤:如http.request.method=="GET", 只显示HTTP GET方法的封包。此外,还可以通过逻辑运算符or,and等组合过滤表达式,达到更复杂的过滤效果。
封包详细信息
封包详细信息是抓包过程中最重要的,它包括如下五个字段:
Frame: 物理层的数据帧概况Ethernet II: 数据链路层以太网帧头部信息Internet Protocol Version 4: 互联网层IP包头部信息Transmission Control Protocol: 传输层T的数据段头部信息,此处是TCPHypertext Transfer Protocol: 应用层的信息,此处是HTTP协议
图 5 封包详细信息
如图 5所示,可以看到某一个封包的详细信息。会显示这个封包的长度,数据链路层信息等。
图 6 封包详细信息与十六进制对应
如图 6,对于封包里的每一条数据,可以通过点击对应数据的方式,从下方十六进制原始文件中显示对应的字节段。接下来,我们将对每个类型的封包分别进行介绍。
DNS分析 www.szu.edu.cn
域名系统(英文:Domain Name System,缩写:DNS)是互联网的一项服务。它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。DNS使用UDP端口53。在http://www.szu.edu.cn/board/中,www.szu.edu.cn域名需要进行DNS解析得到对应的ip地址才能进行网络资源访问。
首先通过DNS抓包查看域名解析的情况。打开Wireshark对网卡进行数据包的捕捉。接着对域名www.szu.edu.cn进行ping操作,由上一次实验知道,ping操作首先需要对域名进行解析,然后在通过ip地址进行访问、得到答复。通过ping得到域名解析后的ip如图 7所示。
图 7 通过ping得到解析后的ip地址
接下来打开Wireshark,在筛选框中输入DNS以筛选出DNS解析的数据包,如图 8所示。从结果来看,正好存在两个DNS解析的数据包,分别对应着解析请求的发送和答复。
图 8 筛选DNS结果
首先查看发送DNS解析的数据包,如图 9所示。首先,从互联网层看,DNS解析使用了ipv4协议,向223.5.5.5(阿里云公共DNS)发送了DNS解析请求。从传输层可以看到,使用的是UDP协议(User Datagram System),端口使用的是53端口。接着是DNS协议的详细信息:第一个是Transaction ID标识字段,长度为2字节,用于辨别DNS应答报文是哪个请求报文的响应。第二个是Flags字段,长度为2字节,通过分析不同位的信息可以得到详细的数据:
Response: 查询/响应,1为响应,0为查询。Opcode: 查询或响应类型,这里0表示标准,1表示反向,2表示服务器状态请求。Truncated: 截断,1表示超过512字节并已被截断,0表示没有发生截断。TC: 截断,1表示超过512字节并已被截断,0表示没有发生截断。zero: 全0保留字段。Recursion:是否希望得到递归回答。经过上述信息分析,可以得知,该数据包是一个标准DNS请求,没有被截断,希望得到递归的回答。
接下来是请求部分,字段Queries为查询或者响应的正文部分,分为Name 、Type、Class。 Name是需要请求的域名,不定长度以0结束;Type是查询类型,这里是主机A记录;最后的Class中,IN表示Internet数据。
图 9 发送DNS请求数据包
接下来分析答复部分的DNS数据包,如图 10所示。可以看到,Transaction ID仍然是发送时的标记,用于表示这是回复当时请求的标记;Response处由0变成了1表示这是答复的DNS;新增的Recursion available为1表示服务器端可以使用递归查询;Reply Code全0数据表示并没有出现错误。相比于请求,答复多了一项Answers,由于ping操作只请求了一个域名, Answers中仅存在一项表名该域名只有一种解析。查看Answers中解析的域名可以看到,域名的名称Name为www.szu.edu.cn,Type为A表示这是一个Ipv4地址,Class为In表示这是一个互联网数据,Time to Live(生存时间TTL)表示该资源记录的生命周期,从取出记录到抹掉记录缓存的时间,此处为9分26秒。Data length(资源数据长度)以字节为单位,这里的4表示IP地址的长度为4字节,也就是解析后的ip的长度。Addr(资源数据): 返回的IP地址210.39.4.1,就是我们想要的结果,该ip与ping命令行中的信息一致。
图 10 DNS答复
www.youku.com打开Wireshark对网卡进行数据包的捕捉,接着使用ping指令对域名www.youku.com进行连通性测试(相关操作省略)。
打开Wireshark,在筛选框中输入DNS筛选出DNS请求的数据包,得到如图 11所示两个数据包,分别代表DNS请求与答复。
图 11 筛选出的DNS相关数据包
首先打开请求的数据包,如图 12所示。从结果看出,协议采用UDP,端口为53;请求向223.5.5.5(阿里云公共DNS)发出;该数据包的Transaction ID为0x6cea。又从Flags字段中可以得出是一个请求的数据包,请求的是标准的查询,没有被截断,请求递归查询。接着从Queries字段中得出请求的只有一个域名的解析,类型为ipv4,为网络数据类。
图 12 DNS解析请求数据包
接着来分析得到的答复,如图 13所示。可以看到,Transaction ID仍然是发送时的标记,用于表示这是回复当时请求的标记;Response处由0变成了1表示这是答复的DNS;新增的Recursion available为1表示服务器端可以使用递归查询;Reply Code全0数据表示并没有出现错误。
查看Answers中解析的域名可以看到,首先是返回一个类型为CNME的项目。CAME为规范名字,即将www.youku.com规范为ipv6-aserver-heyi.m.taobao.com。然后,再次对ipv6-aserver-heyi.m.taobao.com进行解析,得到第二个同样为CNME的项目。该项目再次规范名字,将ipv6-aserver-heyi.m.taobao.com规范为ipv6-aserver-heyi.m.taobao.com.gds.alibabadns.com。此时再次进行域名解析,得到第三个项目。这时,返回的终于是为A的Ipv4地址,Class为In表示这是一个互联网数据,Time to Live(生存时间TTL)表示该资源记录的生命周期,从取出记录到抹掉记录缓存的时间,此处为21秒。Data length(资源数据长度)以字节为单位,这里的4表示IP地址的长度为4字节,也就是解析后的ip的长度。Addr(资源数据): 返回的IP地址106.11.35.97。
图 13 DNS解析答复数据包
www.sina.com.cn打开Wireshark对网卡进行数据包的捕捉,接着使用ping指令对域名www.sina.com.cn进行连通性测试,如图 14所示。
图 14 ping操作
打开Wireshark,在筛选框中输入DNS筛选出DNS请求的数据包,得到如图 15所示两个数据包,分别代表DNS请求与答复。
图 15 筛选DNS数据包
首先打开请求的数据包,如图 16所示。从结果看出,协议采用UDP,端口为53;请求向223.5.5.5(阿里云公共DNS)发出;该数据包的Transaction ID为0x96c7。又从Flags字段中可以得出是一个请求的数据包,请求的是标准的查询,没有被截断,请求递归查询。接着从Queries字段中得出请求的只有一个域名的解析,类型为ipv4,为网络数据类。
图 16 DNS解析请求数据包
接着来分析得到的答复,如图 17所示。可以看到,Transaction ID仍然是发送时的标记,用于表示这是回复当时请求的标记;Response处由0变成了1表示这是答复的DNS;新增的Recursion available为1表示服务器端可以使用递归查询;Reply Code全0数据表示并没有出现错误。
图 17 DNS解析答复数据包 1
查看Answers中(图 18)解析的域名可以看到,首先是返回一个类型为CNME的项目。CAME为规范名字,即将www.sina.com.cn规范为spool.grid.sinaedge.com。然后,再次对spool.grid.sinaedge.com进行解析,得到第二个同样为CNME的项目。该项目再次规范名字,将spool.grid.sinaedge.com规范为ww1.sinaimg.cn.w.alikunlun.com。此时再次进行域名解析,得到剩下的13个项目。这时,返回的全部是类型为A的Ipv4地址,Class为In表示这是一个互联网数据。可以发现,ping指令最后只对第一个ipv4地址进行了操作。DNS将一个域名解析成了多个ip,如此一来一旦有其中一个ip宕机了,也能迅速访问其他ip来连接,增加了服务的可靠性。
图 18 Answers解析的域名
HTTP超文本传输协议(Hypertext Transfer Protocol,HTTP)是一个简单的请求-响应协议,它通常运行在TCP之上,端口号一般为80。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。
由于www.szu.edu.cn、www.youku.com、www.sina.com.cn等许多网站都已经采用更安全的https协议,所以测试http协议的网站使用深大内部的学生公寓管理中心http://gyzx.szu.edu.cn/。
首先打开Wireshark对网卡进行数据包捕捉,然后在浏览器中打开http://gyzx.szu.edu.cn/。接着返回Wireshark中,在筛选框中输入http对数据包进行筛选,得到两个数据包,分别代表了http的请求及答复,如图 19所示。
图 19 http请求和答复
首先来观察http请求的数据包,如图 20所示。
图 20 http请求
从传输层可以看到,http采用的是tcp协议,端口为80。在应用层,可以看到http协议的报文形式。首先,该数据包采用的是GET的方法,协议为HTTP 1.1。HTTP1.0 定义了三种请求方法: GET, POST 和 HEAD方法。HTTP1.1 新增了五种请求方法:OPTIONS、PUT、PATCH、DELETE、TRACE 和 CONNECT 方法。
表格 1 http请求方式
GET | 请求指定的页面信息,并返回实体主体。 |
HEAD | 类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头 |
POST | 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST 请求可能会导致新的资源的建立和/或已有资源的修改。 |
PUT | 从客户端向服务器传送的数据取代指定的文档的内容。 |
DELETE | 请求服务器删除指定的页面。 |
CONNECT | HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。 |
OPTIONS | 允许客户端查看服务器的性能。 |
TRACE | 回显服务器收到的请求,主要用于测试或诊断。 |
PATCH | 是对 PUT 方法的补充,用来对已知资源进行局部更新 。 |
从Connection中可以看到,该请求是keep-alive的,即永久连接。这样子有利于在你访问的网页中有很多图片等其他资源的时候,可以使用同一个TCP连接接收,而不是针对每一个文件都建立一次TCP/IP的连接。User-Agent则表示了访问的客户端的详细信息。Accept-Encoding: gzip, deflate说明该浏览器支持的编码格式,这里是压缩编码的方式,猜想应该是服务器将浏览器请求的文件都是以压缩文件发送过来的。Accept-Language: zh-CN,zh;q=0.9,en;q=0.8指明了该浏览器支持的语言类型,支持zh-CN,zh,en。然后优先发送zh-CN和zh的语言,因为他们的权重是0.9。
接下来分析http协议的答复,如图 21所示。
图 21 http答复
直接分析应用层的http协议,可以看到,答复同样采用的是http1.1,Status为200说明客户端请求成功。常见的几个状态码如下所示。
200:客户端请求成功,是最常见的状态。302:重定向。404:请求资源不存在,是最常见的状态。400:客户端请求有语法错误,不能被服务器所理解。401:请求未经授权。403:服务器收到请求,但是拒绝提供服务。500:服务器内部错误,是最常见的状态。503:服务器当前不能处理客户端的请求。Content-Length表示内容长度。Content-Type表示后面的文档属于什么MIME类型,默认为text/plain,但通常需要显式地指定为text/html。Date为当前的GMT时间。最后的line-based text data即为返回的网页内容,浏览器经过解析html语言,进而将网页呈现给用户。
TCP传输控制协议(TCP,Transmission Control Protocol)是为了在不可靠的互联网络上提供可靠的端到端字节流而专门设计的一个传输协议。应用层向TCP层发送用于网间传输的、用8位字节表示的数据流,然后TCP把数据流分割成适当长度的报文段。之后TCP把结果包传给IP层,由它来透过网络将包传送给接收端实体的TCP层。TCP为了保证不发生丢包,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的包发回一个相应的确认信息(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据包就被假设为已丢失并进行重传。TCP用一个校验和函数来检验数据是否有错误,在发送和接收时都要计算校验和。
接下来通过打开网站www.szu.edu.cn来观察TCP连接的情况。首先打开Wireshark对网卡进行数据包捕捉,然后在浏览器中打开www.suz.edu.cn。由图 7可得,域名解析后的ip地址为210.39.4.1,于是在Wireshark的筛选框中输入“ip.addr == 210.39.4.1”来筛选数据包。得到结果如图 22所示。
图 22 TCP数据包
TCP建立图 22中前3个数据包为TCP三次握手协议建立连接。当主动方发出SYN连接请求后,等待对方回答SYN+ACK,并最终对对方的 SYN 执行 ACK 确认。这种建立连接的方法可以防止产生错误的连接,TCP使用的流量控制协议是可变大小的滑动窗口协议。
TCP三次握手的过程如下:
客户端发送SYN(SEQ=x)报文给服务器端,进入SYN_SEND状态。服务器端收到SYN报文,回应一个SYN (SEQ=y)ACK(ACK=x+1)报文,进入SYN_RECV状态。客户端收到服务器端的SYN报文,回应一个ACK(ACK=y+1)报文,进入Established状态。三次握手完成,TCP客户端和服务器端成功地建立连接,可以开始传输数据了。
首先来分析第一次握手,数据包如图 23所示。可以看出,由于使用的是HTTPS协议打开的网页,所以TCP端口为443。Src为客户端,Dst为访问的域名接续后的ip,所以这是客户端发送给服务端的数据。可以看到客户端将Flags标志位SYN置为1,随机产生一个值Sequence Number = 0作为序号,并将该数据包发送给服务器,客户机进入SYN_SENT状态,等待服务器确认。实际上Wireshark 工具帮我们做了优化,它默认显示的是序列号 seq 是相对值,而不是真实值,真实值在Sequence Number(raw)中,值为1136243156。
图 23 TCP第一次握手
然后是第二次握手,如图 24所示。可以看到,该数据包的Src是服务端,Dst是客户端,说明这是服务器发送给客户端的数据。这时观察到,SYN仍然为1。然后,服务端将确认序号(Acknowledgement Number)设置为客户的序号seq加1,即0+1=1, ACK变为了1(真实值为1136243157 = 1136243156 + 1),说明服务端收到了TCP请求。此时,seq由服务器随机生成相对值0(实际值1721425601)。
图 24 TCP第二次握手
接下来是TCP第三次握手,如图 25所示。可以看到,该数据包的Src为客户端,Dst为服务端,这是客户端发送的数据包。在第三次握手中,客户端收到第二次握手中服务器发来的包后检查确认序号Seq是否正确,即第一次发送的序号Seq加1(X+1= 0+1=1)。以及标志位ACK是否为1。若正确,客户端会再向服务器端发送一个数据包,SYN=0,ACK=1,确认序号Ack=Y+1=0+1=1,并且把服务器发来ACK的序号Seq加1发送给对方,发送序号Seq为X+1= 0+1=1。客户端收到后确认序号值与ACK=1,至此,一次TCP连接就此建立,可以传送数据了。
图 25 TCP第三次握手
数据传输数据传输阶段,服务端与客户端之间仍然通过Seq与Ack的值进行数据可靠性的保证。具体操作如图 26所示。
图 26 TCP数据传输过程
由于数据传输的数据包非常多,为了更直观的观察,可以打开Wireshark中的统计-流量图,如图 27所示。图中可以看到,服务端与客户端一直在通信,并没有终止。同时,因为发送或者接受的数据包并不固定数量,所以Seq和Ack值的变化不一。
图 27 TCP传输数据
四次挥手建立一个连接需要三次握手,而终止一个连接要经过四次握手,这是由TCP的半关闭(half-close)造成的具体流程如下。
(1)客户端A发送一个FIN,用来关闭客户A到服务器B的数据传送。
(2)服务器B收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。和SYN一样,一个FIN将占用一个序号。
(3)服务器B关闭与客户端A的连接,发送一个FIN给客户端A。
(4)客户端A发回ACK报文确认,并将确认序号设置为收到序号加1。
具体捕获的数据包如图 28红框内所示。首先,第一行说明客户端向服务端发送FIN请求;然后,第二行中,服务端向客户端发送一条ACK回复,表名服务端已经收到结束请求;然后,第三行中,服务端向客户端发送FIN,表名服务器已经关闭通信;第四行中,客户端收到服务端的关闭信息,所以自己也关闭通信,同时,将自己已经收到关闭通信的信息用ACK发送给服务端。至此,整个TCP连接已经完全关闭
图 28 TCP四次挥手
UDPUDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。UDP协议与TCP协议一样用于处理数据包,在OSI模型中,两者都位于传输层,处于IP协议的上一层。UDP有不提供数据包分组、组装和不能对数据包进行排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。
接下来使用登录QQ这一过程来抓取UDP数据包进行分析。首先打开Wireshark对网卡进行数据包捕捉,然后登录QQ,在Wireshark筛选框中输入OICQ进行筛选。OICQ协议是QQ在与服务器通信时使用的协议,通常是建立在UDP协议之上。筛选后,得到许多OICQ协议的数据包,如图 29所示。
图 29 OICQ数据包
接下来,随便打开一个数据包,如图 30所示。可以看到,这是由服务端发送至客户端的数据包,传输层使用的是UDP协议。与TCP协议相比,UDP协议的报文非常简单,这是因为UDP报文不对可达进行保证,适合高数据流的应用。然后应用层协议为OICQ协议,这一部分协议完全由QQ去定义,内含QQ通信时所需要的信息。
图 30 OICQ数据包详细信息