要求

使用Ethereal或相关协议分析工具,进行HTTP(包括头部典型方法与字段)、DNS、TLS、SMTP、ARP、RTP、RTMP(Real Time Messaging Protocol)协议的分析。要求:对每个应用层协议从上到下(Ethernet帧),写出协议执行过程及协议单元封装的过程和主要字段值的意义(例如HTTP协议请求、响应过程,DNS对某个具体域名的查找过程,TCP连接建立、数据传输、释放连接过程,等等)。

实验工具:

  • wireshark
  • chrome浏览器
  • Foxmail客户端
  • VLC media player
  • VoIP 通话线路
  • MicroSIP

分析过程:

以访问一个网页为例。

启动wireshark,在浏览器输入www.xiaomi.com,访问小米的官网。(ps:网址会自动跳转到www.mi.com,这是因为小米官网做了域名重定向。)

wireshark捕获邮件 wireshark抓取smtp_http

整个访问小米官网的过程,可以大致划分为以下几个步骤:

  1. 浏览器输入网址,回车
  2. DNS域名解析
  3. 建立TCP连接
  4. 发起http请求
  5. 服务器响应http请求,返回网页
  6. 浏览器解析网页,并渲染

所以,当我们访问这个网址的的时候,首先要做的就是域名解析。域名解析就是要得到域名对应的ip地址,浏览器首先会搜索自身DNS缓存和操作系统DNS缓存,找不到就读取系统hosts文件,若还找不到,那就想DNS服务器发起DNS请求。DNS服务器一般由运营商提供,它会查找自身缓存,若仍然找不到,它会代替我们的浏览器发起迭代DNS查询请求。

分析DNS协议

DNS是一个应用层协议,基于TCP/IP传输,一般的DNS报文传输层是UDP报文。查询的时候一般请求DNS服务器的53端口号。

查询请求的数据包如下:(ps:221.11.1.67 是西安联通提供的DNS服务器)

wireshark捕获邮件 wireshark抓取smtp_tcp/ip_02

响应报文如下:

wireshark捕获邮件 wireshark抓取smtp_客户端_03

可以看到,经过DNS查询,得到了IP地址123.125.103.192111.202.1.201

接下来建立TCP连接,如图是TCP三次握手的报文。

wireshark捕获邮件 wireshark抓取smtp_tcp/ip_04

分析TCP握手过程

  • 第一次握手:客户端向服务器发送连接请求包,标志位SYN置为1,序号为Seq = X (由报文可以看出X=0)

wireshark捕获邮件 wireshark抓取smtp_http_05

  • 第二次握手:服务器收到客户端发过来报文,由SYN=1知道客户端要求建立联机。向客户端发送一个SYN和ACK都置为1的TCP报文,设置初始序号Seq=Y(由报文可得Y=0),将确认序号ACK设置为客户的序列号Seq+1,即X+1 = 0+1=1,

wireshark捕获邮件 wireshark抓取smtp_tcp/ip_06

  • 第三次握手:客户端收到服务器发来的包后检查ACK是否正确。以及标志位ACK是否为1。若正确,客户端再次发送确认包,ACK标志位为1,SYN标志位为0。确认序号ACK=Y+1=0+1=1,发送序号为X+1=1。服务器收到后确认序号值与ACK=1则连接建立成功,可以传送数据了

wireshark捕获邮件 wireshark抓取smtp_wireshark捕获邮件_07

TCP建立完成后,就可以进行数据传输了。客户端会向服务器发送HTTP请求报文。

分析HTTP报文

HTTP报文由三部分组成,开始行、首部行和实体主体,如下图。在请求报文中,开始行就是请求行。

wireshark捕获邮件 wireshark抓取smtp_wireshark_08

下图是抓取的请求报文。可以看到,请求方法为GET,协议版本是HTTP/1.1,主机名www.xiaomi.comUser-Agent是生成请求的浏览器类型,Accept是客户端可识别的响应内容类型列表。Accept-Language: 客户端可接受的自然语言。Accept-Encoding: 客户端可接受的编码压缩格式。connection:连接方式。

wireshark捕获邮件 wireshark抓取smtp_客户端_09

下图是响应报文,可以看到我们的请求被重定向到了www.mi.com

wireshark捕获邮件 wireshark抓取smtp_wireshark捕获邮件_10

收到响应报文后,发现我们的请求被重定向到了www.mi.com

所以,我们要去访问www.mi.com,所以再来一遍DNS查询,TCP连接。抓包结果如下:

wireshark捕获邮件 wireshark抓取smtp_tcp/ip_11

那么与www.mi.com建立了连接之后呢,就可以开始传输数据了吗?并不是。

在数据传输之前,我们要建立加密安全数据通道,这就要用到TLS协议。

分析TLS报文

