Wireshark协议分析之SMTP

一:前言

如果说Web浏览是用户参与次数最多的网络活动,那么收发邮件有可能是第二位。简单邮件传输协议(SMTP)是发送邮件的标准,它被Microsoft Exchange 和Postfix等平台使用

与HTTP一样,SMTP由于实现方式、与客户端/服务器兼容性相关的一些列特性的不同,在数据包结构上存在多样性。本文只是通过在数据包层面,对邮件发送过程进行分析,来探究SMTP的一些基本功能

二:收发邮件

邮件服务架构与邮政服务类似。发信方写了一封邮件,然后将邮件投入发信方的邮箱;邮递员将邮件取走,并将邮件送到邮局进行分拣。从这个邮局出发,这封邮件将被投递至由此邮局提供服务的另一个邮箱,或者转发至另一个负责投递这封邮件的邮局。一封邮件在投递过程中,可能会通过多个邮局,甚至是通过专门用于特定地域内邮局间投递的“Hub”邮局

电子邮件投递与上面的过程非常类似,对于个人来说,电子邮箱取代了物理邮箱,为此用户提供邮件的存储、发送和接受服务。用户通过邮件用户代理(MUA),如Microsoft Outlook访问邮箱

当用户发送邮件时,邮件将通过MUA发送至邮件传输代理(MTA),MTA通常指邮件服务器,流行的邮件服务器应用包括Microsoft Exchange 和Postfix。如果邮件的收件方和发件方域名相同,则MTA将直接发送邮件至收件人邮箱。如果邮箱被发送至其他域名下的邮箱,则MTA将通过DNS找到对方的邮件服务器地址,并将邮件传输至该服务器。注意:邮件服务器通常还包含其他组件,如邮件发送代理(MDA)和邮件提交代理(MSA),但是从网络的角度看,我们通常只关注客户端和服务器的概念

三:跟踪一封电子邮件

对电子邮件如何传输有了基本了解之后,查看一下这一过程中的数据包

以上场景分为三个步骤

1  用户从计算机 172.16.16.225 发送一封电子邮件,邮件客户端使用SMTP协议,将邮件传输至本地邮件服务器(172.16.16.221)

2  本地邮件服务器接收邮件,并使用SMTP将其传输至远程邮件服务器(172.16.16.231)

3  远程邮件服务器接收邮件,并将其与适当的邮箱相关联。收件方计算机(172.16.16.235)上的邮件客户端通过IMAP协议取回邮件

第一步:客户端至本地邮件服务器

从用户在邮件客户端上点击“发送”按钮开始,用户计算机和本地邮件服务器在前三个数据包中完成握手

连接建立后,客户端使用SMTP将邮件发送至本地邮件服务器

(由于SMTP是一种简单的传输协议,并且在这个例子通信过程为明文传输,因此可以跟踪TCP流)

邮件服务器在数据包4向客户端发送一个服务标签,表明此服务器已经准备好接受命令,本例中服务器显示为运行在Ubuntu Linux系统上的Postfix服务器(1)。同时,此服务器支持接受扩展SMTP(ESMTP)命令

邮件客户端在数据包5中通过EHLO命令进行回复(2)。当邮件服务器支持ESMTP时,EHLO作为“Hello”命令,让服务器识别发信的客户端主机。在不支持ESMTP的情况下,使用HELO命令进行发信客户端识别。本例中发信方使用IP地址作为识别方式,当然,域名也可以作为识别方式

在数据包7中,服务器回复的内容包括 VRFY 、STARTTLS和SIZE 10240000。这些内容表示此SMTP服务器支持的命令,用于告知客户端在邮件传输过程中可用的命令范围。在发送邮件之前,这个特征协商过程会发生在每次SMTP传输的开始部分。邮件传输从数据包8开始,这个抓包文件的剩余的大部分均为邮件传输过程的数据包

SMTP由客户端发送的简单命令和参数值控制,服务器会回复相应的响应码。这种设计是为了协议简化,与HTTP和Telnet相似。数据包8和数据包9是一组示例请求/回复,客户端发送了MAIL命令,参数为FROM:<[email protected]> SIZE=556 (4);服务器回复的响应码为250(请求的邮件操作完成),参数为2.1.0 Ok。在这次请求中,客户端发送了发信方的邮箱地址和邮件大小,服务器响应说明数据已经被接收,并且格式正确。类似的传输过程也发生在数据包10和11;客户端发送RCPT命令,参数为TO:<[email protected]> (5),服务器响应为250 2.1.5 Ok

剩余的部分是传输邮件内容数据,如数据包12,客户端使用命令DATA启动邮件内容传输过程。服务器响应码为354,并附带信息(6),其中响应码354代表服务器为这封邮件创建了缓冲区,客户端可以开始邮件传输;附带信息表示客户端需要发送一个<CR><LF>.<CR><LF> 用于标记传输终止

这封邮件使用明文传输,并且响应码表示传输成功。邮件文本中包含着一些附加信息,包括日期、内容、用户代理(7)

传输完成后,在数据包18中,邮件客户端使用了不带参数的QUIT命令,终止了SMTP连接。在数据包19中,服务器回复响应码221(传输通道关闭),附带参数2.0.0 Bye(8),TCP连接在20-23中正常关闭

 

