Java实现伪造邮件发信人
Java实现伪造邮件发信人
- 关键词
- 效果预览
- 背景说明
- 作业背景
- 环境
- 参考说明
- 实现代码
- 代码解析及输出
- 测试及避坑
- 启示
- 拓展阅读
关键词
Java、邮件、SMTP、伪造、发信人、邮箱、由……代发
效果预览
背景说明
作业背景
最近在做设计,设计里涉及到邮件通知功能,但是直接使用自己个人邮箱发送的话显得那啥一点,并且在Python SMTP发送邮件里发现是可以伪造邮件的,故打算把自己的邮箱“打扮”一下,将自己的设计模拟的更真实一点。可不要拿来做不好的事情哦
环境
- Win10、Linux
- Java8(不需要额外的jar)
参考说明
看了不少做JavaEmail的文章,基本上都是采用javax.mail.jar包做的,但是无法实现伪造发信人(这里的发信人指的是邮箱,这个包昵称是可以指定的。可能之前的setSender可以,但是我没用过,我下载的1.6.2版本的,MimeMessage对象没有setSender方法),主要参考了两篇文章(后面给出),都写的很好,我写这篇文章的目的是让朋友们多一个维度参考。下面是我参考的文章:
1.JAVA实现SMTP邮件发送
2.java发送邮件的两种实现方式(包括如何伪造发件人及其原理)
对了还有一篇:Java8 Base64 | 菜鸟教程
实现代码
喜欢图片的朋友看这个,喜欢代码的在后面
源代码:
import java.io.*;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
import java.util.Base64;public class SMTPSendMail {public static void main(String[] args) {String loginUsername = "sample@163.com"; //<- 登录邮箱,这里仅为示例String loginPassword = "JCTAJSNCUPEMKPZO"; //<- 16位授权密码String realAddressee = "receiver@xxx.com"; //<- 收件人邮箱String smtpServer = "smtp.163.com"; //<- smtp服务器地址int port = 25;String b64Username = Base64.getEncoder().encodeToString(loginUsername.getBytes(StandardCharsets.UTF_8));String b64Password = Base64.getEncoder().encodeToString(loginPassword.getBytes(StandardCharsets.UTF_8));try {Socket socket = new Socket(smtpServer, port);BufferedReader bfr = new BufferedReader(new InputStreamReader(socket.getInputStream()));PrintWriter pw = new PrintWriter(socket.getOutputStream(), true);//发送'helo'命令, 读取输出pw.println("helo " + "Stephen");System.out.println(bfr.readLine());//发送'auth login'命令pw.println("auth login");System.out.println(bfr.readLine());pw.println(b64Username); // 用户名base64System.out.println(bfr.readLine());pw.println(b64Password); // 授权密码base64System.out.println(bfr.readLine());//设置'mail from' 和 'rcpt to'pw.println("mail from:<"+loginUsername+">");System.out.println(bfr.readLine());pw.println("rcpt to:<" + realAddressee + ">");System.out.println(bfr.readLine());//设置'data'pw.println("data");System.out.println(bfr.readLine());/* 正文主体 */pw.println("subject:" + "主题什么的随随便便就好了"); // 主题// “伪造”发信人pw.println("from:" + "一方巨鳄 <xxxxxx@163.com>"); //格式:昵称 <显示的发件人邮箱>(伪发件人)pw.println("to:" + "管理员 <" + realAddressee + ">"); //指定收件人名称,有的smtp服务器可以把收件人显示的邮箱也改了// 这里smtp.163.com会"554 DT:SPM"退信pw.println("Content-Type:text/html;charset=\"utf-8\""); // 这里采用的是html类型,可换为纯文本plain类型pw.println();String text = "<html><body><table border=\"1\"> <h1>表格</h1>" +"<tr><th>姓名</th><td>理智</td></tr>" +"<tr><th>性别</th><td align=\"center\">男</td></tr></table></body></html>";pw.println(text);pw.println();pw.println("."); //内容部分结束System.out.println(bfr.readLine());//发送结束,退出pw.println("rset");System.out.println(bfr.readLine());pw.println("quit");System.out.println(bfr.readLine());} catch (IOException e) {e.printStackTrace();}}
}
代码解析及输出
可以看到,上面的代码主要是pw.println()
和bfr.readLine()
,前者主要是发命令的,而后者则是接收响应的。模拟Telnet客户端发邮件[1]。
输出
邮件效果在开头已给出,那是我用学校邮箱的smtp服务器发的,改了收件人显示的信息,没有被退信。
测试及避坑
我在使用
smtp.163.com
服务器的情况下在to:
命令之后接假收件人时遇到这个
554 DT:SPM 163 smtp10,DsCowAD3__ck_rxeJqxmBw--.19039S2 1589444132,please see
http://mail.163.com/help/help_spam_16.htm?ip=111.58.181.219&hostid=smtp10&time=1589444132
点进去看,是“退信代码说明”
解决办法:把图第49行的收件人改回真实收件人邮箱(上面的已改,原来的代码是pw.println("to:" + "管理员 <xxxxxx@qq.com>");
实现的就是效果图)就可以了。测试139邮箱时,一直报
550 2f015ebe0b3f97a-4e9fd Mail rejected
,ta没有给授权码,就是使用的登录密码,我尝试的所有办法都无法发邮件(无论是否伪造)
解决办法:暂无,劝君慎用139,或者有解决的踢我一脚谢谢测试sina邮箱,sina邮箱是要将
mail from
和from
进行匹配的,也就是无法通过这个方法进行伪造,有知道怎么做的也可以提醒我谢谢。
解决办法:我无。测试126邮箱,给qq邮箱发邮件,第一次可以伪造(显示代发,并且有一段特殊信息回显),之后就是显示真实的邮箱地址。
目前就测试了这几个邮箱服务商,总的来说就qq、163和126可以伪造发信人,这几个邮箱开启SMTP服务的话短信是自己发的短信费是自己掏的,所以写这篇文章是含有成本在里面的(含金量杠杠的
Java实现伪造邮件发信人相关推荐
- 如何预防收到伪造本域发信人的诈骗邮件
近日,很多伙伴都收到发件人显示本域用户发送给自己的诈骗邮件,如下图: 收发件人均为同一本域用户的诈骗邮件 邮件内容大部分是提示你邮箱账号被黑了,要求你支付相应的金额来解决问题.收到这种邮件后不用惊慌, ...
- java web前端邮件,javaweb之javamail
今日学习的知识是使用JAVAMail来发送邮件; 前期的准备工具,所需的jar包 下面给大家提供了下载jar包的地址 首先,发送邮件需要三步,1.需要得到session,2.创建MimeMessage ...
- java群发邮件_JAVA邮件群发 - Java-Android-jwebee - BlogJava
三.程序举例 1.首先是连接SMTP服务器,JAVAMAIL1.2不能实现SMTP服务的功能,但可以连接已有的SMTP服务器. //创建一个属性对象 Properties props=System.g ...
- 用java代码写邮件,已经测试成功!
1.首先创建一个继承自javax.mail.Authenticator的具体类,重写里面的getPasswordAuthentication()方法: 2.创建Properties对象prop,pro ...
- 【Skill】解决 QQ 邮箱无法更改发信人名称问题
问题 因为经常用 QQ 邮箱,但是前几天突然发现在网页版怎么都改不了 QQ 邮箱的发信人昵称了,后来才发现原来是 手机也登陆了 QQ 邮箱 的问题. 解决 在手机上的 QQ 邮箱 app 内更改自己的 ...
- python伪造邮件发件地址_Python3学习系列(四):编写属于自己的邮件伪造工具...
timg.jpg (158.2 KB, 下载次数: 92) 2017-10-21 13:33 上传 前言: 相信有些人也看过一些渗透,邮件伪造然后钓鱼这个在渗透中也是经典技巧了,那么邮件伪造又是如何运 ...
- 一个很有趣的问题:那些用QQ邮箱发应聘邮件的人啊(附:怎样写一封得体的电子邮件)
最近这个话题频频出现,而且讨论地越来越激烈,也越来越有趣.最开始是在人人网上当做笑口被大家广为扩散的那张图片,某大学在申请出国联系导师的时候使用******(数字)@qq.com的邮箱:之后又有了如下 ...
- 一个很有趣的问题:那些用QQ邮箱发应聘邮件的人啊(附:怎样写一封得体的电子邮件)...
最近这个话题频频出现,而且讨论地越来越激烈,也越来越有趣.最开始是在人人网上当做笑口被大家广为扩散的那张图片,某大学在申请出国联系导师的时候使用******(数字)@qq.com的邮箱:之后又有了如下 ...
- 伪造邮件钓鱼,要知道的秘密!
微信搜索逆锋起笔关注后回复编程pdf 领取编程大佬们所推荐的 23 种编程资料! 邮件钓鱼入门到入土 在大型企业边界安全做的越来越好的情况下,不管是 APT 攻击还是红蓝对抗演练,钓鱼和水坑攻击被越来 ...
最新文章
- win8和win8.1动态绑定数据到ListView
- 基于TextRank的关键词提取算法
- 单机运行环境搭建之 --CentOS-6.4安装MySQL 5.6.10并修改MySQL的root用户密码
- 18行代码AC——PTA 二叉树的遍历 (10分)——解题报告
- android中的add方法,Android入门之addWindow
- 小爱同学生病了,网友集体表示理解:小爱同学好好休息
- php 采集网站关键字,php远程获取网站的关键字信息(并附:php判断字符串编码)...
- 信息安全-工控安全需求分析与安全保护工程
- android studio gradle下载
- Python 字符串去除空格的方法
- picgo+onedrive+Typora用onedrive当图床
- java 支付宝支付 demo_java开发支付宝支付详细流程_demo的运行
- SIwave仿真入门 | PI篇——封装PDN参数仿真
- whale 帷幄:营销自动化saas系统 saas营销系统是什么意思
- Python 将TXT格式转换为手机通讯录格式vcf
- python爬取分析深圳二手房房价
- 1157 最高分和最低分
- 对话框绘制完成消息_这样绘制cad施工图,提升效率至少3倍以上!
- 北大青鸟汉字注释机内码_北大青鸟11SF主机调试软件里面的,汉字注释,联动逻辑,总线对应,191层显注释,291层显注释...
- 数据治理工程师CDGA备考心得、时间安排、题库资源
热门文章
- 文件无法上传到ftp服务器,无法上传文件到FTP服务器使用C++
- struct hdr_cmn
- Oracle 12c 读书笔记——筑梦之路
- 探讨STM32代码运行位置
- 微信引流软件哪里找?哪个引流软件比较可靠?
- 换了工作城市,社保和公积金的转移
- Pygame 官方文档 - Tutorials - 逐行的黑猩猩教程(Line By Line Chimp)
- 定制linux版本,定制属于自己的Linux操作系统
- BUUCTF not_the_same_3dsctf_2016
- Win10浏览器闪退问题解决(所有类型的浏览器都会发生闪退、包括chrome、firefox)
- 如何预防收到伪造本域发信人的诈骗邮件