反邮件伪造技术SPF、DKIM、DMARC

一、前言

在写上篇 https://www.cnblogs.com/wkzb/p/15401932.html 随笔的时候,留了一个坑说要再写一篇随笔实操任意邮件伪造的方式。然而在最近的实验中,我发现很多文章提到的方式都已经无法复现了,达到最好的效果是可以成功伪造发件人,但是会有一个括号标记由哪个域名代发,类似下图这样

 

这相比于SPF记录配置不当达到的邮件伪造效果差一些,并且我觉得从视觉上使这个域名和想要伪造的域名很像显然没有SPF配置不当造成的任意邮件伪造优美(但是视觉上伪造真的有很强的迷惑性,在红队中会很好用,可以参考这篇 https://mp.weixin.qq.com/s/tOOBZ1aC6SsjslCM70WKBQ 学习,这里就暂时不实验了),如果后续我发现了效果完美的伪造方式,会跳出来更新的。接着我又去学习了SPF、DKIM、DMARC的相关原理,想要了解为什么会有“代发”这种邮件伪造方式,这里就浅显的更新一些我的理解吧(主要是上次立了还要再更一篇邮件伪造随笔的 flag,不写点什么心里痒痒)

 

二、SPF

上一篇介绍了SPF的定义、作用和语法,它的作用可以用下图抽象出来(图是网上找的)。当定义了域名的SPF记录之后,邮件接收方的服务器在接收到邮件后,使用检查域名SPF记录的方式来确定发件人是否是合法的。例如检查IP地址是否被包含在域名SPF记录里面,如果在,就认为是一封合法的邮件,否则认为是一封伪造的邮件进行退回或丢弃处理。

 

但是这样检测垃圾邮件的方式有一定的局限性,举个栗子,域名 aaa.com 设置了SPF记录,并发送了一封邮件给 beiwo@bbb.com 用户,这个用户又想把邮件转给 yhck@ccc.com 看看,ccc.com 的邮件服务器发现这封邮件来自 aaa.com,但是SPF记录中没有发送方 bbb.com 邮服的IP地址,就会将这封邮件误认为是垃圾邮件。一些邮件服务商解决SPF记录局限性的方法是,在转发邮件时修改邮件的发件人,但这在理论上并不优雅,于是诞生了DKIM技术。

 

三、DKIM

DKIM是 DomainKeys Identified Mail 的缩写,中文译作“域名密钥识别邮件”。这是一套电子邮件认证机制,使用公开密钥加密的基础提供了数字签名与身份验证的功能,以检测寄件者、主旨、内文、附件等部分有否被伪冒或窜改。一般来说,发送方会在电子邮件的标头插入 DKIM-Signature 及电子签名信息。而接收方则通过DNS查询得到公开密钥后进行验证。(查资料得知:目前万网不支持DKIM,新网支持DKIM)

查看一个域名的DKIM记录命令:

nslookup -type=txt dkim._domainkey.example.com  //windows
dig -t txt dkim._domainkey.example.com          //linux

 

接着第二节SPF中的情景举栗子,DKIM要求域名 aaa.com 在邮件服务器中生成一个密钥对,私钥保存在 aaa.com 的邮服内,公钥通过DNS记录公开。域名 aaa.com 的服务器在向 bbb.com 发送邮件时,使用私钥对邮件内容签名,并将签名与邮件内容一起发送给 bbb.com 的服务器。bbb.com 收到 aaa.com 的邮件时,查询 aaa.com 的DNS记录,拿到公钥,再使用公钥和签名验证邮件内容,如果验证不通过,则将邮件判定为伪造的邮件。

在第二节SPF记录会产生局限性的邮件转发情形内(aaa.com->bbb.com->ccc.com),ccc.com 只需查询 aaa.com DNS记录中的DKIM公钥即可认证邮件是否为伪造邮件了,并且由于 aaa.com 使用了DKIM私钥对邮件内容签名,在转发的过程中也不会出现中间人篡改邮件内容的问题了。

但是,这种方式还是可以绕过的!!

因为SPF记录定义的发送方地址是 RFC5321.MailFrom 中规定的字段(Return-Path),DKIM则是直接在邮件头里携带了域名字段(DKIM-Signature: d=),借用在知乎看到的一个师傅的解释:邮件存在信封和信笺两个不同的概念,信封上的信息是给邮递员看的,包含了从哪里来到哪里去的寻址信息,而信笺内的信息是给收件人看的,所以信封和信笺上写的收发件人可以完全没有关系。套用在电子邮件上,电子邮件的“信封”对于普通用户通常是不可见的,只对中转过程中的各种服务器可见。Return-Path 即是信封上的发送方,信封上还标注了DKIM验证的域名字段 DKIM-Signature: d=fake.com ,只要 fake.com 域名发送邮件并使用 fake.com 的公钥进行验证即可通过SPF和DKIM检查,将该邮件发送到收件人的邮箱,而邮件服务展示给普通收件人的发件地址却为“信笺”内的 From 字段的内容,实现了伪造邮件的目的,于是诞生了DMARC技术。

Return-Path: admin@fake.com
DKIM-Signature: d=fake.com, b=xxxxxxxxxxxxxx
From: <admin@aaa.com>
To: <beiwo@bbb.com>

 

四、DMARC

DMARC是 Domain-based Message Authentication, Reporting and Conformance 的缩写,中文译作“基于域的消息认证,报告和一致性”。

举栗子,它并没有规定具体的验证措施,而是基于SPF和DKIM(或二者之一)。它规定,SPF记录的发件人(Return-Path)或DKIM记录的发件人(DKIM-Signature: d=)二者至少需有其一与 From 头对应,即信封上的两个发件人最少要有一个与信笺中的发件人一致。当然DMARC技术在实际实现过程中还会有很多细节,这里只是抽象出了一部分易于理解的概念。

查看一个域名的DMARC记录命令:

nslookup -type=txt _dmarc.example.com    //windows
dig -t txt _dmarc.example.com            //linux

 

五、总结

理解了反邮件伪造技术SPF、DKIM、DMARC的原理后,我在第一节提出的代发邮件是怎么实现的问题就可以在这篇随笔中找到答案了,反邮件伪造技术不只需要发件方邮服配置SPF等记录,还要求收件方支持相关的验证,只有双方配合协作才可以尽可能的避免邮件伪造问题。最后再贴两个在线测试工具检测DKIM和DMARC是否正确配置。

DKIM测试工具:https://dmarcly.com/tools/dkim-record-checker 

DMARC测试工具:https://dmarcly.com/tools/dmarc-checker

 

 

参考文章:

https://saucer-man.com/information_security/452.html#cl-3

https://learnku.com/articles/54156

https://www.zhihu.com/question/21857308

https://juejin.cn/post/6844904116804648973#heading-10

 

posted @ 2021-11-17 23:07  beiwo  阅读(1303)  评论(0编辑  收藏  举报