客户端会先向服务端发送Client Hello消息,其中包括了随机数、密码套件以及密钥交换算法参数。服务端收到后会给确认,发送给客户端Server Hello 数据包,服务端会根据Client Hello提供的协议版本列表,选择版本。

下图是TLS协议Client Hello

wireshark捕获邮件 wireshark抓取smtp_客户端_12

下图是服务端发出的Server Hello

wireshark捕获邮件 wireshark抓取smtp_客户端_13

到此,TLS的握手过程就结束了,后面可以加密传输消息了。

分析ARP协议

实验环境:两台电脑同处于一个局域网下,我的电脑IP地址是10.102.38.182,另外一台点脑ip地址是10.102.40.125

用我的电脑ping另外一台电脑,使用wireshark抓包

请求报文如下:

wireshark捕获邮件 wireshark抓取smtp_http_14

响应报文如下:

wireshark捕获邮件 wireshark抓取smtp_http_15

SMTP抓包测试

注意:抓取SMTP数据包需要关闭邮件客户端的SSL加密选项,否则无法抓到。

发送一封测试邮件,观察wireshark抓包结果。

可以看到,首先向211.11.1.67DNS服务器发送了DNS查询。

wireshark捕获邮件 wireshark抓取smtp_tcp/ip_16

报文如下:我用的是QQ邮箱,所以查询的是QQ的邮件服务器。

wireshark捕获邮件 wireshark抓取smtp_tcp/ip_17

DNS查询结束后,需要进行TCP握手,建立TCP连接,然后才开始smtp报文。

我直接筛选smtp报文来分析。如图,是筛选结果。因为在smtp报文之前就已经建立了tcp连接,所以第一条smtp报文就是服务器端发给客户端的。

wireshark捕获邮件 wireshark抓取smtp_wireshark捕获邮件_18

可以逐条分析一下:

第98帧,服务器发给客户端,响应代码220表示连接建立成功

wireshark捕获邮件 wireshark抓取smtp_客户端_19

第99帧,客户端收到220代码后,继续发送请求,首先是发送EHLO命令。一般来说客户端和SMTP服务端建立连接之后就需要发送EHLO或者是HELO命令,后面附带的参数是domain,即相当于客户端的主机域名或者是主机名,这一步的主要作用是声明身份,EHLO/HELO命令相当于是HELLO命令,两者之间的主要区别是EHLO带身份验证而HELO不带身份验证,因此EHLO要更加安全

wireshark捕获邮件 wireshark抓取smtp_tcp/ip_20

第101帧,服务端接收到客户端的EHLO请求之后,返回了一个250代码并且附带了支持的身份验证方式

wireshark捕获邮件 wireshark抓取smtp_wireshark捕获邮件_21

第102帧,客户端使用AUTH命令进行身份验证

wireshark捕获邮件 wireshark抓取smtp_http_22

第104帧,身份验证成功,返回235的成功代码。

wireshark捕获邮件 wireshark抓取smtp_wireshark_23

到这里就完成了和SMTP服务器建立连接和身份验证的步骤。

第105帧,客户端发送MAIL FROM命令,声明邮件的发件人

wireshark捕获邮件 wireshark抓取smtp_http_24

第108帧,服务器返回250代码确定操作成功

wireshark捕获邮件 wireshark抓取smtp_tcp/ip_25

第109帧,然后客户端发送RCPT TO命令声明邮件的收件人

wireshark捕获邮件 wireshark抓取smtp_tcp/ip_26

第113帧,服务器返回250代码确定操作成功

wireshark捕获邮件 wireshark抓取smtp_tcp/ip_27

第114帧,客户端使用DATA命令,告知服务器要开始传输邮件的正文内容。

wireshark捕获邮件 wireshark抓取smtp_http_28

第118帧,服务端返回354代码,告知邮件的内容结束以<CR><LF>.<CR><LF>为标记

wireshark捕获邮件 wireshark抓取smtp_http_29

第119帧,客户端接收到354代码后,会给服务端法案送一个确认数据包,开始传输邮件内容

wireshark捕获邮件 wireshark抓取smtp_wireshark_30

第121帧,邮件正文。我们可以看到在上面的数据包中包含了SMTP和IMF两个部分,因为抓包发送的邮件内容都是文本,所以直接使用IMF协议就可以传输,而SMTP协议中的报文内容则是DATA命令的终止标志

wireshark捕获邮件 wireshark抓取smtp_客户端_31

因为我们为了抓包方便,所以没有加密。所以其实我们可以在这里面直接提取到邮件内容。看下图,此报文中有编码格式以及编码。

wireshark捕获邮件 wireshark抓取smtp_http_32

