Une variante de wp2shell entièrement weaponisée pour le red team (sécurité offensive), conçue pour les tests d'intrusion autorisés et à des fins éducatives.
Une preuve de concept autonome pour l'injection SQL aveugle non authentifiée accessible via le point de terminaison batch REST de WordPress (/wp-json/batch/v1). Il s'agit d'une implémentation indépendante construite à partir des mécanismes de vulnérabilité publiés.
Avis officiel : WordPress Security Release | CVE-2026-63030
Auteur : J4ck3LSyN
Autorités : CFSD, NFK & C4b1NKr3W
Remarque : Je n'ai pas inclus dans cette publication l'implant de persistance weaponisé
r00t.pyqui lui est associé, pour des raisons juridiques évidentes. Pour l'obtenir, vous pouvez m'envoyer un message privé (DM) sur x
[!WARNING]
Ce code est fourni EN L'ÉTAT à des fins éducatives et de recherche uniquement. N'utilisez pas ce PoC sur des systèmes de production, des environnements partagés ou des cibles non autorisées.
- Exécuter ou héberger ce code peut déclencher des détections antivirus, des alertes de surveillance de sécurité ou des conséquences juridiques en cas d'utilisation abusive.
- Les auteurs et les mainteneurs du dépôt déclinent toute responsabilité en cas de dommage, d'utilisation abusive ou d'activité illégale résultant de ce code.
- À utiliser exclusivement dans des environnements de laboratoire isolés avec une autorisation appropriée. Destiné uniquement à la recherche défensive, à l'analyse de vulnérabilités et aux tests blue-team.
poc.py - CLI principale de preuve de concept (modes check, read, shell)val.py - Validateur passif léger de vulnérabilité (val.py <target>)MITIGATIONS.md - Guide complet d'atténuation et de durcissementLETHALITY.html - Matrice visuelle de létalité des capacités (heatmap + kill chain)LICENSE - Licence MITr00t.py:redacted - Orchestrateur principal de l'implant (fait le lien entre tous les éléments)modules/ - Modules d'implant post-exploitationexploit.py - Logique d'exploitation principale (primitive SQLi + RCE)privesc.py:redacted - Vérifications d'élévation de privilèges locale (DirtyCOW, sudo, capabilities, etc.)lpe_byond.py:redacted - LPE avancé utilisant les techniques BYOVD + eBPF (contrôlé par l'opérateur)recon.py:redacted - Profilage et énumération de l'hôtepersistence.py:redacted - Mécanismes de persistance (systemd, cron, clés SSH)c2.py:redacted - Beacon C2 chiffré (HTTPS + DoH)exfil.py:redacted - Collecte d'identifiants et exfiltration de donnéesstealth.py:redacted - Anti-analyse, détection de sandbox et obfuscation| Branch | Versions affectées | Corrigé dans |
|---|---|---|
| 6.9.x | 6.9.0 - 6.9.4 | 6.9.5 |
| 7.0.x | 7.0.0 - 7.0.1 | 7.0.2 |
Consultez les publications de sécurité officielles de WordPress pour plus de détails.
Le point de terminaison batch distribue plusieurs sous-requêtes en un seul appel, en validant et en vérifiant les permissions de chacune indépendamment. Lorsqu'un chemin de sous-requête échoue à wp_parse_url(), il est ajouté au tableau de validation mais pas au tableau des handlers correspondants. Les deux tableaux se désynchronisent, et une sous-requête ultérieure est distribuée sous le handler d'une autre sous-requête. C'est la confusion de routes.
Ce PoC imbrique la primitive deux fois :
POST /wp/v2/posts portant un corps requests est distribuée sous le handler batch lui-même. Ayant été validée comme une requête posts, sa liste interne requests n'est jamais revérifiée par rapport au schéma batch, de sorte que les sous-requêtes internes peuvent utiliser GET (contournement de la liste blanche des méthodes).GET /wp/v2/users portant author_exclude=... est distribuée sous posts get_items(). Le schéma de la collection users ne comporte pas de paramètre author_exclude, la valeur traverse donc la validation sans modification. posts get_items() mappe author_exclude vers la variable de requête author__not_in de WP_Query, que les versions vulnérables interpolent dans le SQL sous forme de chaîne brute.Le puits (sink) final est une injection SQL aveugle booléenne / temporelle avant authentification :
... post_author NOT IN (<value>) ...
Une valeur de 0) <sql>-- - ferme la liste IN() et ajoute du SQL arbitraire.
Le PoC est verrouillé par défaut (fail-closed). Trois garde-fous d'exécution empêchent toute exécution accidentelle ou hors périmètre. Ils sont tous appliqués dans modules/exploit.py ; la CLI de poc.py se contente de les transmettre.
| Flag | Scope | Effet en cas d'absence |
|---|---|---|
--authorized | Toutes les I/O réseau | AuthorizationError avant tout envoi |
--noop | Toutes les sous-commandes | Construit/affiche les payloads ; aucun contact réseau |
--max-requests | BatchClient | Budget de requêtes strict |
--r00t | Sous-commande shell | Capacités RCE post-authentification non fournies |
AuthorizationError est levée dans BatchClient._ensure_authorized(), AdminSession._ensure_authorized() et AdminSession._ensure_r00t().BatchClient._count() applique --max-requests avant l'ouverture de la socket.--r00t est le séparateur de capacités : une version distribuée sans lui ne peut ni déployer ni exécuter de webshell.Gestion des identifiants pour shell : le nom d'utilisateur et le mot de passe admin proviennent de --user / --password, ou de variables d'environnement / d'un fichier sécurisé.
git clone https://github.com/J4ck3LSyN-Gen2/CVE-2026-63030-wp2r00t.git
cd CVE-2026-63030-wp2r00t
python3 -m py_compile modules/exploit.py poc.py # basic sanity check
Prérequis : Python 3.11+, bibliothèque standard uniquement (aucune dépendance pip).
python3 poc.py <command> <url> [flags]
Drapeaux courants (toutes les sous-commandes) :
--authorized Assert you own / are authorized to test <url>. Required to send.
--noop Build/validate payloads without sending (no network contact).
--max-requests N Hard cap on requests to the target.
--rest-route Use /?rest_route=/batch/v1 instead of /wp-json/batch/v1.
--timeout FLOAT Request timeout (default 30).
--proxy URL HTTP(S) proxy.
--insecure Disable TLS certificate verification.
check - Confirmer la vulnérabilité (non destructif)read - Extraction SQL aveugleshell - Aide au webshell post-authentification (nécessite --r00t)validate - Identifiant passifRéférence rapide