StoryChief <= 1.0.42 - Upload Arbitrário de Arquivo Não Autenticado
🚨 StoryChief <= 1.0.42 — Upload Arbitrário de Arquivo Não Autenticado (CVE-2025-7441)
ℹ️ Resumo
O plugin StoryChief (WordPress) versões até 1.0.42, inclusive, expõe uma vulnerabilidade crítica de upload arbitrário de arquivo não autenticado por meio do endpoint REST /wp-json/storychief/webhook. Um atacante pode fazer com que o plugin busque e persista um recurso remoto controlado pelo atacante (por exemplo, um webshell) no diretório de uploads do site, permitindo execução remota de código em muitas implantações padrão do WordPress.
CVE: CVE-2025-7441
CVSS: 9.8 (Crítico)
💥 Impacto
Upload remoto não autenticado de arquivo para wp-content/uploads/YYYY/MM/.
Potencial de execução remota de código quando o arquivo enviado é executável (ex.: PHP).
Comprometimento total do site é possível quando o WordPress está configurado para executar o PHP enviado sob a raiz do documento.
🧩 Causa Raiz da Vulnerabilidade
O plugin aceita um payload JSON de entrada (evento de publicação) que contém um campo featured_image -> data -> sizes -> full apontando para uma URL arbitrária. O StoryChief não realiza validação suficiente do tipo/conteúdo do arquivo nem restringe a origem da URL, permitindo que o plugin busque o recurso remoto e o salve no diretório de uploads do site. Não há validação suficiente para impedir o armazenamento de arquivos que contenham código executável.
🛠️ Script de exploit — o que ele faz (mapeamento para a vulnerabilidade)
Esta seção explica o script de exploit (fornecido separadamente) em alto nível e mapeia cada comportamento importante para a vulnerabilidade subjacente.
Análise de argumentos de CLI — URL alvo (-u/--url), URL do shell remoto (-shell), chave HMAC opcional, cabeçalhos, flags de proxy/timeout/retry, opções de debug e apenas impressão.
Normalização do alvo — adiciona /wp-json/storychief/webhook quando uma raiz de site é fornecida.
Validação da URL do shell — verifica se a URL remota está acessível (HEAD/GET ou curl).
Extração do nome do arquivo — usa o basename da URL remota para inferir o nome final no diretório de uploads.
Construção do payload — insere a URL controlada pelo atacante em data.featured_image.data.sizes.full para forçar o plugin a buscar e armazenar o arquivo.
Assinatura HMAC (opcional) — calcula meta.mac (HMAC-SHA256) usando uma chave hex opcional; alguns servidores podem ignorar ou exigir isso.
Entrega — usa requests com retries/backoff ou fallback para curl, suporta cabeçalhos personalizados, proxies e --no-verify.
Tratamento da resposta — analisa respostas JSON em busca das chaves permalink/id para detectar sucesso; caso contrário, reporta falha.
Saída — imprime o caminho esperado de uploads: wp-content/uploads/YYYY/MM/<filename> em caso de sucesso.
🖼️ Requisitos do arquivo shell (crítico)
Ao usar um arquivo remoto .php (por exemplo: https://attacker.example/shell.php), o arquivo deve incluir um cabeçalho de imagem válido (magic bytes) para que seja tratado/aceito como imagem pelo plugin ou pelo código de processamento de imagem. Pontos-chave:
Use uma abordagem poliglota: o arquivo deve começar com magic bytes de imagem válidos (ex.: JPEG, PNG ou GIF) para que verificações ingênuas e manipuladores de imagem o aceitem, enquanto também contém o payload PHP em uma seção que permanece no disco exatamente como está.
Magic bytes de imagem comuns:
JPEG: 0xFF 0xD8 0xFF
PNG: 0x89 0x50 0x4E 0x47
GIF: ASCII "GIF89a" ou "GIF87a"
Não confie apenas no nome/extensão do arquivo. Muitos plugins inspecionam o conteúdo do arquivo ou usam bibliotecas (GD, ImageMagick) que verificam a integridade da imagem.
Depende do ambiente: alguns servidores validarão ou reencodarão imagens, o que pode remover o código injetado. Teste primeiro em um laboratório autorizado.
Lembrete ético: NÃO publique código de webshell funcional aqui. Crie e teste esses arquivos apenas em ambientes autorizados.
▶️ Como executar (exemplos)
Substitua os placeholders por alvos autorizados. Todos os exemplos abaixo usam uma URL de shell remoto .php.
"[-] Error: shell URL is not reachable (not HTTP 200)"
"[-] Error: request failed"
"[-] Error: upload failed or endpoint returned non-JSON/HTML"
🔎 Detecção e Indicadores de Comprometimento (IoC)
Requisições POST inesperadas para /wp-json/storychief/webhook a partir de IPs desconhecidos.
Novos arquivos em wp-content/uploads/// com extensões .php ou extensões de imagem contendo código embutido.
Logs do servidor web mostrando GETs de saída para domínios controlados pelo atacante, seguidos de acesso aos arquivos enviados.
Arquivos de imagem suspeitos com conteúdo não relacionado a imagem anexado ou embutido.
🛡️ Mitigação e Remediação
Curto prazo:
Atualize o StoryChief para uma versão corrigida imediatamente quando disponível.
Bloqueie ou restrinja /wp-json/storychief/webhook via WAF ou regras do servidor.
Restrinja buscas de saída do servidor ou o egresso para domínios não confiáveis.
Orientações para desenvolvedores:
Valide os tipos e conteúdos de arquivo após qualquer busca remota; verifique imagens usando parsers seguros e rejeite arquivos inválidos.
Exija autenticação para webhooks que causam downloads ou criação de arquivos no lado do servidor.
Garanta que a verificação de assinatura/HMAC seja implementada e aplicada.
Armazene o conteúdo enviado fora da raiz do documento (webroot) ou desative a execução de arquivos enviados em wp-content/uploads (regras do servidor web).
⚠️ Limitações e Advertências
O sucesso do exploit depende da configuração do servidor, das bibliotecas de processamento de imagem e das políticas de execução do servidor web.
Servidores que reprocessam ou reencodam imagens podem remover os payloads injetados.
Se o plugin verificar assinaturas, fornecer uma mac incorreta pode causar rejeição.
🤝 Uso Responsável
Este documento é para defensores e testadores autorizados. NÃO use estas técnicas contra sistemas que você não possui ou para os quais não tem permissão explícita para testar. A exploração não autorizada é ilegal e antiética.
Se você estiver reportando o problema a um fornecedor ou proprietário do site, inclua detalhes de reprodução, etapas seguras de remediação e correções sugeridas.
📚 Referências e Créditos
Relatório e script de exploit por: Nxploited (Khaled Alenazi) — nome do script: CVE-2025-7441.py (fornecido separadamente)