导语:一般来说,我们收到一封邮件之后,都会首先看发件人,如果是比较重要的邮件,我们可能会去看发件人地址,但是,如果发件人是伪造的,你还能知道是谁在给你发邮件么?

0x00 这是个啥?

一般来说,我们收到一封电子邮件后,都会首先看发件人,如果是比较重要的邮件,我们可能会去看一下发件人地址。但是,如果这个邮件的发件人是伪造的,你还能知道到底是谁在给你发邮件么? 

当我们在谷歌搜索“发件人伪造”相关内容的时候,可以看到很多很多的网站提供了实现这种功能的方法与思路: 

1539051635438.png

因为笔者并没有对这些网站的内容进行测试,也不知道这些方法能不能成功伪造,但是可以肯定的是,确实是有方法可以伪造电子邮件的发件人。

那到底是什么导致的发件人伪造呢?下面我们来分析分析造成发件人伪造的成因。

0x01 SMTP是什么?

要想了解成因,我们需要首先了解一下什么是SMTP。

首先先了解一下几个概念:

MUA:Mail User Agent(用户邮件代理),用户通过MUA接收发送邮件,例如Outlook, FoxMail等。

MTA:Mail Transfer Protocol(邮件传输代理),是SMTP的一种实现,MTA仅仅负责邮件的传输。如果信件的目的地并不是本身的用户,且该封信的相关数据符合使用MTA的权力,那么MTA就会将该封信再传送到下一部主机上。这即是所谓的转递的功能。

MDA: Mail Deliver Agent(邮件分发代理),负责将接收到的邮件保存在邮件服务器上,在这里可以设置对邮件进行过滤或自动回复。

MRA: Mail Receive Agent(邮件接收代理),用来实现IMAP,POP3协议,负责与MUA交互,将服务器上的邮件通过IMAP以及POP3传输给客户端。

SMTP全称是Simple Mail Transfer Protocol,直译过来就是简单邮件传输协议,主要的工作就是把邮件信息从发件人的邮件服务器中传送到接收人的邮件服务器中,偶尔我们使用MUA来发送邮件的话,也承载传输用户邮件到发件服务器的功能。但是SMTP存在一个问题,就是没有对发送方进行一个身份验证。用下面的图来说明一下邮件的投递过程。

1539064815052.png

1、用户利用MUA寄信到MTA,这里面包含了几个项: 

发信人与发信网站,例如 [email protected]。其中evi1cg.me就是发信网站,即收信件的MTA。 

收信人与收信网站,例如 [email protected],其中admin就是email.server里的一个账号。 

2、当MTA收到信件后,会通过DNS的MX记录进行查询,如果email.server是MTA自己,此时MTA就会把邮件交给MDA处理,放置到收信者的信箱中。 

3、如果email.server不是自己,那么这个信件就会被转送出去。

4、当远程MTA收到本地MTA转发的邮件后,会将信件交给它的MDA处理,等待用户的读取或下载。

正是由于MTA之间转发邮件是不需要认证的,所以这就成了可以伪造发件人的原因。

0x02 怎么搭建SMTP Server?

如何快速搭建自己的SMTP Server?这个网上有很多教程,这里为了快速搭建,可以选择使用ewomail,代码是开源的,搭建起来也比较方便,也有很好的说明文档。EwoMail是基于postfix和Dovecot,按照说明文档很快就可以部署完毕了,部署完毕以后需要添加用户账号: 

1539071369229.png

之后就可以通过添加的账号来发送邮件了。

0x03 如何伪造域名?

关于伪造域名有一个很好用的工具SimpleEmailSpoofer,下面我们就使用这个工具来测试一下:

python SimpleEmailSpoofer.py -t 目标邮箱 -f 要伪造的发件人地址 -n From_name -e 邮件内容 -j 邮件主题 -s 你自己的smtp地址 -p 25 --user 你添加的用户 --pass 你添加用户的密码

1539071731274.png在这里可以看到报错了,Sender address rejected: not owned by user xxx, 这里是postfix设置的问题。需要进行一下修改/etc/postfix/main.cf 找到smtpd_sender_login_maps,修改为:

smtpd_sender_login_maps = mysql:/etc/postfix/mysql/mysql-sender-login-maps.cf,pcre:/etc/postfix/login_maps.pcre

新建/etc/postfix/login_maps.pcre

/^(.*)$/ [email protected]

:意思是允许用户[email protected]的用户使用任意domain。

找到smtpd_recipient_restrictions,删除reject_unknown_sender_domain,这样就不会对发送的域进行验证了。

修改完成以后,执行以下命令:

postmap /etc/postfix/login_maps.pcre
postfix reload

修改完成以后,再次发送:

1539072657218.png

查看gmail: 

1539078304784.png

1539072834239.png

当然,在原始邮件里面,还是有自己的域名信息。至于如何尽量减少自己的信息,可以参考这篇文章

经过测试,如果收信服务器对SPF校验不通过的邮件未作处理,仍然可以伪造添加过SPF记录的域。如QQ邮箱检查SPF失败就直接拒绝接收邮件,但是Gmail仍然接收。这里要注意一点,SPF中如果配置为~all,则表示为接受来信,但是做标记,QQ邮箱里就会接收到此类伪造的邮件,不过会放置于垃圾邮件里。

0x04 如何检测?

这里有一个工具可以用来检测域名是否可以被伪造:spoofcheck,使用很简单,比如baidu: 

1539074907929.png

0x05 如何解决?

为了使得域名不会被伪造,需要为域名正确配置SPF、DKIM、DMARC。只配置SPF是不行的,关于SPF的配置可以参考这里,关于DKIM的配置可以看这里,关于DMARC的配置可以参考这里

0x06 参考

1、https://www.jianshu.com/p/610d9bf0ae8b 

2、http://lomu.me/post/SPF-DKIM-DMARC-PTR 

3、https://serverfault.com/questions/318334/how-to-enforce-sender-address-to-be-logged-in-userexample-org-in-postfix 

4、https://major.io/2013/04/14/remove-sensitive-information-from-email-headers-with-postfix/ 

5、https://realtechtalk.com/Postfix_how_to_secure_outgoing_authenticated_emails_for_privacy_and_hide_the_IP_address_mailer_and_other_things-1573-articles

源链接

Hacking more

...