
Scanner CVE-2026-63030, CVE-2026-60137, wp2shell
Outils de détection et de validation pour l'exposition du cœur de WordPress à wp2shell
(CVE-2026-63030 / CVE-2026-60137). Les modes sont sélectionnés avec un indicateur, et la
cible est positionnelle. --scan identifie la version du cœur et confirme que la route REST
/batch/v1 est accessible sans envoyer de charge utile d'exploitation ; les modes
--check/--read/--shell/--rce/--root-prereq sont la preuve de concept (PoC) de validation
à utiliser uniquement en laboratoire autorisé.
wp2shell.py est un script unique ne dépendant que de la bibliothèque standard — aucune
dépendance externe. Chaque invocation imprime une bannière ZephrSec sur stderr avant de
s'exécuter (elle reste hors de stdout, donc la sortie JSON --scan -j n'est pas affectée).
Un seul indicateur de mode est requis ; la cible est positionnelle (une URL pour chaque mode,
ou une liste d'hôtes pour --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]
| Indicateur | Ce qu'il fait |
|---|---|
--scan | Vérification d'exposition non destructive : identification de version + confirmation que la route REST /batch/v1 est accessible. Aucune charge utile d'exploitation envoyée. |
--check | Confirme une injection SQL temporelle aveugle avec une sonde différentielle inoffensive. |
--read | Extrait des données via une injection SQL aveugle (un préréglage ou une expression SQL scalaire brute). |
--shell | Chaîne d'exécution de code à distance (RCE) authentifiée utilisant un mot de passe administrateur récupéré/cassé. |
--rce | RCE pré-authentification sans justificatif : crée son propre administrateur via l'injection SQL, puis déploie une webshell auto-nettoyante. |
--root-prereq | Vérification bénigne des prérequis pour l'élévation vers root ; exécute uniquement des diagnostics, jamais une élévation de privilèges locale. |
| Indicateur | S'applique à | Ce qu'il fait |
|---|---|---|
-f, --file | --scan | Lire les hôtes depuis un fichier (un par ligne ; les commentaires # sont ignorés). |
-j, --json | --scan | Émettre les résultats au format JSON sur stdout. |
-t, --threads | --scan | Concurrence d'analyse (par défaut 10). |
--prefix | --check/--read | Préfixe de table de base de données (par défaut wp_). |
--delay | --check/--read | Secondes de SLEEP injectées pour l'oracle temporel (par défaut 0.15). |
--repeats | --check/--read | Médiane sur N sondes par bit ; augmenter sur les liaisons bruyantes (par défaut 1). |
--preset | --read | Cible intégrée : version, database, db_user, users, siteurl (par défaut users). |
--expr | --read | Expression SQL scalaire brute à extraire (remplace --preset). |
--max-len | --read | Longueur maximale de la chaîne extraite (par défaut 128). |
--user | --shell/--root-prereq | Nom d'utilisateur administrateur pour la connexion (par défaut admin). |
--password | --shell/--root-prereq | Mot de passe administrateur en texte clair (casser le hash obtenu via --read ; requis pour ces modes). |
--cmd | --shell/--rce | Commande à exécuter sur la cible (par défaut id). |
-i, --interactive | --shell/--rce | Boucle de commandes web interactive au lieu d'une commande unique. |
--no-cleanup | --shell/--rce | Laisser le plugin/webshell déposé en place (laboratoire uniquement). |
-y, --yes | --shell/--rce/--root-prereq | Ignorer l'invite d'autorisation interactive (pour l'automatisation). |
--sleep | --rce | Secondes de SLEEP injectées pour la détection de l'injection SQL pré-authentification (par défaut 4). |
--rounds | --rce | Médiane sur N sondes pour la détection --rce (par défaut 3). |
--route | --rce | Format de la route batch : auto, rest-route ou wp-json (par défaut auto). |
--proxy | --rce | Acheminer les requêtes via un proxy HTTP, par ex. Burp à http://127.0.0.1:8080. |
--authorized | --rce | Affirmer l'autorisation pour une cible --rce non en boucle locale (requis pour les hôtes distants). |
--timeout | tous | Délai d'attente par requête en secondes (par défaut 15). |
Article de blog approfondi : https://blog.zsec.uk/wp2shell-code-trace-deep-dive/
nuclei -t wp2shell-exposure.yaml -u https://target
Hôte unique, plusieurs hôtes ou un fichier.
python3 wp2shell.py --scan https://target
python3 wp2shell.py --scan host1 host2 host3
python3 wp2shell.py --scan -f hosts.txt
Options : -f/--file fichier d'hôtes (un par ligne), -j/--json sortie JSON,
-t/--threads concurrence (par défaut 10).
Les modes --check/--read/--shell/--rce/--root-prereq envoient des charges utiles
d'exploitation réelles. Exécutez-les uniquement contre le laboratoire local fourni, ou contre
d'autres systèmes dont vous êtes propriétaire et que vous êtes explicitement autorisé à tester.
--shell et --rce effectuent une exécution de code à distance et sont destinés au laboratoire/aux
cibles autorisées ; --rce sur un hôte non en boucle locale nécessite --authorized.
--root-prereq utilise le même plugin de diagnostic à jeton pour vérifier les prérequis
d'élévation vers root, mais n'exécute pas d'élévation de privilèges locale.
--shell nécessite un mot de passe administrateur récupéré/cassé. --rce est la chaîne
pré-authentification sans justificatif : il crée son propre administrateur via l'injection SQL
(oEmbed → changeset → parse_request ré-entrant), puis déploie la webshell — aucun mot de passe
requis.
--shell, --rce et --root-prereq demandent une autorisation interactive y/N avant que toute
charge utile d'exécution de code ne soit envoyée (ils abandonnent sur une entrée standard non
interactive/EOF). Passez -y/--yes pour ignorer l'invite lors de l'automatisation contre le
laboratoire ou une cible autorisée.
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!'
Les diffs de correctifs utilisés pour fonder la preuve de concept sont sauvegardés dans
poc/diffs/, avec des notes de recherche dans poc/RESEARCH.md. L'injection SQL est entièrement
reconstructible à partir du correctif author__not_in. La chaîne --rce sans justificatif
(oEmbed → changeset → ré-entrée → création d'administrateur) reproduit la RCE par défaut sur le
laboratoire fourni ; --shell est le chemin alternatif via un justificatif administrateur
récupéré/cassé pour le téléchargement de plugin authentifié et l'exécution de commandes.