近期,我们发现了一起利用 JavaScript 实施的凭证窃取活动。攻击者精心设计虚假语音邮件通知,以此为诱饵,企图骗取用户的 Microsoft 365 凭证。监测数据显示,基于 JavaScript 的凭证窃取活动正呈迅猛增长态势,已然成为网络安全领域不容忽视的普遍威胁。
在攻击手段上,攻击者不断推陈出新,越来越多地运用混淆和加密技术,以此绕过各类检测机制。其中,一种名为 “HTML 走私” 的策略尤为值得关注。攻击者将恶意 JavaScript 代码巧妙嵌入 HTML 文件中,当目标用户打开该文件,恶意代码便会自动执行,进而成功绕过传统安全过滤器,隐蔽性极高。
网络钓鱼活动
在此次凭证窃取活动中,攻击者精心策划了一系列具有极强迷惑性的操作。他们向目标用户发送电子邮件,邮件内容伪称收件人有新的语音邮件。邮件中附带一个 PDF 附件,附件上印有二维码。当用户扫描该二维码后,便会被引导至一个精心伪装的虚假登录页面,页面外观与 Microsoft Office 365、SharePoint 等合法服务页面毫无二致。毫无防备的用户一旦在这些虚假页面输入自己的凭证信息,攻击者便能轻易获取用户账户的访问权限,进而肆意妄为。
值得注意的是,攻击者为增强骗局的可信度,在 PDF 文件以及钓鱼邮件附件上都添加了目标组织的徽标,并附上收件人的相关信息,试图以此证明邮件来源的合法性,误导用户放松警惕。此外,除了 PDF 文件作为诱饵,攻击者还在邮件中夹带了一个 HTM 文件附件。该 HTM 文件中嵌入了恶意 JavaScript 代码,其作用在于,一旦用户点击相关内容,代码就会自动运行,将用户重定向到用于窃取凭证的页面,整个流程环环相扣,极具隐蔽性与欺骗性 。
JavaScript分析
在该恶意脚本中,JavaScript 代码执行了一系列操作。首先,代码将收件人的电子邮件地址赋值给名为 “0xbc8c” 的变量。这一举动极有可能是出于追踪用户的目的,或是为了让后续展示的内容更具针对性,进而营造出一种合法、可信的假象。
代码中包含了以 base64 格式存储的数据,这些数据被拆解为数组中的三个不同项。随后,脚本将数组中的这三项数据重新拼接,并将拼接后的结果传递给 atob 函数,该函数的作用是对 base64 编码的数据进行解码操作。最终,解码后的命令会被传递给 eval 函数,从而实现恶意代码的执行。
虽然解码 base64 数据的方法有很多,但“console.log()”方法在调试潜在恶意代码时非常实用,因为分析人员无需将数据从原始有效载荷中移出即可访问变量的内容。在本例中,只需将“eval”更改为“console.log”,即可显示 base64 编码的数据。
在调试器中启动 HTM 文件后,发现包含在 base64 数据中的额外 JavaScript,该 JavaScript 在页面加载时执行。
初步检查后,注意到“atob”函数的使用有所增加,这表明其中包含更多 base64 编码数据以及与 URL 关联的连接字符串。以下代码利用了 JavaScript 的“document.write()”方法。在 JavaScript 中,“document.write()”用于将 HTML 表达式或 JavaScript 代码直接写入另一个 HTML 文档。调用时,它会将数据插入到文档中执行脚本的位置。如果在 HTML 文档加载完成后使用 document.write(),它将覆盖整个文档内容。
有多种方法可以从此代码中提取解码的 base64 内容,但是为了便于分析,将内容复制到新的 HTML 文件中,以便进行简单的调试分析。
为了使通过“document.write()”传递的代码有效,HTML 需要将代码括在“<script>”标签内。
JavaScript 数据的第二阶段利用了“setTimeout”方法,该方法设置一个计时器,在指定时间过后自动执行代码。在本例中,计时器设置为 4 秒。4 秒后,该函数会自动将一个包含 URL 的连接字符串设置为变量“goldfinch”,然后将其传递给“document.write()”,以将 JavaScript 重定向注入到指定的 URL。
再次,利用调试器中的“console.log”是提取传递给下一个函数的实际数据的简单方法。
在钓鱼活动的这一阶段,存在更多 base64 编码数据,这些数据被解码并解析为 JSON,并存储在变量“a”、“b”、“c”、“d”中。变量“b”、“c”和“d”用于使用 CryptoJS 解密存储在“a”中的数据。解密后的内容将传递给“document.write”函数,以加载其他 Web 内容。
为了解密“a”中存储的内容,通过将 JavaScript 加载到调试器中并捕获设置为变量“a”、“b”、“c”和“d”的值来开始此阶段的分析。
在调试器中进一步深入脚本,解密的数据存储在“rzirAFjIlLLTCGaS”中,然后是一个简单的替换函数,将字符串“blwRbXUYPJwusSMx”替换为“rwUuql”的值,该值是存储在网络钓鱼链第一阶段的电子邮件地址。
在调试会话中评估“rzirAFjIlLLTCGaS”允许访问存储在“rzirAFjIlLLTCGaS”中的解密内容,从而揭示出额外的 JavaScript,引用存储在上一阶段的十六进制数据中的相同 URL。
对解密的 JavaScript 代码进行分析后发现,该脚本会动态生成一个包含随机大写字母和目标电子邮件地址的 URL,然后通过创建并点击隐藏的 <a> 元素来强制重定向。它首先检查电子邮件字符串是否包含 #,如果包含,则在 URL 后附加一个随机字母,然后再附加电子邮件。该脚本会清除页面内容以掩盖其活动,并执行重定向,可能是为了进行跟踪、网络钓鱼或漏洞利用。此行为会悄无声息地操纵用户导航,并将可识别数据嵌入请求中,这是凭证窃取活动中常见的技术。
在沙盒中访问生成的 URL 揭示了凭证窃取的最终阶段。首先,用户被重定向到 Cloudflare 验证码,然后进入一个模拟媒体播放器的页面,以访问虚假的语音邮件。点击播放按钮后,用户将被重定向到一个虚假的 Microsoft 365 身份验证页面。输入凭证后,恶意页面会将请求转发给 Microsoft 进行验证。
利用 CryptoJS 加密有效载荷的 JavaScript 网络钓鱼活动日益盛行,这使得自动化检测和分析更具挑战性。
IoC
biglobe.ne.jp
j9q.rlqztie.ru
fsf.velirax.ru
uzgw.welsiolopyro.ru
resourcerepgroup.com
es.rlqztie.ru
zomir.rlqztie.ru
154.216.17.193
原文始发于微信公众号(Khan安全团队):针对 Microsoft 365 凭据的 JavaScript 网络钓鱼活动分析
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论