如何发送伪造的电子邮件
2017-11-03 18:43
316 查看
今天邮箱里收到了一份钓鱼邮件,幸好没有打开,于是动起了实现一把的冲动。
这里是一个java版本的实现:http://download.csdn.net/download/m0_37876745/10103351,文末有一个python版本的实现。这里是一份java实现的stmp邮件,对比文章末尾的python版本,我们又一次可以感受到python的锋利,人生苦短,我用C++,咳咳
最近在看有关协议分析的资料,其中谈到了邮件传输协议(SMTP)的工作原理,深受感触。之后在网上又搜索了一些相关的资料,大概的整理了一下,希望对大家有帮助,有不对的地方请批评指正。
对照此方法可以检验你的邮件服务器是否有此方面的安全缺陷。对用此方法而引起的后果自负(如需转载,请注明信息来源)
一、SMTP 邮件的传输
共分为三个阶段:1、建立连接2、数据传输3、连接关闭
首先在建立连接阶段我不用再罗嗦,主要就是TCP的三次握手。而问题就出现在第二个阶段(数据传输)在此过程中可以人为控制。邮件在传输的时候,我个人认为是通过五条命令来实现(有的资料上说的是其中三条命令)的分别是:
Helo
mail from:
rcpt to:
data
quit
注:(这五条命令是内嵌在程序中自动完成,对用户来说是透明的。比如OUTLOOK、foxmail等程序)后面我会具体说明如何使用这些命令。
五条命令的含义:
Helo 表示与服务器内处理邮件的进程开始“通话”
mail from: 表明信息的来源地址,也就是要伪造的地址
rcpt to: 邮件接收者的地址
data 邮件的具体内容
quit 退出邮件
二、SMTP 数据包分析
下面是一个通过FOXMAIL程序发送邮件并进行抓包的分析(作了适当的修改):
172.17.1.1是邮件服务器地址,域名是abc.cn
192.168.0.1是客户端地址;请留意粗体字部分
Source | Destiination | Protocol | Info |
172.17.1.1 | 192.168.0.1 | SMTP | RESPONSE:220 abc.cn ESMTP sendmail 7.14.2/7.14.2; Thu, 22 may 2010 23:30:60 +0800 (CST) |
192.168.0.1 | 172.17.1.1 | SMTP | Command: HELO abc.cn |
172.17.1.1 | 192.168.0.1 | SMTP | Response: 250 abc.cn Hello [172.17.1.1],pleased to meet you |
192.168.0.1 | 172.17.1.1 | SMTP | Command: MAIL FROM:<admin@abc.cn> |
172.17.1.1 | 192.168.0.1 | SMTP | Response: 250 2.1.0 <admin@abc.cn> …. Sender ok |
192.168.0.1 | 172.17.0.1 | SMTP | Command: RCPT TO: <abc@abc.cn> |
172.17.0.1 | 192.168.0.1 | SMTP | Response: 250 2.1.0 <admin@abc.cn> …. Recipient ok |
192.168.0.1 | 172.17.0.1 | SMTP | Command:DATA |
172.17.0.1 | 192.168.0.1 | SMTP | Response: 354 Enter mail,end with “.”on a line by itself |
192.168.0.1 | 172.17.0.1 | SMTP | Message Body |
172.17.0.1 | 192.168.0.1 | SMTP | Response: 221 2.0.0 ab.cn closing connection |
下面是对数据包解析后的信息并注说明:
220 abc.cn SMTP sendmail 7.14.2/7.14.2; Thu, 22 may 2010 23:30:60 +0800 (CST)
(邮件服务器反馈给你的信息,可以了解该邮件服务器的大致情况)
HELO abc.cn (邮件地址的域名比如SINA邮箱:sina.com.cn;也表述你所在的域,此处是为了与邮件服务器进程“通话”类似于自我介绍)
250 abc.cn Hello [172.17.1.1], pleased to meet you (邮件服务器反馈给你的信息)
MAIL FROM: <admin@abc.cn>(邮件源地址,也就是伪造的地址)
250 2.1.0 admin@abc.cn... Sender ok(表示邮件服务器认可伪造的地址)
RCPT TO: <abc@abc.cn> (邮件接收者的地址)
250 2.1.5 <abc@abc.cn>... Recipient ok(服务器认可此地址,前提是邮件服务器中必须有此账号)
DATA (邮件的具体内容)
354 Enter mail, end with "." on a line by itself(上面已经说明)
Date: (邮件的日期)Thu, 22 May 2010 11:30:40 +0900
From: (邮件的来源地址) "admin" < admin@abc.cn >
To: (邮件接收者的地址) "abc" < abc@abc.cn >
Subject: (邮件的主题) mail test
邮件的具体内容,此处略…….
250 1.0.0 m4M3Ulgx010724 Message accepted for delivery(邮件成功投递)
QUIT (发送成功,执行退出命令)
221 2.0.0 abc.cn closing connection (成功关闭与abc.cn的连接)
题外话:
为了体现所发邮件真实可性,注意上面加下划线的部分。需要在data中要包含from(伪造的邮件地址)、to(邮件的接收者地址)、subject(邮件的主题)、date(时间)这几个关键字。也就是我们在邮件中看到的“完整邮件头”下面是一个事例:
From: "admin" <admin@abc.cn> (你伪造的地址)
To: abc@abc.cn (邮件接收者的地址)
Subject: mail test (邮件的主题)
Date: Fri, 16 May 2010 12:45:39 +0800 (邮件的时间信息)
三、具体实现过程
在我们了解了SMTP后,现在开始描述实现过程
第一步 进入字符模式,windows下是DOS:
第二步 启动telnet程序:
c:\telnet 172.17.1.1 25
注意:登录的是25端口,
登录成功后邮件服务器会反馈一个信息“RESPONSE:220 abc.cn ESMTP sendmail 8.14.2/8.14.2; Thu, 22 may 2010 23:30:60 +0800 (CST)”
第三步 注意此时的字符界面是没有任何提示,直接输入:
HELO abc.cn (想要伪造邮件的地址域名,比如SINA邮箱:sina.com.cn)
系统会反馈一个信息“Response: 250 abc.cn Hello [172.17.1.1],pleased to meet you”表示邮件系统认可
第四步 输入:
MAIL FROM :admin@abc.cn (不能缺少“:”号,下面同样,邮件发送者的地址)
系统反馈信息“Response: 250 2.1.0 <admin@abc.cn> …. Sender ok”
第五步 输入:
RCPT TO :abc@abc.cn (邮件接收者的地址)
系统反馈信息“Response: 250 2.1.0 <admin@abc.cn> …. Recipient ok”
第六步 输入:
DATA 回车
(开始输入邮件正文,完成后一定要“回车”之后输入“.”号)
. (注意是英文状态下的“.”号,表示邮件输入完毕,最后再“回车”)
第七步 输入:
QUIT (邮件内容输入完成,退出)
系统反馈信息“Response: 221 2.0.0 ab.cn closing connection”
到此为止邮件发送完成
最后说明:在使用此方法发送邮件的时候,不管如何伪造发件人的地址,但是在接收人的邮件中都会显示你的真实IP
这里附带一份python实现代码,可以看出,实现一个钓鱼邮件是非常简单的事情。
import smtplib import email.mime.text msg = email.mime.text.MIMEText(""" <h2 align="center">奖学金通知</h2> <p align="center">同学,请速前往 <a href="http://diao-yu-wangzhan.heiheihei">奖学金领取</a> 领取你的奖学金。</p> """,'html','utf-8') msg['Subject'] = '奖学金通知' msg['From'] = u'XX大学<admin@host.cn>' //发送方,可以自己编辑 msg['To'] = 'xxx@host.com'//收件人 try: smtp = smtplib.SMTP() smtp.connect('smtp.xx.xx.cn', '25')//smtp服务器链接 smtp.login('***username***','***password***') smtp.sendmail('***username***', 'xxxx@host.com', msg.as_string()) smtp.quit() print('Sucess!') except Exception as e: print(e)
相关文章推荐
- 如何发送伪造的电子邮件
- linux如何发送电子邮件
- [职业经历]实用问答——如何用电子邮件发送简历?(转载)
- 如何在 Exchange 2003 中限制可以向另一个用户或通讯组发送入站 Internet 电子邮件的用户
- 伪造邮件攻击,看我如何给网易邮箱APP发送垃圾邮件【二】
- 如果不使用 SQL Mail,如何在 SQL Server 中发送电子邮件
- [PHP]如何使用PHP发送包含附件的电子邮件
- 如何发送成功的电子邮件简报(Newsletter)?
- 如果不使用 SQL Mail,如何在 SQL Server 中发送电子邮件
- 如何使用PHP通过SMTP发送电子邮件
- Exchange 2010 启用匿名 如何防止任意伪造一个邮件地址发送给内部账号!
- 如何使用PHP发送包含附件的电子邮件 笔记
- 极客开源-如何使用Java来发送一封电子邮件?
- 如何使用 Cdosys.dll 库使用 Visual C# 中发送电子邮件带有附件接收邮件
- 如何在MFC应用程序中使用MAPI32.DLL发送电子邮件。
- Django应用程序中如何发送电子邮件详解
- 如何使用表单发送电子邮件?
- 如何使用C#发送电子邮件
- VC学习资料收集(28):如何在MFC应用程序中使用MAPI32.DLL发送电子邮件
- 如何实现电子邮件的自动发送?