第二步:本地邮件服务器至远程服务器

接下来从本地邮件服务器(172.16.16.221)的角度,考虑这个传输场景。分析数据包可以直接从邮件服务器上抓取

刚开始,本地服务器(172.16.16.221)和远程服务器(172.16.16.231)完成TCP握手,并开始第2步传输过程

在现实场景中,邮件服务器通过一种特殊的DNS记录类型——邮件交换(MX)记录,定位其他的邮件服务器。在进行邮件发送故障检查时,需要考虑DNS问题及与邮件相关的特定协议问题

连接建立完成后,邮件传输至远程服务器的过程使用SMTP协议。跟踪传输过程的TCP流,能够查看这个会话过程(使用tcp.stream==1作为筛选条件)

这个传输过程和上一次的传输过程基本一致。本质上,两者的邮件内容一致,区别在于第一次的过程发生在客户端和服务器之间。远程服务器被标记为mail02(1),本地邮件服务器被标记为mail01(2),两个服务器共享了一系列的可用命令(3);邮件内容(4)包括上一次传输过程中的完整的邮件文本,以及附加在 To: Chris Sanders <[email protected]> 之前的部分

从根本上来说,服务器不关注邮件时来自于邮件客户端还是来自另一个SMTP服务器,所以客户端——服务器邮件传输中所有的规则和过程在服务器——服务器邮件传输过程中也都适用(任意形式的访问控制策略除外)。在实际情况中,本地邮件服务器和远程邮件服务器可能并不具备相同的特征参数集合(包括命令集和参数集),或是基于完全不同的平台。这也是SMTP要进行初始化通信的非常重要的原因;这一过程确保了在邮件传输之前,收件服务器要将自身支持的命令和参数集发送给发件方,从而完成传输使用命令的协商。在SMTP客户端或服务器明确了收件服务器的特征参数后,能够保证发件方发送的SMTP命令被收件服务器识别,并且邮件能够正常传输。这一机制使SMTP能够在大量不同的客户端和服务器之间应用,同时,也让我们在发送邮件时,不需要了解收件方的网络设备信息。

 

第三步:远程邮件服务器至远程客户端

前15个数据包很熟悉,源地址为本地邮件服务器,目的地址变成了远程邮件服务器

 

这个流程完成后,SMTP服务将邮件和指定的邮箱关联,之后,预期的收件方就可以是通过邮件客户端收取邮件

正如之前提到的,SMTP最主要被用来发送邮件;从服务器上的邮件收取邮件的方式更加多样,同时,由于在收取邮件事件中不断有新的需求,因此出现了数种用于完成邮件收取任务的协议。比较流行的是邮局协议v3(POP3)和Internet邮件访问协议(IMAP)。本例中,远程客户端使用IMAP从邮件服务器中收取邮件

 在数据包21中,客户端向服务器发送了 STARTTLS命令,这个命令告诉服务器,客户端将使用TLS加密收取邮件,双方在数据包24-27中建立了安全信道,在余下的数据包中,使用TLS协议完成。当查看这些数据包,或者尝试跟踪TCP流时,内容不具有可读性,目的是防止邮件被恶意用户截获,避免数据劫持和嗅探的发生,如下图

最后,不同域内两个用户之间的邮件发送过程就完成了

四:使用SMTP发送附件

在设计SMTP时,从未计划使其称为一种传输文件的途径,但由于使用邮件发送文件的便捷性,因此,它成为了很多人的首选文件共享方式,本例从数据包层面分析SMTP的文件传输过程

用户使用客户端(172.16.16.225)向同一网络内另一个用户发送邮件,本地SMTP服务器位于172.16.16.221。这封邮件包含一些文本内容,以及一个图片文件附件

使用SMTP发送附件与发送文本没有太多区别。它们都只是向服务器发送数据;尽管过程中经常使用一些特殊编码,我们仍使用DATA命令进行数据传送

本例的通信过程在开始部分与之前的场景类似,包括服务识别和可用协议信息交换。当客户端准备传输邮件信息时,它会提供发件方地址和收件方地址,并发送DATA命令,通知服务器分配用于接受邮件数据的缓冲区

在之前的例子中,客户端将文本直接传输至服务器,然后传输完成。在本例中,除了明文文本信息外,客户端还需要发送图片附件的二进制数据。为了实现这个目的,客户端将内容类型标记为 multipart/mixed  ,以 ------------050407080301000500070000 作为文本信息和二进制数据的分界线。这告知服务器,传输的邮件内容包含多种类型的数据,每种数据类型有特定的MIME类型和编码方式,各种类型的数据使用指定的边界值分隔。通过这种机制,当另一个邮件客户端接收邮件时,基于分界线和每个数据块指定的MIME类型、编码方式,接收端能够知道如何解析邮件数据

本例中邮件数据包含两部分。第一部分是邮件文本,内容类型为 text/plain (2)。在此之后,能够看到一个分隔标记和第二部分的起始。第二部分包含图片文件,内容类型是 image/jpeg (4),Content-Transfer-Encoding 值设为base64 ,这表示数据需要使用base64解码。余下的数据包包含编码过的图片文件

在任何情况下都不要将编码方式和加密方式弄混。Base 64 编码几乎能够被瞬间解码,任何截获这一通信的攻击者能够毫不费力地获得此图片文件

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章