网络安全领域近日发现了一种新型的Magecart网络攻击,这次攻击采用了一种极具隐蔽性的手法,利用了网站的默认404错误页面来隐藏恶意代码。你可能对404错误页面并不陌生,它通常出现在你访问一个不存在的页面时。然而,攻击者却利用这个看似普通的错误页面来进行恶意活动。他们巧妙地将恶意代码注入到404页面中,使得攻击更加难以察觉。当你无意中进入受感染的网站并看到404错误页面时,你可能完全不知道自己已经成为攻击的目标。这种新型攻击方式给安全防御带来了更大的挑战,我们需要保持警惕,并采取措施来保护自己免受这种隐蔽攻击的威胁。
内容提要
• Akamai安全情报组发现了一个Magecart网站盗取活动,该活动针对的是大量网站,其中包括食品和零售行业的大型组织。
• 这一活动之所以引人注目,是因为它采用了三种先进的隐藏技术,其中一种技术是我们以前从未见过的,特别是操纵网站的默认 404 错误页面来隐藏恶意代码,这给检测和缓解带来了独特的挑战。
• 另外两种混淆技术展示了攻击者为躲避检测和延长攻击链而不断演变的战术。
• 随着网络盗刷攻击变得越来越复杂,企业必须保持警惕,并探索先进的方法来防范这些不断演变的威胁。
引言
一种新的、复杂的、隐蔽的 Magecart 网络盗版活动一直以 Magento 和 WooCommerce 网站为目标。其中一些受害者与食品和零售行业的大型组织有关。
根据我们发现的证据,该活动已经活跃了几个星期,在某些情况下甚至更长。这次活动采用了一种我们以前从未遇到过的高级隐藏技术,让我们大吃一惊。
新运动
Magecart 攻击通常从利用目标网站的漏洞或感染这些网站使用的第三方服务开始。在这次活动中,我们检测到的所有受害网站都被直接利用了,因为恶意代码片段被注入到了它们的第一方资源中。
在某些情况下,恶意代码被插入 HTML 页面;在其他情况下,恶意代码被隐藏在作为网站一部分加载的第一方脚本中。
与许多其他 Magecart 活动一样,该活动的攻击基础架构由三个主要部分组成:加载器、恶意攻击代码和数据外渗(图 1)。
1. 加载器 - 简短、晦涩的 JavaScript 代码片段,负责加载攻击的全部恶意代码
2. 恶意攻击代码 - 执行攻击的主要 JavaScript 代码;它会检测敏感输入、读取数据、扰乱结账流程并注入虚假表单
3. 数据外渗 - 将窃取的数据传输到攻击者的指挥和控制 (C2) 服务器的方法
图 1:Magecart 攻击基础结构
将攻击分为三部分的目的是为了隐藏攻击,使其更难被发现。这样只有在特定目标页面上才能启动完整的攻击流程;也就是说,由于攻击者使用了混淆措施,只有在攻击者打算执行攻击的地方才能启动完整的攻击流程。这使得攻击更加隐蔽,更难被目标网站上可能存在的安全服务和外部扫描工具检测到。
虽然大多数 Magecart 攻击活动在流程和阶段上都有相似之处,但攻击者采用的各种隐藏技术却使活动与众不同。这些技术用于掩盖攻击的基础设施、隐藏痕迹、使检测和逆向工程复杂化,并最终延长攻击时间。
三种不同的变体
我们发现了这一活动的三种不同变体,表明了攻击的演变过程以及攻击者为防止检测和缓解这一活动所做的改进:
• 前两种变体非常相似,只是在装载机部分略有不同。
• 第三个版本很特别,因为攻击者使用了网站默认的404错误页面来隐藏恶意代码;这是一种创造性的隐藏技术,我们以前从未见过。
让我们来详细了解一下这项新颖活动的三个变体的技术细节。
变体一
我们的研究始于我们在一家大型公司网站上发现的一些可疑代码片段,这些代码片段被我们的威胁情报监控工具检测到。在对这些代码段进行分析后,我们发现它们是恶意编码的JavaScript加载器,在网站上仍然存在并处于活动状态。这一发现促使我们进一步调查,揭露了整个活动的变体及其对众多网站的影响。
变体一号装载机: 冰山一角
取样器成功地在被利用的网站上注入了一个带有onerror属性的畸形HTML 图像标记(图 2)。该属性包含一个经过混淆的Base64编码恶意加载程序代码片段。图片标签的src属性故意为空,目的是防止网络请求,并触发内联onerror回调的执行,该回调包含经过混淆的恶意 JavaScript 代码片段。
使用图片标签来执行 JavaScript 代码是一种不太常见但更复杂的技术。它可以帮助盗号者绕过安全措施,例如通常会分析网络流量的外部扫描仪,但在这种特定情况下不会触发这些扫描仪。混淆代码将在页面上下文中执行,运行时就像由页面本身启动的本地第一方脚本一样。
图 2:变体一加载器--格式不当的 HTML 图像标记,带有包含恶意加载器代码的 onerror 属性
解码加载程序代码 - 运行时
经过混淆的 Base64 编码代码一旦在运行时被执行,就会转换成纯 JavaScript,并负责启动 WebSocket 通道(图 3)。该通道是浏览器与攻击者 C2 服务器之间的双向通信链路。
在最近的几次活动中,我们发现了在 Magecart 攻击中使用 WebSockets 的情况。WebSocket 被认为是一种更安静、更灵活的通信方法,允许攻击者利用单一网络通道实现各种目的。这包括将攻击的不同部分从 C2 服务器发送到浏览器(反之亦然),以及在某些情况下促进数据外渗活动。
代码的另一个值得注意的方面是僵尸检测,它会检查用户代理是否受自动化控制。如果是,代码就会终止执行。这是一种巧妙的反僵尸技术,旨在躲避可能检测到攻击的外部安全扫描仪和沙箱。
图 3:变体一加载器的运行时解码 JavaScript 代码
Websocket 通信流
一旦 WebSocket 通道建立,第一条信息就会从攻击者的 C2 服务器发送到浏览器。该信息以 Base64 编码字符串的形式传输,其中包含一条单行 JavaScript 命令,指示浏览器发回页面的当前 URL。
这一步的目的是让 C2 服务器能够确定当前页面是结账(敏感)页面还是其他非结账页面。这样,攻击者就可以相应地调整下一步。
这种直接的服务器端验证使攻击者能够只在相关的目标网页上启动攻击,从而避免了在非敏感网页上的潜在暴露。这是另一个例子,突出说明了盗号者为逃避安全服务和外部扫描仪的检测所做的努力。
当 C2 服务器识别出结账页面 URL 后,流程进入下一阶段。在这个步骤中,会向浏览器发送另一条信息。这是一个 Base64 编码的长字符串,其中包含整个攻击代码。解码后,一段冗长的混淆 JavaScript 代码就会显现出来(图 4)。
这些代码负责在目标敏感页面上执行各种恶意活动,目的是读取用户的敏感个人数据和信用卡数据,并将其传输回盗取者的 C2 服务器。
随后,包含恶意代码收集的敏感被盗数据的混淆数据外泄信息会从浏览器发送到 C2 服务器。如前所述,与 XHR、获取或 HTML 资源请求等传统通信方法相比,使用相同的 WebSocket 通道加载完整的恶意代码和外泄窃取的数据会使整个过程更安静,涉及的网络请求也更少。
图 4:结账页面上的 WebSocket 流程
变体二
变体二号装载机:同位女士,新的着装
变体一和变体二的主要区别在于加载器组件。在变体二中,取样器插入了一个内联脚本,其中的代码片段与著名的 Facebook 访客活动跟踪服务 Meta Pixel 代码片段非常相似,只是里面多了几行代码(图 5)。
这些添加的行是真正的加载器部分,而周围的 Meta Pixel 代码则是一个误导性的伪装,使其看起来像是一个合法而不可疑的代码片段。
这种隐藏技术会让恶意代码片段看起来像是 Google Tag Manager 或 Facebook 等知名服务,在最近的 Magecart 活动中很受欢迎。它允许篡改者逃避外部扫描仪和研究人员的静态分析。
图 5:变体二加载程序--伪装成 Meta PIxel 代码段的内联脚本,内含恶意加载程序
索取图片
当我们仔细检查伪造的 Meta Pixel 代码段中的可疑行时,发现它似乎是从网站自己的目录中获取一张 PNG 图像。该网络请求似乎是对网站上托管的无辜图像的典型请求。然而,当我们检查这张图片的实际内容时,发现它并不像看上去那么无害(图 6)。
图6:对已经被攻击者篡改并包含恶意代码的图像的网络图像请求
二进制图像中的恶意 JavaScript 代码片段
PNG 图像的二进制数据包含一个添加到图像二进制文件末尾的 Base64 编码字符串(图 7)。加载程序代码片段提取、解码并执行该字符串(图 8)。解码后的字符串代表一个 JavaScript 代码段,与变体一中加载器的 onerror 属性中的代码段完全相同。
流程的后续步骤保持不变。该代码片段在运行时会转换为纯 JavaScript 代码,代码会启动 WebSocket 通道连接到攻击者的 C2 服务器,其余步骤如前所述。
图 7:包含隐藏恶意代码的图像二进制数据
图 8:最初以 Base64 编码并隐藏在图像中的恶意代码在解码后变得清晰可见
变体三
现在,让我们来谈谈最精彩的部分。虽然我们已经看到过类似的攻击,但这次的攻击却独一无二,着实让我们大吃一惊。
变体三装载机: 一样,一样,但又完全不同
乍一看,这个加载器与变体二中的加载器很相似,但你会发现(就像我们一样)这是一个完全不同的场景。在某些情况下,这个加载程序会伪装成 Meta Pixel 代码段,如变体二所示(图 9)。但在其他情况下,它会被注入页面上的随机内联脚本中(图 10)。
该加载器的第一个显著特征是向名为 "图标 "的相对路径发出获取请求。
图 9:变体三加载器--隐藏在代码段中的恶意代码段,模仿 Meta Pixel 的外观
图 10:变体三加载器 -- 隐藏在任意内联脚本中的恶意代码片段
一次404 错误?确定吗?
加载程序执行后,攻击会向 /icons 发送获取请求,这是一个实际上并不存在的相对路径。该请求导致 "404 Not Found "错误(图 11)。对响应中返回的 HTML 进行分析后发现,这似乎是网站的默认 404 页面(图 12)。这种情况令人困惑,让我们怀疑盗号者是否不再活跃于我们发现的受害网站。
图 11:加载程序向不存在的路径发起请求,返回 404 错误
图 12: 默认错误页面 HTML
永远不要低估装载机
我们往后退一步,重新分析了加载器,发现了拼图中缺失的部分。加载器中包含一个与字符串 "COOKIE_ANNOT "匹配的 regex,它应该在作为图标请求的一部分返回的 404 错误页面上执行。
于是,我们在返回的 404 HTML 中搜索这个字符串,结果发现了一个隐藏在末尾的注释!我们发现了隐藏在页面末尾的注释,其中包含 "COOKIE_ANNOT "字符串(图 14)。在这个字符串旁边,还连接了一个 Base64 编码的长字符串。这个编码字符串代表了整个混淆 JavaScript 攻击代码。加载器从注释中提取这个字符串,解码后执行攻击,目的是窃取用户输入的个人信息。
我们模拟了对不存在的路径的其他请求,所有请求都返回了相同的 404 错误页面,其中包含带有恶意代码编码的注释。这些检查证实,攻击者成功更改了整个网站的默认错误页面,并在其中隐藏了恶意代码!
图 13:加载器变体 3--"COOKIE_ANNOT ".字符串的 regex 匹配
图 14:隐藏在错误页面 HTML 中的恶意编码注释
数据外泄
虚假表单
与变体一和变体二不同,攻击者在变体三中使用了另一种常见的数据外渗技术--注入虚假表单(图 15)。这种技术通常在取款机无法访问敏感输入时使用。
当网站使用的第三方支付服务在第三方 iframe 或外部页面中实现支付表单时,就会出现这种情况。为了绕过这种情况,攻击者会创建一个与原始支付表单非常相似的假表单,并将其覆盖--这是一种越来越流行的技术。这正是变体三中被盗数据的外流方式。
图 15:恶意代码注入的虚假表单
当用户向攻击者的虚假表单提交数据时,系统会显示错误,隐藏虚假表单,显示原始付款表单,并提示用户重新输入付款信息(图 16)。
图 16:隐藏虚假表单,提示用户重新输入信息
盗取数据的图像请求
提交虚假表单后,就会向攻击者的 C2 服务器发起图像网络请求,在查询参数中以 Base64 编码字符串的形式携带所有被窃取的个人信息和信用卡信息(图 17)。解码后,该字符串将揭示请求的真实意图,整个攻击流程也就一目了然了。
图 17:将被盗数据作为 Base64-编码字符串查询参数包含的图像网络请求
从变体三中汲取的经验教训: 404 案例
这种隐藏技术极具创新性,是我们在以前的 Magecart 活动中从未见过的。操纵目标网站的默认 404 错误页面的想法可以为 Magecart 攻击者提供各种创造性的选择,从而提高隐藏和逃避能力。
在我们发现的一些案例中,恶意加载程序在撰写本文时已经从受影响网站的页面中删除。然而,默认 404 页面中的恶意注释却依然存在,这可能会让盗号者轻易地重新启动攻击。这凸显了检测这种方法的复杂性和减轻其影响的重要性。
另一种规避技术是向通往 404 页面的第一方路径发出请求,这种技术可以绕过内容安全策略标题和其他可能会主动分析页面上网络请求的安全措施。这无疑是我们最近遇到的最复杂的 Magecart 策略之一。
Akamai客户端保护&合规性与取样器的比较
作为对这一活动研究的一部分,我们针对Akamai客户端保护与合规性进行了模拟,我们的解决方案可以分析运行时的JavaScript执行行为,从而抵御JavaScript威胁并减轻客户端攻击。
该解决方案成功检测到了这个复杂的盗号软件,并触发了一个高严重性事件,以便立即采取缓解措施。在一个实际场景中,如果在特定网页上启用了客户端保护与合规性,图 18 显示了网站所有者将收到的警报,这样他们就可以迅速调查威胁,并实时响应各种缓解方案。
图 18:检测到盗码器后的客户端保护与合规模拟警报
结论
这一活动进一步说明,网络盗版技术在不断发展。它们变得越来越复杂,这使得通过静态分析和外部扫描进行检测和缓解变得越来越具有挑战性。该领域的威胁行为者不断找到更好的方法,将其攻击隐藏在受害者网站中,并规避可能暴露其攻击的各种安全措施。
本研究强调的复杂程度应提醒各组织保持警惕,关注网页盗用攻击载体,并积极寻求新的先进方法来应对此类攻击。