
CVE-2026-63030 / CVE-2026-60137 - Scanneur de RCE pré-authentification WordPress
par @bahartanir (katherinepierce) Fork de ZephrFish/wp2shell-scanner avec des améliorations supplémentaires. Recherche par Adam Kues (Assetnote) et Mustafa Can İPEKÇİ (nukedx).
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 drapeau, 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 payload d'exploitation ; les
modes --check/--read/--shell/--rce/--root-prereq sont le PoC de validation
pour un usage autorisé en laboratoire.
wp2shell.py est un script unique, ne reposant que sur la bibliothèque standard — aucune
dépendance externe. Chaque invocation affiche la bannière sur stderr avant de
s'exécuter (elle reste hors de stdout, donc la sortie JSON de --scan -j n'est pas affectée).
Exactement un drapeau 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]
Analyse approfondie d'origine : 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 (défaut 10).
Les modes --check/--read/--shell/--rce/--root-prereq envoient de véritables payloads
d'exploitation. Exécutez-les uniquement contre le lab local fourni, ou d'autres systèmes que vous
possédez et que vous êtes expressément autorisé à tester. --shell et --rce effectuent une exécution
de code à distance et sont destinés au lab/aux cibles autorisées ; --rce sur un
hôte hors loopback nécessite --authorized. --root-prereq utilise le même
plugin de diagnostic à jeton pour vérifier les prérequis shell→root, mais il n'exécute
pas d'élévation de privilèges locale.
--shell nécessite un mot de passe admin récupéré/cassé. --rce est la
chaîne pré-auth sans identifiants : il forge son propre administrateur via la
SQLi (oEmbed → changeset → parse_request réentrant), puis déploie le
webshell — aucun mot de passe requis.
--shell, --rce et --root-prereq demandent une autorisation interactive y/N
avant l'envoi de tout payload d'exécution de code (ils s'interrompent sur un
stdin non interactif/EOF). Passez -y/--yes pour ignorer l'invite pour
l'automatisation contre le lab 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!'
python3 wp2shell.py --lpe http://127.0.0.1:8080
Les diffs de patch utilisés pour étayer le PoC sont enregistrés sous poc/diffs/, avec les notes
de recherche dans poc/RESEARCH.md. La SQLi est entièrement reconstructible à partir du
correctif author__not_in. La chaîne --rce sans identifiants (oEmbed → changeset →
réentrée → création d'admin) reproduit la RCE de l'installation stock par défaut contre le lab
fourni ; --shell est la voie alternative via un identifiant admin récupéré/cassé pour le
téléversement authentifié du plugin et l'exécution de commandes.
--lpe)--lpe enchaîne la RCE pré-auth complète (SQLi → forge admin → webshell) avec
une tentative automatisée d'élévation vers root. Il essaie ce qui suit dans l'ordre, en s'arrêtant
au premier succès :
python3 wp2shell.py --lpe http://127.0.0.1:8080
python3 wp2shell.py --lpe http://127.0.0.1:8080 -y # skip auth prompt
python3 wp2shell.py --lpe https://target --authorized # non-loopback
--lpe sur une cible hors loopback nécessite --authorized. Sur le lab fourni
(image de base Ubuntu 22.04 avec un noyau GameOverlay vulnérable) CVE-2023-2640/32629
réussit sans compilateur.
| Drapeau | Ce qu'il fait |
|---|
--scan | Vérification d'exposition non destructive : empreinte de version + confirmation que la route REST /batch/v1 est accessible. Aucun payload d'exploitation envoyé. |
--check | Confirme la SQLi aveugle basée sur le temps avec une sonde différentielle inoffensive. |
--read | Extrait des données via SQLi aveugle (un préréglage ou une expression SQL scalaire brute). |
--shell | Chaîne RCE authentifiée utilisant un mot de passe administrateur cassé/récupéré. |
--rce | RCE pré-auth sans identifiants : forge son propre admin via la SQLi, puis déploie un webshell auto-nettoyant. |
--root-prereq | Vérification bénigne des prérequis shell→root ; exécute uniquement des diagnostics, jamais d'élévation de privilèges locale. |
--lpe | Chaîne complète : SQLi pré-auth → forge admin → webshell → root. Essaie CVE-2023-2640/32629 (GameOverlay overlayfs), CVE-2023-4911 (Looney Tunables glibc), CVE-2026-31431 (AF_ALG Copy Fail), CVE-2026-23111 (sonde UAF nf_tables), puis repli SUID/sudo/cap. |
| Drapeau | S'applique à | Ce qu'il fait |
|---|
-f, --file | --scan | Lit les hôtes depuis un fichier (un par ligne ; les commentaires # sont ignorés). |
-j, --json | --scan | Émet les résultats en JSON sur stdout. |
-t, --threads | --scan | Concurrence d'analyse (défaut 10). |
--prefix | --check/--read | Préfixe des tables de la base (défaut wp_). |
--delay | --check/--read | Secondes de SLEEP injectées pour l'oracle temporel (défaut 0.15). |
--repeats | --check/--read | Médiane sur N sondes par bit ; à augmenter sur les liaisons bruyantes (défaut 1). |
--preset | --read | Cible intégrée : version, database, db_user, users, siteurl (défaut users). |
--expr | --read | Expression SQL scalaire brute à extraire (remplace --preset). |
--max-len | --read | Longueur maximale de la chaîne extraite (défaut 128). |
--user | --shell/--root-prereq | Nom d'utilisateur admin pour se connecter (défaut admin). |
--password | --shell/--root-prereq | Mot de passe admin en clair (cassez le hash de --read ; requis pour ces modes). |
--cmd | --shell/--rce | Commande à exécuter sur la cible (défaut id). |
-i, --interactive | --shell/--rce | Boucle de commande web interactive au lieu d'une commande unique. |
--no-cleanup | --shell/--rce | Laisse le plugin/webshell déposé en place (lab uniquement). |
-y, --yes | --shell/--rce/--root-prereq | Ignore l'invite d'autorisation interactive (pour l'automatisation). |
--sleep | --rce | Secondes de SLEEP injectées pour la détection SQLi pré-auth (défaut 4). |
--rounds | --rce | Médiane sur N sondes pour la détection --rce (défaut 3). |
--route | --rce | Forme de la route batch : auto, rest-route ou wp-json (défaut auto). |
--proxy | --rce | Achemine les requêtes via un proxy HTTP, ex. Burp sur http://127.0.0.1:8080. |
--authorized | --rce | Affirme l'autorisation pour une cible --rce hors loopback (requis pour les hôtes distants). |
--timeout | tous | Délai d'attente par requête en secondes (défaut 15). |
| CVE | Affecté | Technique | Compilateur |
|---|
| CVE-2023-2640 / CVE-2023-32629 | Ubuntu 22.04 / 23.04, noyau < 6.3.3 avec pilote GameOverlay | Montage overlayfs non privilégié dans un espace de noms utilisateur préservant chmod +s sur le répertoire supérieur | Aucun (shell pur) |
| CVE-2023-4911 | glibc 2.34–2.38 (Ubuntu 22.04, Debian 12, Fedora 37–38) | Débordement de pile GLIBC_TUNABLES dans _dl_parse_tunables() → injection LD_PRELOAD à l'exécution SUID | gcc requis |
| CVE-2026-31431 | Noyau Linux avec algif_aead + authencesn(hmac(sha256),cbc(aes)) | Optimisation en place AEAD AF_ALG + splice() écrit 4 octets dans le cache de pages du binaire SUID ; sonde de prérequis — lien vers AliHzSec/CVE-2026-31431 | gcc requis |
| CVE-2026-23111 | Ubuntu 22.04 / 24.04, Debian Bookworm / Trixie | UAF de contrôle inversé nf_tables dans nft_map_catchall_activate() → sous-dépassement de chain->use → chaîne libérée ; sonde de prérequis — lien vers Baba01hacker666/CVE-2026-23111 | gcc requis |
| Repli | Toute | Abus SUID GTFOBins + sudo NOPASSWD | Aucun |