利用Javascript进行HTML走私

作者:CyberSentinel公布时间:2025/03/13

第 1 阶段 — 初始诱饵

最初的邮件包括一个经典的“诱饵”,涉及呼叫者留下的所谓语音邮件,并敦促收件人下载包含 HTML 附件的 ZIP 文件,如图 所示。


image.png

下图进一步显示了电子邮件内容。

image-1.png


从电子邮件内容来看,该电子邮件似乎是由一家合法企业发送的。电子邮件的主题只是目标公司的名称,附件名称遵循“ Companyname Micro.protected.zip”的模式。ZIP 包含一个遵循相同命名模式的 HTML。HTML 包含经过混淆的 JavaScript,一旦目标打开 HTML 文件,它将自动执行几轮解码、反混淆和解密,最终导致定制的鱼叉式网络钓鱼页面。这种技术也称为“HTML走私”,攻击者将某些代码(例如 JavaScript)嵌入 HTML 文件中,该文件将由浏览器自动呈现。

第 2 阶段 – HTML 和 JavaScript

HTML 中嵌入的 JavaScript 将类似于下图所示的内容

image-2.png

该该脚本初始化一个数组,该数组似乎混合了二进制(例如1100011)和十六进制值(例如3c)。处理 JavaScript 时,解码功能通常位于文件末尾附近,在我们的例子中也不例外,如图所示:

image-3.png

解码函数很简单:它将验证字符是十六进制还是二进制格式,并使用执行解码fromCharCode。完成后,它将把解码的内容“写入”同一个 HTML 页面并执行它。在处理任何类型的 JavaScript 时,都有一组经典的线索表明正在发生一些恶意的事情,例如evaldocument.write

第 3 阶段 - JavaScript和JavaScript

但是我们如何让脚本自行解码呢?最简单的方法是document.write用替换console.log。这将简单地将 的内容decodedHtml(最终包含有效载荷或下一阶段)输出或重定向到控制台。

要执行此操作,请打开您最喜欢的浏览器:在我们的示例中,我们将使用 Google Chrome。请注意,您仍应在安全环境(如沙箱或虚拟机)中执行此类分析:某些 JavaScript 负载可能包含漏洞,会立即下载并执行恶意软件(而不是描绘网络钓鱼页面),或者可能包含一些隐蔽内容evals ,如果错过,可能会改变您期望的结果。

image-4.png

大获成功!看来我们能够获取有效载荷。但是,下一个编码块在值中等待u,并且脚本似乎调用托管在 Cloudflare 上的文件来实现进一步的功能和前面一样,让我们转到脚本的末尾,我们可以观察到以下函数:

image-5.png

如上代码中所示的常量和一个p与 Cloudflare 库交互的函数CryptoJS ,可用于处理特定的加密操作。在本例中,它负责在对 AES 加密块进行 base64 解码后对其进行解密。由于此实现是ECB模式下的 AES(使用 PKCS7 填充),因此只有一个硬编码密钥,不需要 IV。密钥是8527412153049366最后,函数q负责写入和加载(打开)解码和解密的内容。在下一节中,让我们像以前一样再次解码该脚本(也许,我们会得到最终的有效载荷)。

第 4 阶段 — — 最终有效载荷

与我们分析上一个脚本的方式类似,我们希望将输出记录到控制台,但存在一个问题:无法通过浏览器中的调试工具调用某些脚本功能,此外,有些window.onload 事件我们可能不想执行。那么我们该怎么办?

让我们使用攻击者使用的相同技巧,创建我们自己的“HTML 走私”来安全地解码、解密和记录输出。

首先,将其定义为 HTML 文件并调用 CryptoJS 库。我们选择从 Cloudflare 下载相同的库并将其离线存储,以确保我们的设备不会将任何内容发送到互联网 - 请注意,您也可以从在线资源中引用 JS 库,但是,以离线方式工作更安全。为了方便起见,您可以将新创建的 HTML smuggle 和 CryptoJS 库放在同一个目录中(在我们的例子中是 c:\demo)

image-6.png

接下来,我们可以简单地从恶意 JavaScript 中复制功能,包括 base64 编码的内容,以及 AES 密钥以及解码和解密功能

最后,我们要将其记录到浏览器的控制台并执行新添加的日志记录功能:

image-9.png

现在打开该文件,结果应该如下图所示:

image-10.png

我们已经可以观察到进一步的 JavaScript 功能(例如document.getElementByIdatob)以及看起来像伪随机命名的变量。换句话说,更多的 HTML 走私!最终的 HTML 文件(再次包含 JavaScript 内容)长达 131 行。

通过查看 HTML 文件,我们可以观察到几个功能(例如,不让搜索引擎将其编入索引、事件侦听器等),并且像以前一样,其中存在一些混淆。也就是说,唯一利用的混淆与 base64 编码的值和数据有关。下图给出了一个示例:

image-12.png

变量ficus和 yam包含 base64 解码的数据,当通过atob函数解码时(在 JavaScript 中/由 JavaScript 合法用于解码 base64)将显示https://login.microsoftonline.com/和授权参数,例如common/oauth2/authorize/client_id=00000002-0000-0ff1-ce00-000000000000

滚动到 HTML 文件的末尾将为我们提供以下功能:

image-13.png

启动一些变量后,HTML/JavaScript 将尝试加载iframe。iframe可用于多种(恶意)目的,但在本例中,它用于加载恶意 URL - 该 URL 将与 Microsoft Office 365 登录页面一起执行。

我们可以安全地解码这个 iframe,就像我们之前通过控制台所做的那样,但是,您必须删除insertAdjacentHTML 部分,因为它会动态地将 iframe 内容添加到显示的网站(不可见或可见)并因此加载它。

最后,运行修改后的 HTML 将得到以下结果:

image-15.png


1、新构建的 HTML 进行解码:执行

2、登录 Outlook:弹出窗口供目标登录

3、控制台选项卡中的解码值:iframe 内容

iframe 将尝试加载(包含电子邮件地址的 base64 值已被删除)将通过 href.li 重定向到恶意域。此域具有如上所示的 URI,并将向用户显示合法的 Microsoft Office 登录页面,验证凭据是否有效,最后将登录数据发送到此恶意域。

结论

虽然 HTML 走私可能不是一种新颖的方法,但它确实越来越受欢迎,特别是对于网络钓鱼活动,它被证明是一种简单而有效的解决方案,因为有效载荷传递通常在实际有效载荷(例如可执行文件)的阶段被检测到。因此,如果纯粹为了鱼叉式网络钓鱼而使用 HTML 走私,对 HTML 进行多种编码和混淆,可能会导致攻击者的活动获得巨大成功。