前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Swaks伪造邮件发件人绕过SPF

Swaks伪造邮件发件人绕过SPF

作者头像
黑白天安全
发布2020-07-23 11:13:17
6K0
发布2020-07-23 11:13:17
举报

MTP协议简介

代码语言:javascript
复制
简单邮件传输协议 (Simple Mail Transfer Protocol, SMTP) 是在Internet传输email的事实标准。
RFC821:https://tools.ietf.org/html/rfc821
•    SMTP默认端口:25
•    SSL SMTP默认端口:465

SMTP相关安全协议 - SPF

代码语言:javascript
复制
发件人策略框架(Sender Policy Framework , SPF)是为了防范垃圾邮件而提出来的一种DNS记录类型,它是一种TXT类型的记录,它用于登记某个域名拥有的用来外发邮件的所有IP地址。可确定允许哪些邮件服务器代表您的域来发送电子邮件
https://www.ietf.org/rfc/rfc4408.txt
"v=spf1 a mx ip4:47.100.47.4 -all"

设置正确的 SPF 记录可以提高邮件系统发送外域邮件的成功率,也可以一定程度上防止别人假冒你的域名发邮件。

SPF验证原理

代码语言:javascript
复制
假设邮件服务器收到了一封邮件,来自主机的 IP 是47.100.47.4,并且声称发件人为email@example.com。为了确认发件人不是伪造的,邮件服务器会去查询example.com的 SPF 记录。如果该域的 SPF 记录设置允许 IP 为47.100.47.4的主机发送邮件,则服务器就认为这封邮件是合法的;如果不允许,则通常会退信,或将其标记为垃圾/仿冒邮件。
因为不怀好心的人虽然可以「声称」他的邮件来自example.com,但是他却无权操作example.com的 DNS 记录;同时他也无法伪造自己的 IP 地址。因此 SPF 是很有效的,当前基本上所有的邮件服务提供商(例如 Gmail、QQ 邮箱等)都会验证它。

常见参数

代码语言:javascript
复制
all:结束标志,“-”表示只允许设置的记录为通过,“~”表示失败,通常用于测试,“+”表示忽略SPF
例如,这是一个比较常见的 SPF 记录,它表示支持当前域名的 a 记录和 mx 记录,同时支持一个给定的 IP 地址;其他地址则拒绝:
v=spf1 a mx ip4:47.100.47.4 -all

SMTP相关安全协议 - DKIM

代码语言:javascript
复制
DKIM是为了防止电子邮件欺诈的一种技术,同样依赖于DNS的TXT记录类型。这个技术需要将发件方公钥写入域名的TXT记录,收件方收到邮件后,通过查询发件方DNS记录找到公钥,来解密邮件内容。
https://tools.ietf.org/html/rfc6376

SMTP相关安全协议 - DMARC

代码语言:javascript
复制
DMARC(Domain-based Message Authentication, Reporting & Conformance)是txt记录中的一种,是一种基于现有的SPF和DKIM协议的可扩展电子邮件认证协议,其核心思想是邮件的发送方通过特定方式(DNS)公开表明自己会用到的发件服务器(SPF)、并对发出的邮件内容进行签名(DKIM),而邮件的接收方则检查收到的邮件是否来自发送方授权过的服务器并核对签名是否有效。对于未通过前述检查的邮件,接收方则按照发送方指定的策略进行处理,如直接投入垃圾箱或拒收。
DMARC协议是有效解决信头From伪造而诞生的一种新的邮件来源验证手段,为邮件发件人地址提供强大保护,并在邮件收发双方之间建立起一个数据反馈机制。

swaks工具简介

代码语言:javascript
复制
Swaks是由John Jetmore编写和维护的一种功能强大,灵活,可脚本化,面向事务的SMTP测试工具。可向任意目标发送任意内容的邮件。
swaks-SMTP协议下的瑞士军刀
kali Linux自带

基本使用语法:

