前言
从上个月开始,邮箱持续收到多封邮件,发件人和收件人都是我自己的邮箱地址。邮件内容中某黑客自称破解了我的密码,在我设备中植入了木马,还留了比特币地址,勒索几百刀,不给就怎样之类。这是最近的一封:
这是最近流行的一种诈骗手段。由于发件人就是用户自己的邮箱地址,不少人傻傻地信了,并且还真有人给比特币地址打钱。某国外安全部门近期也发了报告,声称这种诈骗手段已经累计敲诈了数百枚比特币,可真是闷声发大财啊。
其实这只是利用SMTP协议的漏洞来发的邮件。SMTP协议的信头可以任意构造,接收方也不校验发件人的真实性。用户的设备根本没有遭到任何入侵,黑客只是伪造了邮件的发件人而已。有些邮件甚至会附上你常用的密码,那是你的常用密码在其他地方泄漏了。可以用这个网站查一下自己的密码是否已经被泄漏,及时更换密码即可。
电子邮件原理
电子邮件发送过程中需要经过以下节点:
-
MUA(Mail User Agent),收发邮件的客户端。常见的Foxmail、Outlook等。
-
MTA(Mail Transfer Protocol),邮件传输代理。只负责邮件传输,不负责保存,相当于邮递员。常见的sendmail、Postfix等.
-
MDA(Mail Deliver Agent),邮件分发代理,负责储存收到的邮件。过滤垃圾邮件也在这一步。
-
MRA(Mail Receive Agent),邮件接收代理。把收到的邮件用IMAP或POP3传输给客户端。常见的Dovecot等。
流程如下:
-
发件人使用SMTP协议发送邮件,信封上写了发件人和收件人的地址。
-
邮递员MTA通过DNS服务器的MX记录找到收件邮箱的地址,把邮件投递过去。
-
收件方可能会通过SPF/DKIM/PTR校验发件人。这一步不是必须的。
-
大部分用户用的QQ邮箱/Gmail等服务的收件箱,相当于上图橙色部分。只要邮件能够投递到MDA中,并且不触发垃圾邮件过滤器,就可以被收件人收到。
SMTP协议
SMTP(Simple Mail Transfer Protocol),简单邮件传输协议。从上世纪80年代以来就被广泛使用,甚至比HTTP协议都要早,是电子邮件的事实标准。
SMTP是一个基于文本的“推”协议。发送方使用25端口,跟接收方建立TCP连接,然后推一些文本指令和内容过去,即可完成送信的过程。常用的指令如下:
-
HELO:向服务器标示用户身份
-
MAIL FROM:标示发件人
-
RCPT TO:标示收件人
-
DATA:邮件内容
-
QUIT:终止会话
其他指令请参考协议。下面用126邮箱的服务器做演示,使用telnet建立tcp链接,然后输入指令来发送邮件。假设发件人的邮件地址sender@126.com,邮箱登录密码password,收件人地址addressee@126.com。指令如下:
/*建立TCP连接,使用25端口*/
telnet smtp.126.com 25
Trying 220.181.15.113...
Connected to smtp.126.com.
Escape character is '^]'.
220 126.com Anti-spam GT for Coremail System (126com[20140526])
/*发送HTLO*/
HELO 126.com
250 OK
/*发送登录指令*/
AUTH LOGIN
334 dXNlcm5hbWU6
/*输入邮箱地址,需要对邮箱地址进行Base64编码*/
c2VuZGVyQDEyNi5jb20=
334 UGFzc3dvcmQ6
/*输入邮箱密码,需要对邮箱密码进行Base64编码*/
cGFzc3dvcmQ=
235 Authentication successful
/*填写发件人,邮箱地址需要加尖括号*/
MAIL FROM: <sender@126.com>
250 Mail OK
/*填写收件人,邮箱地址需要加尖括号*/
RCPT TO: <addressee@126.com>
250 Mail OK
/*填写邮件正文的指令*/
DATA
354 End data with
/*填写邮件正文,以回车+点+回车结束*/
subject:title
from:sender@126.com
to:addressee@126.com
hello world
.
250 Mail OK queued as smtp7,DsmowAAHeBEFfsFc3HuDBA--.53073S2
1556184891
/*终止会话*/
QUIT
221 Bye
Connection closed by foreign host.
-
以上指令红色表示输入,蓝色表示返回,黑色是注释;
-
SMTP指令不区分大小写,以上指令的关键字也可以用小写的;
-
指令顺序必须按照建立连接、HELO、登录、填写发件人和收件人、填写内容、邮件发送的顺序,否则会报指令顺序错误的错误;
-
登录的时候,邮箱地址和密码需要先经过Base64编码;
-
如果在126邮箱里开启了客户端授权码功能,则密码填的是授权码;
-
邮件正文以“回车+点+回车”结束。
你可以找任何一个支持SMTP协议的邮件服务商,用上述方式发送邮件。你也可以搭建自己的邮件服务器(推荐开源的EwoMail),然后就能用自己的邮件服务器来发邮件了。以上只演示了最简单的发邮件过程,高级的功能还有中文编码、二进制附件等,本文不做讨论。
安全性
SMTP是最古老的互联网协议之一,充斥着各种历史遗留问题。上文的发信过程中,发件人地址是由发件人自己填的。SMTP协议本身就不会校验发件人的身份,信封上写着发件人是谁,邮递员就相信发件人是谁。因此邮件的发件人是可以轻易伪造的。
为了防止伪造的发件人,可以用SPF、DKIM、PTR等方式校验收件人的有效性。这里只做简单介绍:
-
SPF(Sender Policy Framework),发件人保证框架。本质上是一条DNS记录,收件方校验发件方的IP,和DNS上的记录比对,来确认发件方是否一致。
-
DKIM(DomainKeys Identified Mail),域名密钥识别。发件人在邮件开头插入一段签名,收件人通过DNS查得公钥,解密验证。
-
PTR(Pointer Record),反向域名解析。通过发件人的IP去反查域名,校验和发件方域名是否一致。
参考上文电子邮件原理图,这些校验都是由接收方根据邮件内容和DNS上的记录进行比对,来判断发件人是否可信。这些是反垃圾邮件的手段之一,但不是必须的。比如 QQ邮箱 检查 SPF 失败就直接拒绝接收,但是 Gmail 仍然接收。
总结
本文介绍SMTP协议如何发送邮件,以及利用协议漏洞“伪造发件人”的方法。事实上你可以在谷歌上搜到很多网站提供“伪造发件人”的功能,思路与本文所述类似。收到奇怪的电子邮件的时候请务必当心。
参考文献
本文未经许可禁止转载,如需转载关注微信公众号【工程师加一】并留言。