
🔥 XSS2Shell — Scanner CVE-2026-64638 e Kit de Ferramentas PoC
Scanner em massa orientado a comportamento e gerador de PoC de nível evidencial
para a cadeia XSS-para-RCE de pré-autenticação do WordPress que afeta mais de 500 milhões de sites.
Apenas detecção. Sem weaponização. Construído para programas de bug bounty e blue teams.
O que é isso? • Início Rápido • Dorks do Shodan • Uso • Matriz de Decisão • Detecção • Perguntas Frequentes
Caçe instâncias WordPress potencialmente vulneráveis pela internet antes de escanear:
http.component:"wordpress" -http.title:"Just a moment"
Encontra sites WordPress excluindo as páginas do modo "I'm Under Attack" do Cloudflare / proteção contra bots, que bloqueiam ou desafiam requisições automatizadas.
http.component:"wordpress" http.title:"Log In"
Retorna apenas páginas de login do WordPress — a superfície de ataque exata do CVE-2026-64638.
http.component:"wordpress" "wp-content" "?ver=7.0" -"?ver=7.0.3"
Sinaliza instâncias WordPress 7.0.x sem o patch 7.0.3 por fingerprinting de versão de assets.
http.component:"wordpress" http.html:"wp-login.php"
Captura sites onde o wp-login.php está acessível, mas pode não ser a página atual — cobertura mais ampla.
http.component:"wordpress" -http.title:"Just a moment" -http.title:"Attention Required" -org:"Cloudflare"
Filtro agressivo que elimina a maioria dos alvos atrás do Cloudflare. Use ao escanear em escala com --active — o Cloudflare fará rate-limit ou bloqueará a requisição de sondagem.
Dica: Exporte os resultados do Shodan com
shodan downloade canalize os hostnames diretamente paraxss2shell_mass.py -i.
Em 7 de agosto de 2026, a pwn.ai divulgou o CVE-2026-64638 (XSS2Shell) — uma vulnerabilidade crítica de cross-site scripting de pré-autenticação no WordPress Core que encadeia até a execução remota de código no servidor. [citation:pwn.ai blog]
A falha explora uma divergência de parsing entre a função strip_tags() do PHP e a wp_kses_post() do WordPress:
strip_tags() usa < imediatamente seguido por uma letra para identificar tags HTML. < area id=...> (com um espaço) é tratado como texto — ele sobrevive.wp_kses_post() (KSES) reconhece < area como um elemento <area> válido — e <area> está na allowlist do KSES. [citation:pwn.ai blog]Um único login falho com um nome de usuário especialmente criado < area id=ajaxurl href=/?rest_route=/&_method=GET&_jsonp=alert>... burla ambos os sanitizadores, é renderizado como DOM ativo na página de login, sequestra o script user-profile.js do próprio WordPress via DOM clobbering e dispara alert() na origem do WordPress — zero cliques, zero autenticação, zero cookies necessários. [citation:pwn.ai blog]
Escalado para um administrador logado? A mesma primitiva rouba Application Passwords via Same Origin Method Execution (SOME), faz upload de um plugin malicioso e executa PHP como www-data. [citation:pwn.ai blog] [citation:hadrian.io blog]
Afetado: WordPress 6.4 até 7.0.2 — corrigido no 7.0.3 com backports para 4.7+.
Impacto: ~500 milhões de sites na época da divulgação. [citation:pwn.ai blog]
| Recurso | Link |
|---|---|
| Divulgação Original (pwn.ai) | pwn.ai/blog/xss2shell |
| Análise Técnica da Hadrian | hadrian.io/blog/wordpress-xss2shell |
| Advisory do WordPress (GHSA) | GHSA-52p2-r8wf-jcrf |
| Pesquisa sobre Ataques SOME (2022) | pwn.ai/blog/bypass-csp-using-wordpress |
| Lançamento do WordPress 7.0.3 | wordpress.org/news/2026/08/wordpress-7-0-3-release |
Este é um kit apenas de detecção. Ele não weaponiza a vulnerabilidade — fornece a pesquisadores de segurança, caçadores de bug bounty e blue teams tudo o que é necessário para:
"Uma string de versão diz qual nível de patch o código deveria ter.
Somente o comportamento do sanitizador da página de login diz se a falha dispara."
Hosts gerenciados aplicam backports de patches de segurança silenciosamente, sem alterar as strings de versão. Plugins de hardening de login substituem a mensagem de erro por completo, eliminando o canal de reflexão mesmo em versões inseguras. Scanners baseados apenas em versão produzem falsos positivos e falsos negativos. Este scanner envia uma única sondagem benigna e classifica o comportamento real do sanitizador.
git clone https://github.com/jakestone/xss2shell.git
cd xss2shell
pip install -r requirements.txt
# Passive — no probes sent to target, version + endpoint fingerprinting only
python3 xss2shell_mass.py -i domains.txt -o results
# Active — sends ONE benign failed-login per host (authorized assets only!)
python3 xss2shell_mass.py -i domains.txt -o results --active --workers 80
# Single target
python3 make_poc.py --target https://blog.example.com
# Batch from scanner output
python3 make_poc.py --from-results results.csv -o pocs/
Abra o .poc.html gerado no seu navegador enquanto grava vídeo → se alert() disparar, você capturou evidência de XSS pré-autenticação.
xss2shell_mass.py)usage: xss2shell_mass.py [-h] -i INPUT [-o OUTPUT]
[--active] [--workers WORKERS]
[--timeout TIMEOUT] [--quiet]
| Flag | Descrição |
|---|---|
-i, --input | Arquivo com um host por linha (domínio simples ou URL completa) |
-o, --output | Caminho base para os arquivos de saída (gera .csv + .json) |
--active | Ativa a sondagem comportamental — um login falho por host |
--workers | Tamanho do pool de threads (padrão: 50, máx. ~200 para boas conexões) |
--timeout | Timeout HTTP em segundos (padrão: 10) |
--quiet | Imprime apenas confirmed_vulnerable, vulnerable e likely_vulnerable |