Skip to content
KitploitKITPLOIT
StrumentiBlog
Invia
StrumentiBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
wp2shell — PoC di RCE pre-autenticazione per il core di WordPress — combina CVE-2026-63030 (desync route-confusion REST /batch/v1) con CVE-2026-60137 (SQLi author__not_in) per ottenere una shell non autenticata. Solo test autorizzati. | Kitploit
Strumenti/GitHubGitHub/mcipekci/wp2shell
Escalation di PrivilegiAnalisi delle VulnerabilitàExploitSfruttamento di Applicazioni WebPost-ExploitSicurezza WebPenetration TestingCommand and ControlRed TeamingSviluppo Payload
GitHubmcipekci/wp2shell
15828 giorni faNon ancora revisionato

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi

wp2shell

PoC di RCE pre-autenticazione per il core di WordPress — combina CVE-2026-63030 (desync route-confusion REST /batch/v1) con CVE-2026-60137 (SQLi author__not_in) per ottenere una shell non autenticata. Solo test autorizzati.

Vedi Repository

wp2shell — RCE pre-auth nel core di WordPress

PoC di RCE non autenticata nel core di WordPress che combina CVE-2026-63030 + CVE-2026-60137. Solo test autorizzati.

wp2shell.py è una proof of concept a file singolo, basata solo sulla libreria standard, che incatena due vulnerabilità del core di WordPress in esecuzione remota di codice non autenticata:

CVEComponenteBug
CVE-2026-63030handler REST /batch/v1desync da confusione di route — il batch handler perde la sincronizzazione tra la sua tabella handler e la sua tabella validation quando il path di una sub-request non viene parsato, quindi una sub-request viene instradata tramite un handler per cui non è mai stata validata.
CVE-2026-60137WP_QuerySQL injection scalare — il valore author__not_in viene incollato direttamente nell'SQL, quindi una stringa che lo raggiunge è iniettabile.

