钓鱼工具包解剖:假页面背后发生了什么
钓鱼页面几乎从来都不是手写出来的。绝大多数情况下,它来自一个现成的压缩包,也就是钓鱼工具包:下载一个 .zip 文件,放到租用或被入侵的服务器上,几分钟内就能投入使用。下面就来看看,从表面伪装到窃取的数据,这背后到底藏着什么。
五分钟就能搭好的工具箱
工具包的第一部分是门面:一份真实网站(银行、通讯服务、税务部门……)的 HTML、CSS 和 JavaScript 代码副本。获取这些代码很简单,任何浏览器都能保存网页。工具包要做的,是让它变得可用:输入框被连接到一个脚本上,这个脚本会捕获输入的所有内容,而不是像真实服务那样去验证密码。
为了活得更久,工具包往往会隐藏自身的运作方式。捕获数据的脚本常常被编码(比如用 Base64),这让它一眼看上去无法阅读,也更难被搜索引擎爬虫或自动安全扫描器(它们会在代码中查找已知关键词)发现。这算不上强加密:只要有人愿意花时间解码,就能轻松破解。它主要是为了在被发现之前,多争取几个小时或几天的时间。
受害者输入时,页面在检查什么
一个精心制作的工具包不会随便记录任何内容。它会像真实网站一样,对输入内容进行实时验证,原因有两个:制造一种正规表单的假象,更重要的是不让攻击者被无法使用的数据淹没。
- 电子邮箱格式会被逐字符检查(是否有「@」、域名是否有效等)。
- 银行卡号会经过卢恩算法(Luhn algorithm)校验:这是一种简单的数学公式,用来判断一串十六位数字是否可能对应一张真实的卡,而完全不需要了解这张卡本身的任何信息。随意编造的卡号几乎总是无法通过这个测试;工具包会拒绝这次输入,再次要求填写卡号,同时给人一种网站十分严谨的印象。
最有效、也最不易察觉的部分,与多因素认证(MFA / 2FA)有关。许多新型工具包会在密码输入完成后,立即显示一个「正在验证……」之类的加载界面。与此同时,在幕后,攻击者正用刚刚窃取到的凭证实时登录真实网站。真实网站随后会向受害者发送一条真实的短信验证码,受害者深信不疑地将其输入到假页面上:工具包会立刻将其转发给攻击者,攻击者再把它输入到真实网站上。受害者看到的只是一个转得稍久一点的加载界面;而攻击者却已经获得了完整的访问权限,一次性验证码也一并到手。
这种机制仍属于人工操作的布局,需要攻击者手动确认。也存在自动化程度高得多的版本:服务器在受害者和真实网站之间插入假页面,全程无需任何人工介入——这正是AiTM:当钓鱼窃取的不只是密码,还有你的会话指南所讨论的主题。
数据真正流向何处:三条出口
数据经过验证后,必须离开服务器,才能送到攻击者手中。在当前的工具包中,反复出现三条通道:
- Telegram 或 Discord 的 webhook:当今使用最广泛的方法。工具包向一个私有的 Telegram 或 Discord 频道发送一个简单的请求,每条被窃取的凭证都会立即出现在攻击者手机上的一段对话中。速度快、免费,而且不查看页面源代码就很难发现。
- 发送电子邮件:工具包使用 PHP 语言的
mail()函数,把每次输入的内容作为一份简短的文本报告,发送到攻击者指定的地址。 - 本地日志文件:更为简陋的做法,工具包会把每一条窃取到的数据直接写入服务器上的一个隐藏文件(
.txt或.csv),攻击者随后再来取走。
这三条通道并不互斥:许多工具包会同时使用即时 webhook 以便立刻收到通知,并配备一个备份文件,以防 webhook 失效。
落幕:重定向与清理
数据发出之后,假页面并不会戛然而止:它会把受害者重定向到被仿冒服务的真实登录页面(例如 login.live.com),常常还附带一条不显眼的错误提示。这样做想要达到的效果十分精准:受害者会以为自己是密码打错了,于是在真实网站上重新输入凭证,正常登录……对此毫无怀疑。
有些工具包做得更进一步,会在第一次得手之后自我保护:清除可能暴露其运作方式的日志,或者屏蔽受害者的 IP 地址,这样一来,第二次访问(比如某位研究人员回来检查该页面)看到的只是一个空白页面或一个错误提示,而不是完整的陷阱。
如此精心设计的布局,最终是如何被识破的
尽管处处小心,工具包仍会留下可被利用的痕迹。最常见的是服务器配置错误:开放目录(directory listing),它让任何人都能浏览网站文件夹,并借此下载工具包原封不动被上传时的那份 .zip 压缩包。一旦拿到这份压缩包,研究人员往往能以明文或几乎未加密的形式,找到真正关键的凭证:Telegram 机器人的令牌(token)、Discord 频道的标识符,或者用来接收数据的电子邮箱地址。
这些凭证所涉及的并不只是一个页面:同一个机器人令牌常常在同一名攻击者的多次行动中被反复使用。因此,向 Telegram 或 Discord 举报它,就可能一下子切断一整批网站,其影响范围远远超出被发现的那一个。这与邮件发送基础设施的原理相同,在指南分析一次钓鱼攻击:从消息到基础设施中有详细说明:每一个被发现的元素都是一个可以撬动的支点,托管该工具包的服务器同样可以像举报任何钓鱼页面一样,向其托管商举报(参见在托管商处找到正确的滥用举报地址)。
在走到这一步之前,第一反应仍然是先检查那条把人引向此页面的链接。只需把可疑邮件粘贴到 Baitback 中,该工具就会跟踪所有重定向、识别发送服务器及其托管商,并直接准备好举报信息,无需自己去翻查工具包的代码。
- 钓鱼页面几乎总是来自一个现成的工具包,经过克隆再混淆处理,以拖延被发现的时间。
- 实时校验(卢恩算法、邮箱格式、实时中转的多因素认证)用于过滤掉无法使用的数据,并窃取一次性验证码。
- 被窃取的数据最常通过 Telegram 或 Discord 的 webhook、PHP 发送的邮件,或本地日志文件外泄。
- 最终跳转到真实网站,是为了打消受害者的疑虑。
- 开放目录可能泄露工具包的完整压缩包,连同能一举切断攻击者整套基础设施的凭证。