Wireshark对SMTP抓包分析

本文主要使用Wireshark对邮件客户端使用SMTP协议发送邮件的过程进行抓包分析并使用telnet命令进行简单操作。

1、SMTP简介

简单邮件传输协议(英语:Simple Mail Transfer Protocol,缩写:SMTP)是一个在互联网上传输电子邮件的标准。

SMTP是一个相对简单的基于文本的协议。在其之上指定了一条消息的一个或多个接收者(在大多数情况下被确认是存在的),然后消息文本会被传输。可以很简单地通过telnet程序来测试一个SMTP服务器。SMTP使用TCP端口25。要为一个给定的域名决定一个SMTP服务器,需要使用DNS的MX记录。

无论使用POP3还是IMAP4来获取消息,客户端均使用SMTP协议来发送消息。邮件客户端可能是POP客户端或者IMAP客户端,但都会使用SMTP。

2、Wireshark抓包分析

由于大多数人平时接触到的程序除了邮件客户端在发件的时候会使用SMTP协议之外,其余的几乎不会用到,因此相关的抓包分析非常简单,只需要在Wireshark的Filter中设定抓取的协议为SMTP即可顺利过滤出绝大多数的包,如果担心过滤效果不佳可以再加上邮件服务器的IP地址。

点击开始抓包之后,我们使用配置了SMTP的邮件客户端来发送一封邮件即可抓取到全部的数据包。

2.1 220

注意这里为了方便分析数据包内容并没有使用加密协议,抓取到的一个完整的SMTP发送过程如下:

需要注意的是这里筛掉了TCP协议,因此最开始的TCP三次握手建立连接在这里是看不到的,因此在图中的第一个包就是SMTP的服务器端发送给客户端的数据包:

响应代码220表示连接建立成功,后面的Anti-spam表明是该邮件系统的反垃圾邮件模块,即猜测在这里就有反垃圾邮件模块来抵挡垃圾邮件的攻击。

2.2 EHLO/HELO

服务端返回220代码之后,客户端继续发送请求,首先是发送EHLO命令:

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

在服务器上使用telnet命令可以很直接的看到两者之间的区别,EHLO会返回身份验证方式而HELO命令则直接返回250 OK代码。

2.3 AUTH

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

客户端使用AUTH命令进行身份验证:

身份验证成功后会返回235的成功代码:

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

2.4 MAIL FROM

接下来客户端发送MAIL FROM命令声明邮件的发件人:

服务器返回250代码确定操作成功:

2.5 RCPT TO

然后客户端发送RCPT TO命令声明邮件的收件人:

服务器返回250代码确定操作成功:

2.6 DATA

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

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

windows中的换行符标记为CRLF而Linux中的为LF,<CR><LF>.<CR><LF>即表明当服务器收到单独一行的.即完成本次邮件正文传输。

客户端接收到254代码后,开始传输邮件内容:

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

2.7 QUIT

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

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

3、telnet测试SMTP

由于SMTP协议十分简单且没有加密,所以我们使用telnet命令连接到邮件服务器也可以执行同样的操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# 使用telnet和服务器建立连接
telnet localhost 25
# 这里根据邮件系统的不同选择EHLO或者是HELO
HELO TINY-DESKTOP
EHLO TINY-DESKTOP
# 使用EHLO还可以进行身份验证
# 使用AUTH命令进行身份验证和登录
# 需要注意要将账号密码转码成base64编码的文本才可以成功登录
AUTH LOGIN
# 转码前的账号test01@coremail.cn
dGVzdDAxQGNvcmVtYWlsLmNu
# 转码前的密码password01
cGFzc3dvcmQwMQ==

# 确定发件人
MAIL FROM: <test01@coremail.cn>
# 确定收件人
RCPT TO: <test02@coremail.cn>
# 开始传输正文
DATA

Subject: telnet test mail
From:"test01"<test01@coremail.cn>
To:"test02"<test02@coremail.cn>

Hello,
This is a smtp test via telnet.
Goodbye.

.
# 结束传输并退出
QUIT

如图中所示使用AUTH命令登录认证成功之后是会收到服务器返回的235代码的。我们操作完成之后查看邮箱确定收到了测试的邮件则说明操作成功。

在使用AUTH认证的情况如下:

实际上返回的334代码后面的dXNlcm5hbWU6UGFzc3dvcmQ6就是base64编码的usernamePassword

由于明文传输的不安全性,现在单纯的SMTP已经几乎没有使用了,使用的较多的都是它的加密版本SMTPS(465端口,SSL加密,不推荐使用)和STARTTLS(587端口,TLS加密,推荐使用)。