代码语言:javascript
复制
1 swaks --to 123@qq.com     //测试邮箱的连通性;
2 选项说明:(更多高级功能请查man手册)
--from  000@qq.com     //发件人邮箱;
--ehlo  qq.com      //伪造邮件ehlo头,即是发件人邮箱的域名。提供身份认证
--body "http://www.baidu.com"    //引号中的内容即为邮件正文;
--header "Subject:邮件标题"   //邮件头信息,subject为邮件标题
--data ./Desktop/email.txt    //将正常源邮件的内容保存成TXT文件,再作为正常邮件发送;
–attach 添加附件

输出内容的含义 “===”:swaks输出的信息行 “*“:swaks中产生的错误 ” ->”:发送到目标的预期行(无错误) “<- “:服务器的预期回复(无错误) “<**”:服务器返回的错误信息

基本语法

代码语言:javascript
复制
swaks --body "内容" --header "Subject:标题" -t xxxxx@qq.com -f "admin@qq.com"  --server 你的邮件服务器地址 -p 25 -au <USER> -ap <PASS>

邮件服务器可以选择自己搭建一个或者使用smtp2go,smtp2go主要是相当于邮件托管,可以分发子账户进行发送。 下面的实验用的是自己搭建的。如何搭建的话,这个网上有很多教程,这里为了快速搭建,可以选择使用ewomail 建议自己搭一个或者找个偏点的没什么安全策略的smtp服务器 不然还是很大几率被扔进垃圾桶

swaks配合邮件服务器发送伪造的钓鱼邮件查看是否能通过SPF

代码语言:javascript
复制
swaks --to xxx@gmail.com --from admin@qq.com --ehlo gmail.com --body hello --server 邮件服务器地址 -p 25 -au  账号 -ap 密码
代码语言:javascript
复制
打开gmail邮箱可以看到虽然能发送出去但是SPF验证是失败的,很大几率会被扔进垃圾邮箱里面

SPF验证原理

代码语言:javascript
复制
如果mail.kevin.com是我的邮件服务器,那么gmail服务器收到的源IP肯定也得是mail.kevin.com的IP
gmail会验证邮件发送者的IP是否存在于smtp.from的域名配置列表里。
而上面这条命令
smtp.from是admin@qq.com 和mail.kevin.com的IP不同,所以SPF会验证失败被仍进垃圾桶
默认情况下 如果没有设置mail.from 也就是邮件头的from 则会使用smtp.from作为Mail.from,就是如果没有设置邮件发件人的话就会默认设置邮件服务器来源是邮件发件人

绕过SPF

由于邮件显示的是Header中的From不是smtp.from,因此可以将smtp.from设置为正常的邮件服务器地址,伪造一个Mail.From(发件人)即可。

代码语言:javascript
复制
swaks --to xxx@gmail.com --from @kevin.com(你的邮件地址) --h-From: '管理员<admin@qq.com>' --ehlo gmail.com --body hello --server 邮件服务器地址 -p 25 -au 账号 -ap 密码

Gmail接收到这封邮件后,会校验--from xxx@kevin.com中的kevin.com是否等于mail.kevin.com的IP,由于伪造后是相等的,所以完成了SPF的校验。

如果我想去除Mailer特征,就可以这么做:

代码语言:javascript
复制
 swaks --header-X-Mailer gmail.com --to xxx@gmail.com --from xxx@kevin.com(你的邮件地址) --h-From: '管理员<admin@qq.com>' --ehlo gmail.com --body hello --server 邮件服务器地址 -p 25 -au 账号 -ap 密码

如何检测域名是否可被伪造 可以推荐个小脚本 spoofcheck 地址https://github.com/BishopFox/spoofcheck

如何解决? 为了使得域名不会被伪造,需要为域名正确配置SPF、DKIM、DMARC。只配置SPF是不行的。

如有错误的地方,欢迎各位师傅指出,避免误导他人。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-07-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 黑白天实验室 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档