作者:2025/03/13
公布时间:第 1 阶段 — 初始诱饵
最初的邮件包括一个经典的“诱饵”,涉及呼叫者留下的所谓语音邮件,并敦促收件人下载包含 HTML 附件的 ZIP 文件,如图 所示。
下图进一步显示了电子邮件内容。
从电子邮件内容来看,该电子邮件似乎是由一家合法企业发送的。电子邮件的主题只是目标公司的名称,附件名称遵循“ Companyname Micro.protected.zip”的模式。ZIP 包含一个遵循相同命名模式的 HTML。HTML 包含经过混淆的 JavaScript,一旦目标打开 HTML 文件,它将自动执行几轮解码、反混淆和解密,最终导致定制的鱼叉式网络钓鱼页面。这种技术也称为“HTML走私”,攻击者将某些代码(例如 JavaScript)嵌入 HTML 文件中,该文件将由浏览器自动呈现。
第 2 阶段 – HTML 和 JavaScript
HTML 中嵌入的 JavaScript 将类似于下图所示的内容
该该脚本初始化一个数组,该数组似乎混合了二进制(例如1100011)和十六进制值(例如3c)。处理 JavaScript 时,解码功能通常位于文件末尾附近,在我们的例子中也不例外,如图所示:
解码函数很简单:它将验证字符是十六进制还是二进制格式,并使用执行解码fromCharCode
。完成后,它将把解码的内容“写入”同一个 HTML 页面并执行它。在处理任何类型的 JavaScript 时,都有一组经典的线索表明正在发生一些恶意的事情,例如eval
,document.write
。
第 3 阶段 - JavaScript和JavaScript
但是我们如何让脚本自行解码呢?最简单的方法是document.write
用替换console.log
。这将简单地将 的内容decodedHtml
(最终包含有效载荷或下一阶段)输出或重定向到控制台。
要执行此操作,请打开您最喜欢的浏览器:在我们的示例中,我们将使用 Google Chrome。请注意,您仍应在安全环境(如沙箱或虚拟机)中执行此类分析:某些 JavaScript 负载可能包含漏洞,会立即下载并执行恶意软件(而不是描绘网络钓鱼页面),或者可能包含一些隐蔽内容evals
,如果错过,可能会改变您期望的结果。
大获成功!看来我们能够获取有效载荷。但是,下一个编码块在值中等待u,并且脚本似乎调用托管在 Cloudflare 上的文件来实现进一步的功能。和前面一样,让我们转到脚本的末尾,我们可以观察到以下函数:
如上代码中所示的常量和一个p
与 Cloudflare 库交互的函数CryptoJS
,可用于处理特定的加密操作。在本例中,它负责在对 AES 加密块进行 base64 解码后对其进行解密。由于此实现是ECB模式下的 AES(使用 PKCS7 填充),因此只有一个硬编码密钥,不需要 IV。密钥是8527412153049366
。最后,函数q
负责写入和加载(打开)解码和解密的内容。在下一节中,让我们像以前一样再次解码该脚本(也许,我们会得到最终的有效载荷)。
第 4 阶段 — — 最终有效载荷
与我们分析上一个脚本的方式类似,我们希望将输出记录到控制台,但存在一个问题:无法通过浏览器中的调试工具调用某些脚本功能,此外,有些window.onload
事件我们可能不想执行。那么我们该怎么办?
让我们使用攻击者使用的相同技巧,创建我们自己的“HTML 走私”来安全地解码、解密和记录输出。
首先,将其定义为 HTML 文件并调用 CryptoJS 库。我们选择从 Cloudflare 下载相同的库并将其离线存储,以确保我们的设备不会将任何内容发送到互联网 - 请注意,您也可以从在线资源中引用 JS 库,但是,以离线方式工作更安全。为了方便起见,您可以将新创建的 HTML smuggle 和 CryptoJS 库放在同一个目录中(在我们的例子中是 c:\demo)
接下来,我们可以简单地从恶意 JavaScript 中复制功能,包括 base64 编码的内容,以及 AES 密钥以及解码和解密功能
最后,我们要将其记录到浏览器的控制台并执行新添加的日志记录功能:
现在打开该文件,结果应该如下图所示:
我们已经可以观察到进一步的 JavaScript 功能(例如document.getElementById
,atob
)以及看起来像伪随机命名的变量。换句话说,更多的 HTML 走私!最终的 HTML 文件(再次包含 JavaScript 内容)长达 131 行。
通过查看 HTML 文件,我们可以观察到几个功能(例如,不让搜索引擎将其编入索引、事件侦听器等),并且像以前一样,其中存在一些混淆。也就是说,唯一利用的混淆与 base64 编码的值和数据有关。下图给出了一个示例:
变量ficus
和 yam
包含 base64 解码的数据,当通过atob
函数解码时(在 JavaScript 中/由 JavaScript 合法用于解码 base64)将显示https://login.microsoftonline.com/
和授权参数,例如common/oauth2/authorize/client_id=00000002-0000-0ff1-ce00-000000000000
滚动到 HTML 文件的末尾将为我们提供以下功能:
启动一些变量后,HTML/JavaScript 将尝试加载iframe。iframe可用于多种(恶意)目的,但在本例中,它用于加载恶意 URL - 该 URL 将与 Microsoft Office 365 登录页面一起执行。
我们可以安全地解码这个 iframe,就像我们之前通过控制台所做的那样,但是,您必须删除该insertAdjacentHTML
部分,因为它会动态地将 iframe 内容添加到显示的网站(不可见或可见)并因此加载它。
最后,运行修改后的 HTML 将得到以下结果:
1、新构建的 HTML 进行解码:执行
2、登录 Outlook:弹出窗口供目标登录
3、控制台选项卡中的解码值:iframe 内容
iframe 将尝试加载(包含电子邮件地址的 base64 值已被删除)。将通过 href.li 重定向到恶意域。此域具有如上所示的 URI,并将向用户显示合法的 Microsoft Office 登录页面,验证凭据是否有效,最后将登录数据发送到此恶意域。
结论
虽然 HTML 走私可能不是一种新颖的方法,但它确实越来越受欢迎,特别是对于网络钓鱼活动,它被证明是一种简单而有效的解决方案,因为有效载荷传递通常在实际有效载荷(例如可执行文件)的阶段被检测到。因此,如果纯粹为了鱼叉式网络钓鱼而使用 HTML 走私,对 HTML 进行多种编码和混淆,可能会导致攻击者的活动获得巨大成功。