Nessuna delle due è RCE da sola. Il desync è il vettore (fa passare di nascosto una stringa dell'attaccante in una query che non dovrebbe mai raggiungere); l'iniezione è la primitive. Insieme danno a un attaccante pre-auth un oracle completo di lettura/scrittura SQL e, da lì, una shell funzionante.

⚠️ Solo test autorizzati. Questo exploit colpisce installazioni WordPress live. Usalo solo contro sistemi di tua proprietà o per i quali hai esplicita autorizzazione scritta al test.


Versioni interessate

Vulnerabili: 6.8.0–6.8.5, 6.9.0–6.9.4, 7.0.0–7.0.1 Corrette: 6.8.6, 6.9.5, 7.0.2 (e successive) Segnalate da Adam Kues (Assetnote / Searchlight Cyber); la SQLi è stata attribuita anche a TF1T, dtro, haongo.

Solo la 6.9.0–7.0.1 è in grado di eseguire RCE. Sulla serie 6.8.x il desync scatta ancora, ma il ramo che dovrebbe disallineare l'handler incontra invece un fatal WP_Error::get_method() — quindi la 6.8.x è un denial-of-service / crash, non una shell. Il tool lo rileva e ti dice quale primitive è disponibile.


Come funziona la catena

L'exploit è costruito a strati; ognuno è un ponte verso il successivo.

  1. Desync (CVE-2026-63030). Una richiesta batch ne annida una seconda. Una sub-request trasporta un path deliberatamente malformato (http://:, che wp_parse_url() rifiuta). Nella 6.9.0+ il parse fallito fa sì che le tabelle handler e validation si disallineino di una voce, quindi la successiva sub-request viene eseguita con un handler per cui non è mai stata validata — la collection pubblica dei post.

  2. Iniezione (CVE-2026-60137). Quella chiamata instradata erroneamente raggiunge WP_Query con un author__not_in controllato dall'attaccante. Un UNION ALL SELECT lì non legge le righe — le fabbrica, permettendoci di forgiare post arbitrari nel risultato della query.

  3. Ponte SQL → scrittura. I post fabbricati trasportano markup [embed]. WordPress li risolve diligentemente e li mette in cache come vere righe di post-meta oembed_cache — trasformando un'iniezione di sola lettura in una primitive di scrittura arbitraria.

  4. Pivot dei privilegi. Usando quel ponte di scrittura forgiamo (a) un changeset del customizer creato come il vero amministratore e (b) un post request auto-referenziale. Insieme costringono WordPress a rieseguire la propria pipeline di request come quell'admin — una finestra appena abbastanza lunga perché una chiamata in coda crei un nuovo amministratore.

Oracle di estrazione

Per il lato di lettura (--dump, risoluzione del prefisso, ID in cache) il tool seleziona automaticamente l'oracle più veloce che funziona e si ferma al primo risultato:

  1. union — UNION in-band: il post_title della riga forgiata trasporta |||HEX(value)|||, che viene riflesso tale e quale nel body della risposta /wp/v2/posts. Legge un intero valore (di qualsiasi lunghezza) in una sola richiesta. Se UNION viene riflesso, gli oracle booleani non vengono mai sondati.
  2. bool — oracle booleano X-WP-Total: l'header X-WP-Total della sub-risposta confusa è count>0 per true / 0 per false. Un bit per richiesta (bisezione).
  3. time — SLEEP() basato sul tempo: il fallback quando il body viene rimosso e la risposta è un 500 (es. un fatal post-dispatch di un mu-plugin di caching). Funziona anche su target che vanno in crash a ogni chiamata REST.

--dump usa GROUP_CONCAT per estrarre l'intero set di credenziali in un colpo solo quando UNION è disponibile.


Installazione

Nessuna. Solo libreria standard Python 3.7+ — niente pip install.

root@kitploit:~
chmod +x wp2shell.py

Utilizzo

root@kitploit:~
# 1. Is it vulnerable? (no injection, no writes, no account created)
./wp2shell.py http://target --check

# 2. Read-only credential dump — FIRST administrator + option secrets
./wp2shell.py http://target --dump

#    …every administrator
./wp2shell.py http://target --dump all

# 3. Full RCE — create a temp admin, run a command, clean up
./wp2shell.py http://target --exec "id; uname -a"

Ricognizione di sola lettura (nessuna creazione di admin, bypassa la 2FA)

root@kitploit:~
./wp2shell.py http://target --user-list          # full user table (logins/emails/roles)
./wp2shell.py http://target --content            # every post type at status=any (private/draft)
./wp2shell.py http://target --content full        #   …including each item's raw body

Scansione di più host

root@kitploit:~
./wp2shell.py -f targets.txt --check --target-threads 8

Opzioni

Evasione di WAF / hardening


Note sull'output

  • Gli hash delle password ($wp$2y$… / $P$… / $2y$…) vanno direttamente in hashcat (-m 3200 per phpass, o la modalità bcrypt di WP). WordPress 6.8+ usa bcrypt $wp$….
  • --dump di default riguarda solo il primo amministratore. Usa --dump all per la lista completa degli admin.
  • Target con errore 500 / crash: se un fatal post-dispatch (es. un mu-plugin di cache in stile Pantheon) trasforma ogni risposta REST in un 500, la creazione dell'admin non funzionerà, ma le letture sì — passa a --oracle time --dump per recuperare gli hash.

Perché la pulizia è importante

Il percorso --exec è progettato per non lasciare nulla dietro di sé: l'amministratore temporaneo, la sua usermeta, le righe oembed_cache fabbricate e la webshell caricata vengono tutti rimossi prima che il tool esca. Non esiste un flag --keep — un operatore non dovrebbe mai lasciare un account admin vivo creato da un attaccante sul sistema di un cliente.


File

  • wp2shell.py — l'exploit (file singolo, solo stdlib).

Crediti

La scoperta delle vulnerabilità, la divulgazione e il write-up originale "wp2shell" sono da attribuire al team di ricerca Searchlight Cyber / Assetnote:

  • CVE-2026-63030 — desync da confusione di route REST /batch/v1
  • CVE-2026-60137 — SQL injection WP_Query author__not_in

Questo repository è un'implementazione proof of concept indipendente della catena di exploit che hanno divulgato; non rivendica la scoperta delle vulnerabilità sottostanti. Se qualche attribuzione è incompleta o errata, apri una issue e verrà corretta.

Riferimenti

  • Searchlight Cyber / Assetnote — wp2shell: Pre-Authentication RCE in WordPress core https://slcyber.io/research-center/wp2shell-pre-authentication-rce-in-wordpress-core/
  • Rilascio di WordPress 7.0.2 (fix) — https://wordpress.org/news/2026/07/wordpress-7-0-2-release/
  • Advisory — GHSA-ff9f-jf42-662q, GHSA-fpp7-x2x2-2mjf

Disclaimer

Questa è una proof of concept di ricerca sulla sicurezza per test di penetrazione autorizzati e validazione difensiva. Eseguirla contro sistemi di cui non sei proprietario o per cui non hai il permesso scritto al test è illegale. L'autore non si assume alcuna responsabilità per un uso improprio.

Scarica lo strumento
POST /wp/v2/users
  • Shell. Accedi come nuovo admin, carica un plugin, esegui il comando. L'account, la sua meta, le righe oembed e la webshell vengono tutti ripuliti in seguito — non rimane alcuna impronta persistente.

  • FlagScopo
    url / -f FILEtarget singolo, oppure un file di target (un URL per riga)
    --checksolo verifica della vulnerabilità — nessuna iniezione, scrittura o account
    --dump [all]dump dell'hash + segreti del primo admin; all = ogni admin
    --exec CMDcrea un admin temporaneo → esegui CMD → ripulisci
    --user-listlettura in-band elevata dell'intera tabella utenti (nessun login, bypassa la 2FA)
    --content [full]lettura elevata di ogni post type a status=any; full aggiunge i body
    --oracle {auto,union,bool,time}forza un oracle di estrazione (default auto)
    --prefix PFXforza il prefisso delle tabelle invece della risoluzione automatica
    --impersonate UIDimpersona questo user id invece del primo admin
    --threads Nprobe di estrazione concorrenti all'interno di un target (default 5)
    --target-threads Nscansiona N target da -f in concorrenza (default 1)
    --proxy URLinstrada tramite un proxy (es. Burp http://127.0.0.1:8080)
    --timeout SECtimeout per richiesta (default 30)
    --verbose / -vdump delle sub-risposte batch grezze (debug)
    FlagScopo
    --forminvia il batch come multipart/form-data (URL pulito, niente ?rest_route=)
    --permalink [PREFIX]instrada via /<PREFIX>/batch/v1 (default wp-json); tiene il payload fuori dall'URL e fuori da $_POST. Suggerimento: --permalink index.php/wp-json raggiunge REST via PATH_INFO, eludendo le regole ancorate su /wp-json
    --dummy Nantepone N byte di spazzatura nel body per far traboccare il buffer di ispezione di un WAF
    --donor {widgets,categories,tags}cambia la route donatrice della confusione se una risponde 500 (default widgets)
    --per-page Nforza per_page (-1 o un grande positivo restituiscono entrambi tutte le righe; usa un grande positivo se il target risponde 500 su -1)
    --users-route PATHcase/query alternativi per la chiamata di creazione utente (/wp/v2/Users, …?_=1)
    --primer PATHpath desync malformato alternativo se un WAF riconosce il default http://:
    --user-agent UAfissa l'UA (default: un UA browser realistico casuale per esecuzione)
    --embed-base URLsovrascrive la base dell'URL oembed (evita un loopback di self-embed)