我们将编码解码为GB2312即可看到邮件内容。如图,确实是我们发送的内容。(解码网站为https://base64.us/

wireshark捕获邮件 wireshark抓取smtp_wireshark捕获邮件_33

第127帧,在客户端发送完邮件内容之后,还会接着发送一个QUIT命令来表示结束这次的SMTP传输

wireshark捕获邮件 wireshark抓取smtp_wireshark_34

服务器在接受到数据之后会返回250代码表示接受成功并且再返回221代码表示结束本次SMTP传输。分别在第126帧和第131帧.

wireshark捕获邮件 wireshark抓取smtp_wireshark捕获邮件_35

wireshark捕获邮件 wireshark抓取smtp_http_36

至此,整个邮件传输过程结束。

我这里筛选了smtp报文,并逐帧分析了整个会话流程。其实还有另一种方式,我们可以右键选择追踪tcp流来追踪整个会话过程。如下图,这个会话流程可以清晰的看到客户端和服务器的信息交互,我们可以直接分析服务器和客户端的会话过程。

wireshark捕获邮件 wireshark抓取smtp_wireshark_37

追踪tcp流,我们也可以看到,确实是先经过了TCP三次握手,才进行smtp握手。

wireshark捕获邮件 wireshark抓取smtp_http_38

RTP抓包分析

RTP协议用于实时传输数据。RTP协议是一种基于UDP的传输协议,一般视频监控,视频会议,语音电话(VOIP)之类的,都会使用RTP协议。

但是我找了下,没有找到能抓到RTP包的网站。然后考虑他的应用场景,手边刚好有海康威视的摄像头,我尝试了一下,连接电脑,打开监控视频,然后下载了一段监控视频,并没有抓到RTP包(连UDP都没抓到,我也不太懂怎么回事)。

随后又想到RTP还应用于语音电话上面,巧了,刚好我这里有一台IP电话交换机,通话使用的就是sip协议,就抓了下这个。

配置好交换机,在两台电脑上分别使用MicroSIP软件配置好通话账号,然后,拨打电话,抓包分析。

wireshark捕获邮件 wireshark抓取smtp_http_39

抓包结果如下:

wireshark捕获邮件 wireshark抓取smtp_tcp/ip_40

RTP报文如下:

wireshark捕获邮件 wireshark抓取smtp_wireshark_41

RTMP抓包分析

RTMP是流媒体传输协议。我使用软件VLC,播放rtmp网络流地址。

测试直播地址为rtmp://media3.scctv.net/live/scctv_800(是美国的一个电视台)

wireshark捕获邮件 wireshark抓取smtp_wireshark_42

抓包结果如下:可以看到,dns查询完了之后,先tcp三次握手建立连接,然后才开始rtmp。

wireshark捕获邮件 wireshark抓取smtp_tcp/ip_43

首先,客户端端发送C0+C1块,确认版本。

(本来客户端向服务器发送C0块,表示要和服务器握手,C0中包含版本号。服务器收到C0后,检查C0中的版本是否支持,如果支持发送S0作为响应,否则应该终止连接。客户端和服务器都分别等待C1和S1,等待版本确认。客户端收到S1后发送C2,服务器收到C1后发送S2(确认),握手完成。)

但是实际上客户端直接发了C0+C1,不等服务端了,自己给自己确认。

wireshark捕获邮件 wireshark抓取smtp_wireshark_44

服务器应该回复确认包(发送S0+S1+S2)。但是我没抓到,只抓到了两个Unknown的包,我也不知道啥意思,可能是网络的问题。

wireshark捕获邮件 wireshark抓取smtp_wireshark_45

不过不重要,反正他本来客户端也不让服务器确认版本号,自己给自己确认了。

直接看下一个,客户端发送C2,握手完成。

wireshark捕获邮件 wireshark抓取smtp_wireshark_46

客户端发送connect,报文如下

wireshark捕获邮件 wireshark抓取smtp_wireshark捕获邮件_47

服务器给客户端发送如下报文,主要是告诉客户端确认窗口大小,设置节点带宽。

wireshark捕获邮件 wireshark抓取smtp_http_48

客户端向服务器发送确认窗口大小,并请求创建流(createStream)。

wireshark捕获邮件 wireshark抓取smtp_http_49

服务器端给出响应。

wireshark捕获邮件 wireshark抓取smtp_wireshark_50

客户端向服务器发送播放命令,请求播放stream,并设置Buffer Length 1,3000ms。(展开整个报文太长了)

wireshark捕获邮件 wireshark抓取smtp_http_51

服务端给出响应结果

wireshark捕获邮件 wireshark抓取smtp_tcp/ip_52

服务器向客户端发送推流通知,并附带元数据信息(分辨率、帧率、音频采样率、音频码率等等)和视频、音频数据。

此时客户端就可以开始正常播放rtmp流了。

wireshark捕获邮件 wireshark抓取smtp_tcp/ip_53