Gophish钓鱼测试平台——钓鱼邮件二维码替换功能开发
内容提要
该文章介绍了对钓鱼邮件中二维码替换功能的添加。通过对代码审计,发现了钓鱼邮件模板中链接字段的替换方法,并在此基础上添加了对图片链接字段的识别和替换功能。同时,还介绍了锚定收件人生成对应的rid和模板中链接替换的方法。最后,还提供了生成二维码和存储文件的方法。
延伸解读
从链接替换到二维码替换的改造思路
Gophish 原生只替换邮件模板中的超链接,无法处理二维码图片。作者通过代码审计发现,导入模板时系统会将所有 <a> 标签的 href 属性替换为 {{.URL}},于是仿照这一逻辑,增加对 <img> 标签 src 属性的识别与替换,使图片链接也指向 {{.URL}}。这一改造的关键在于复用现有的模板变量机制,而非重写整个渲染流程,降低了改动成本。
收件人 rid 与二维码生成如何衔接
文章指出,Gophish 在点击 Launch Campaign 时,会通过 NewPhishingTemplateContext 方法为每个收件人生成唯一的 rid,并拼接到钓鱼链接中。作者新增了 NewPhishingTemplateContextImg 方法,在原有逻辑基础上,用 rid 作为文件名生成二维码图片,存储到 qrcodefile 目录,并将 {{.URL}} 替换为二维码图片的访问链接。这样每个收件人收到的二维码都指向其专属的钓鱼页面。
二维码存储与访问路由的配套实现
为了让二维码图片能被邮件客户端加载,作者在生成二维码后,将其保存到程序目录下的 qrcodefile 文件夹,并构造出类似 http://host/qrcodefile/{rid}.png 的访问链接。同时,文章提到需要增加路由方法,使公网可以访问该目录下的图片。这一部分涉及文件路径处理、目录创建和 URL 拼接,是功能落地的必要环节,但文章未详细说明路由注册的具体代码。
Q&A
Gophish 平台默认支持替换钓鱼邮件中的二维码吗?
不支持。Gophish 仅对邮件中的链接进行替换,无法替换二维码。
如何让 Gophish 在导入模板时识别并替换图片链接?
在 controllers/api/import.go 的 ImportEmail 方法中,添加对 img 元素的遍历,将 src 属性设置为 {{.URL}},例如:d.Find("img").Each(func(i int, img *goquery.Selection) { img.SetAttr("src", "{{.URL}}") })。
Gophish 中 rid 是如何生成并用于替换模板链接的?
在 models/templete_context.go 的 NewPhishingTemplateContext 方法中,通过锚定收件人邮箱生成 rid,并将其作为查询参数添加到钓鱼 URL 中,替换模板中的 {{.URL}} 字段。
如何为每个收件人生成唯一的二维码并存储?
仿照 NewPhishingTemplateContext 编写新方法,在方法中根据 rid 生成二维码图片,保存到 qrcodefile 目录下,文件名为 rid.png,并返回该图片的访问链接用于替换 {{.URL}}。
在 Gophish 中如何区分发送的是钓鱼链接还是钓鱼二维码?
在点击 Launch Campaign 时增加识别方法,判断模板中替换的是链接还是二维码,若为链接则使用原方法,若为二维码则使用自定义的二维码生成和访问链接替换 {{.URL}}。
生成的二维码图片如何通过公网访问?
需要增加路由方法,使公网可以访问生成的二维码图片,图片链接格式为 http://yourdomain/qrcodefile/rid.png。