Gouthamjoshi01/etherhiding-clickfix-case-study

GitHub: Gouthamjoshi01/etherhiding-clickfix-case-study

这是一份针对合法企业网站遭 EtherHiding 与 ClickFix 双重技术攻击的实战案例分析报告,详细记录了从发现、调查到技术反混淆的完整过程及防御建议。

Stars: 0 | Forks: 0

# 案例分析:一个被攻陷并用于分发链上恶意软件加载器的网站 (EtherHiding + ClickFix) **发现日期:** 2026 年 7 月 25 日 **目标:** 一个正在运营的、合法的小型企业网站(基于 Joomla CMS)—— **域名已隐去**,因为在撰写本文时,该网站仍处于被攻陷且未修补的状态。这是一家与此次攻击无关的、真实且正在运营的企业;在此次入侵事件解决之前,为了防止扩大其暴露范围或损害其声誉,我们对其域名进行了保密。 **撰写本文时的状态:** 网站已被攻陷;已向 Google Safe Browsing 提交报告;截至撰稿时尚未被标记。 ## 起因 这次调查之所以开始,是因为我的朋友 **Sofia** 在自己的笔记本电脑上发现了一些可疑情况——一个伪造的“验证”弹窗,以及一个在后台运行的奇怪命令窗口。她没有直接点击进去,而是停了下来,意识到这看起来不太对劲,并在其执行之前将其关闭了。她把这个情况告诉了我,正是她这种停下来并产生质疑的本能,真正拉开了下文所记录的一切的序幕。接下来的技术分析、代码反混淆以及报告工作都是由我完成的,但最初的发现归功于她。 ## 1. 总结 一个合法的、长期运营的商业网站遭到攻击,其页面 `` 中被注入了恶意的 JavaScript 加载器。该加载器从 Binance Smart Chain (BSC) **测试网**的智能合约中获取隐藏的 payload,并通过 `eval()` 执行。此外,访问者还会看到一个伪造的“reCAPTCHA 验证”覆盖层,该覆盖层利用社会工程学手段,诱骗他们通过 Windows 运行对话框手动执行由攻击者控制的命令。 这结合了两种已被记录的真实攻击技术: - **EtherHiding** —— 利用区块链智能合约存储来托管/分发恶意软件 payload。由于区块链数据是不可篡改的,且并非托管在可以被提供商删除的服务器上,因此使得被彻底封禁变得非常困难。 - **ClickFix** —— 一种伪造的 CAPTCHA/验证提示,诱骗用户按下 Win+R,粘贴剪贴板 payload(由恶意页面静默设置),然后按下回车键——从而执行一段用户自己从未看到或输入过的命令。 ## 2. 时间线 | 时间 | 事件 | |---|---| | T+0 | Sofia 的笔记本电脑显示一个运行/cmd 窗口,其中包含一个可疑的无头命令,引用了一个陌生的外部域 | | T+0 | 她意识到这很可疑,并在执行前将其关闭 | | T+~几分钟 | 开始调查:审查了网站的页面源码 | | T+~10 分钟 | 识别出 `` 中被混淆的 base64 `data:` 脚本注入 | | T+~15 分钟 | 解码并追踪逻辑,发现其指向 BSC 测试网 RPC 调用 + `eval(atob(...))` | | T+~20 分钟 | 在网站上实时重现了伪造的验证弹窗,证实了 ClickFix 的投递机制 | | T+~30 分钟 | 检查了 Google Safe Browsing 透明度报告 —— 网站尚未被标记(“未发现不安全内容”) | | T+~35 分钟 | 向 Google Safe Browsing 提交了报告 | ## 3. 技术分析 ### 3.1 注入点 在 `` 中发现,与其他正常的模板脚本(jQuery, Bootstrap, 模板 JS)并存: ``` ``` 这是被攻陷的 CMS 恶意软件常用的一种注入模式:它不是链接到外部的 `.js` 文件(因为这样很容易通过 URL/域名被发现和阻止),而是将 payload 直接作为 `data:` URI 嵌入,因此加载第一阶段时不需要任何外部请求。 ### 3.2 混淆 解码后的脚本使用了**字符串数组 + 索引偏移**的混淆模式(通常由 `obfuscator.io` 等工具生成): - 所有字符串字面量都存储在一个数组中,并在运行时进行乱序重组。 - 函数/变量名被替换为无意义的类十六进制标识符。 - 真正的函数调用是通过查找辅助函数来解析的,而不是直接调用。 这并不会改变代码*做*什么——它只会减慢手动分析的速度,并避开简单的静态签名扫描。 ### 3.3 Payload 获取(EtherHiding 模式) 一旦完成反混淆,其逻辑如下: 1. 向公共的 Binance Smart Chain **测试网** RPC 节点发送 `POST` 请求。 2. 针对特定的合约地址调用 `eth_call` JSON-RPC 方法,请求 `"latest"` 状态。 3. 从响应中提取十六进制编码的 `result` 字段。 4. 将该十六进制数据的特定字节范围(带有长度前缀的段)转换回 UTF-8 字符串。 5. 将解码后的字符串传递给 `eval(atob(...))`。 **为什么这很重要:** 实际的下一阶段 payload 从未被托管在被攻陷的网站或任何单一的传统服务器上。它存在于区块链合约存储中。这意味着: - 传统的移除请求(发给托管提供商、注册商或 CDN)无法删除 payload 本身——只能删除被攻陷网站上的初始加载器脚本。 - 攻击者可以**随时更新 payload**,只需向合约写入新数据即可,再也无需触碰被攻陷的网站。 - 使用*测试网* RPC(而不是主网)值得注意——测试网基础设施免费使用,且受到的监控比主网少,这使其成为一个低成本、低可见性的托管层。 ### 3.4 社会工程学投递(ClickFix 模式) 独立于上述加载器,该网站(或其触发的 payload)会显示一个伪造的验证模态框,指示访问者: 1. 按住 Windows 键 + R 2. 在验证窗口中,按下 Ctrl+V 3. 按下回车键完成 这就是有详细记录的 **ClickFix** 技术: - 该页面在显示此提示之前,会(通过 JavaScript 剪贴板 API 或隐藏的复制触发器)静默地将一条恶意命令写入受害者的剪贴板。 - 受害者被告知这是一个正常、无害的反机器人检查。 - Win+R 打开 Windows 运行对话框;Ctrl+V 粘贴攻击者的命令;回车键执行它——所有这些动作都由受害者自己的双手完成,完全绕过了浏览器沙箱,因为执行发生在操作系统级别,而不是浏览器内部。 - 在受害者笔记本电脑上观察到的命令与 ClickFix payload 典型的第二阶段下载器一致(从攻击者控制的外部路径/域获取并运行进一步的恶意软件)。 ### 3.5 为什么 Google Safe Browsing 显示“未发现不安全内容” 这是意料之中的,并不矛盾: - Safe Browsing 依赖于定期爬取,而不是实时分析。 - 有条件分发的 payload(例如,仅针对真实人类访问者,而不是机器人——可通过鼠标移动、时间间隔、缺乏无头浏览器指纹来检测)可以完全避开自动化爬虫。 - 链上 payload 的部署意味着*恶意行为本身*可以由攻击者远程开启/关闭,而无需更改被爬取的页面源码。 - 手动提交报告会触发人工/更深度的审查,而不是仅仅依赖现有的抓取索引。 ## 4. 攻陷指标 (IOCs) —— 已脱敏处理 - Payload 暂存技术:针对攻击者控制的合约进行 BSC 测试网 RPC `eth_call` - 伪造的验证/CAPTCHA 覆盖层文本模式:*"Complete these Verification Steps"* / *"I am not a robot - reCAPTCHA Verification ID: [numeric]"* - 在受害者主机上观察到的恶意命令模式:一个无头控制台进程,启动了一个隐藏的 shell 命令,映射到一个外部的、随机子域化的主机 - 完整的域级 IOC(被攻陷的网站、与 C2 相邻的域)已从本公开版本中隐去——出于合法的安全研究/验证目的,可应要求提供。 ## 5. 已采取的响应措施 1. **没有**执行 Win+R/Ctrl+V/Enter 序列——攻击链在社会工程学阶段被切断。 2. 作为预防措施,将可能受影响的笔记本电脑与网络断开连接。 3. 没有关闭机器(以保留易失性证据),等待进一步审查。 4. 直接分析页面源代码,而不是进一步与实时页面进行交互。 5. 通过 Google Safe Browsing 透明度报告检查域名信誉。 6. 向 Google Safe Browsing 提交了事件报告。 ## 6. 建议(针对遇到这种情况的任何网站所有者) - 立即审核每个页面上所有注入的 `