# Scanner de sécurité WordPress en lecture seule pour serveurs HestiaCP Détecte les indicateurs de compromission wp2shell (CVE-2026-63030 / CVE-2026-60137) sur tous les sites hébergés — rapports par e-mail par utilisateur, comparaison des fichiers du noyau avec un WordPress propre, analyse PHP/JS/htaccess/images, et évaluation IA facultative via l'API Claude.
Scanner de sécurité WordPress en lecture seule pour les serveurs HestiaCP.
Détecte les indicateurs de compromission wp2shell sur tous les sites hébergés — avec rapports email par client, diff des fichiers du noyau, détection de webshells par SHA256, score de risque et évaluation IA optionnelle.
⚠️ Versions sûres : WordPress 6.8.6 / 6.9.5 / 7.0.2 ou plus récent.
Ces scripts ne modifient jamais rien — lecture seule de bout en bout.
wp2shell est une chaîne d'exécution de code à distance (RCE) sans authentification dans le noyau WordPress, divulguée le 17 juillet 2026. Une seule requête HTTP anonyme contre une installation par défaut suffit pour créer un administrateur malveillant et exécuter du code arbitraire sur le serveur.
La chaîne combine :
author__not_in de WP_Query/wp-json/batch/v1Les sites compromis présentent un administrateur malveillant avec le préfixe de connexion wp2_ et l'email @wp2shell.invalid.
Plus d'informations : https://wp2shell.com
| Fichier | Objectif |
|---|---|
wp2shell-scan.sh | Scanner IoC rapide à l'échelle du serveur — sortie terminal colorée, score de risque par site, rapport auto-enregistré dans /root/ |
wp2shell-report-per-user.sh | Scanner complet — rapports email par utilisateur HestiaCP, diff des fichiers du noyau, détection de webshells par SHA256, évaluation IA, score de risque |
known_shells.sha256 | Base de données de hachages SHA256 de webshells connus — récupérée automatiquement à l'exécution |
| Vérification | Sévérité |
|---|---|
| Version WordPress vs. versions sûres | HIGH / OK |
Comptes avec préfixe wp2_ ou email @wp2shell.invalid | CRITICAL |
| Administrateurs créés après la divulgation (15/07/2026) | MEDIUM |
| Lacunes dans la séquence des ID utilisateurs (traces d'admin malveillant supprimé) | MEDIUM |
Lignes wp_usermeta orphelines | MEDIUM |
Lignes oembed_cache / customize_changeset empoisonnées | CRITICAL |
Options WP falsifiées (upload_path, auto_prepend_file, siteurl) | CRITICAL / HIGH |
| Vérification | Sévérité |
|---|---|
wp core verify-checksums vs. wp.org | HIGH |
diff -U5 ligne par ligne contre le noyau propre téléchargé | CRITICAL / HIGH / OK |
| Fichiers supplémentaires absents du noyau propre (contenu + métadonnées affichés) | CRITICAL / HIGH |
| Vérification | Sévérité |
|---|---|
PHP dans uploads/ | CRITICAL |
Extensions PHP supplémentaires (.php7 .phtml .phar .php5) | HIGH |
| Correspondance SHA256 avec la base de données de webshells connus (WSO, FilesMan, b374k, p0wny…) | CRITICAL |
PHP modifié après SINCE_DATE ET correspondant à des motifs suspects — avec la ligne correspondante affichée en ligne | CRITICAL / HIGH |
| PHP avec motifs suspects mais PAS modifié récemment | LOW |
JS/HTML modifié après SINCE_DATE ET correspondant à des motifs d'obfuscation | MEDIUM |
| URLs externes C2/exfiltration (pastebin, ngrok, webhooks Discord, bit.ly…) | CRITICAL |
Directives dangereuses .htaccess (AddType, auto_prepend_file, RewriteRule externe) | HIGH |
.htaccess modifié après SINCE_DATE | MEDIUM |
Images polyglottes avec payload PHP (<?php dans .jpg/.png…) | CRITICAL |
Fichiers de sauvegarde/config exposés (wp-config.php.bak, *.sql…) | MEDIUM |
| Vérification | Sévérité |
|---|---|
Entrées crontab utilisateur avec curl/wget/php/base64 | HIGH |
| Fichiers cron système référençant le chemin du site | MEDIUM |
Chaque site reçoit un score de risque de 0 à 100 avec une ventilation de chaque résultat contributif :
+------------------------------------------+
| RISK SCORE: 96/100 COMPROMISED |
+------------------------------------------+
+40 wp2shell fingerprint account
+30 PHP file(s) inside uploads/
+20 Vulnerable WordPress version
+6 Core checksum failure
| Score | Libellé |
|---|---|
| 0–20 | Probablement propre |
| 21–40 | Risque faible |
| 41–60 | Risque moyen |
| 61–80 | Risque élevé |
| 81+ | COMPROMIS |
wprootsendmail (pour les rapports email)python3 (pour la gestion JSON de l'évaluation IA)curl, sha256sum, file, strings, unzipcurl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
chmod +x wp-cli.phar && sudo mv wp-cli.phar /usr/local/bin/wp
curl -fsSL https://raw.githubusercontent.com/BytesPulse-OE/wp2shell-Hestia-Scanner/main/wp2shell-scan.sh | sudo bash
curl -fsSL https://raw.githubusercontent.com/BytesPulse-OE/wp2shell-Hestia-Scanner/main/wp2shell-report-per-user.sh \
-o wp2shell-report-per-user.sh && sudo bash wp2shell-report-per-user.sh
Remarque : Le scanner complet pose des questions interactives au démarrage (évaluation IA, enregistrement du rapport, seuil de date). Télécharger d'abord puis exécuter garantit que les invites fonctionnent correctement.
sudo bash wp2shell-scan.sh
Trouve toutes les installations WordPress sous /home/*/web/*/public_html/, exécute toutes les vérifications, affiche une sortie colorée dans le terminal et enregistre un rapport complet dans /root/wp2shell-report-YYYYMMDD-HHMMSS.txt.
Au démarrage, il demande un seuil de date personnalisé facultatif (par défaut : 2026-07-15).
sudo bash wp2shell-report-per-user.sh
Au démarrage, trois questions :
[AI EVALUATION] Utiliser l'évaluation IA pour les fichiers ambigus ? [y/N]
[SAVE REPORT] Enregistrer un rapport complet pour examen ultérieur ? [y/N]
[DATE THRESHOLD] Utiliser une date différente ? Laisser vide pour conserver la valeur par défaut [YYYY-MM-DD] :
Commencez toujours avec DRY_RUN=1 (la valeur par défaut) — les emails sont prévisualisés à l'écran, rien n'est envoyé. Passez à DRY_RUN=0 uniquement après avoir confirmé que la sortie semble correcte.
| Variable | Défaut | Description |
|---|---|---|
WEB_ROOT | /home | Racine web HestiaCP |
SINCE_DATE | 2026-07-15 | Seuil « modifié récemment » |
WP | wp | Chemin vers WP-CLI |
| Variable | Défaut | Description |
|---|---|---|
DRY_RUN | 1 | 1 = aperçu uniquement, 0 = envoyer les emails |
SEND_ONLY_IF_ISSUES | 0 | 1 = ignorer l'email si le site est propre |
SINCE_DATE | 2026-07-15 | Seuil « modifié récemment » |
MAIL_FROM | security@<hostname> | Expéditeur de l'enveloppe |
CORE_CACHE | /root/wp2shell-cores | Répertoire de cache des noyaux propres |
ANTHROPIC_API_KEY | (vide) | Clé API Claude pour l'évaluation IA |
Pour les diffs ambigus que les motifs seuls ne peuvent pas classer, le scanner envoie le diff à l'API Claude (claude-sonnet-4-6) et renvoie un verdict : DANGER, SUSPICIOUS, REVIEW ou OK avec une explication en une phrase. L'IA est utilisée uniquement dans la zone grise — les cas clairs sont classés instantanément sans aucun appel API.
Définissez votre clé dans le script ou exportez-la avant l'exécution :
export ANTHROPIC_API_KEY='sk-ant-api03-...'
sudo -E bash wp2shell-report-per-user.sh
Clés API : https://console.anthropic.com — séparées des abonnements claude.ai.
Collez la sortie de votre scan dans l'artefact wp2shell Report Analyzer sur Claude.ai — il effectue la même évaluation IA directement dans le navigateur sans nécessiter votre propre clé.
| Libellé | Couleur | Signification |
|---|---|---|
[CRITICAL] | 🔴 Rouge gras | Indicateur de compromission active — agir immédiatement |
[HIGH] | 🔴 Rouge | Indicateur fort — examiner en urgence |
[MEDIUM] | 🟡 Jaune | Suspect — enquêter |
[LOW] | 🔵 Bleu | Priorité faible — probablement un faux positif |
[INFO] | ⚫ Gris | Informationnel |
[OK] | 🟢 Vert | Propre / attendu |
┌─ MODIFIED: wp-includes/load.php
│ [CRITICAL] Assessment (patterns): executable/obfuscated pattern in added lines
│ +20 Core file modified with dangerous pattern
│
│ ORIGINAL: /root/wp2shell-cores/7.0.2-el/wp-includes/load.php
│ SITE: /home/user/web/example.gr/public_html/wp-includes/load.php
│ @@ -212,5 +212,6 @@
│ - $loaded = true;
│ + $loaded = true;
│ + eval(base64_decode('aGVsbG8='));
└──────────────────────────────────────
CORE_CACHE (/root/wp2shell-cores/) est réutilisé entre les scans. Supprimez-le pour forcer un nouveau téléchargement.known_shells.sha256 est actualisée automatiquement une fois par jour.GPL-3.0 — voir LICENSE
Développé par BytesPulse en réponse à la divulgation wp2shell (juillet 2026).
Informations CVE : https://wp2shell.com
Το wp2shell είναι μια αλυσίδα εκμετάλλευσης απομακρυσμένης εκτέλεσης κώδικα (RCE) στον πυρήνα του WordPress, που αποκαλύφθηκε στις 17 Ιουλίου 2026. Ένα μόνο ανώνυμο HTTP αίτημα σε μια προεπιλεγμένη εγκατάσταση αρκεί για τη δημιουργία διαχειριστή και την εκτέλεση αυθαίρετου κώδικα στον server.
Η αλυσίδα συνδυάζει:
author__not_in του WP_Query/wp-json/batch/v1Τα παραβιασμένα sites εμφανίζουν λογαριασμό διαχειριστή με πρόθεμα wp2_ και email @wp2shell.invalid.
Περισσότερες πληροφορίες: https://wp2shell.com
| Αρχείο | Σκοπός |
|---|---|
wp2shell-scan.sh | Γρήγορος σαρωτής IoC — έγχρωμη έξοδος στο terminal, risk score ανά site, αυτόματη αποθήκευση report στο /root/ |
wp2shell-report-per-user.sh | Πλήρης σαρωτής — email αναφορές ανά HestiaCP user, diff πυρήνα, SHA256 ανίχνευση webshells, AI αξιολόγηση, risk score |
known_shells.sha256 | Βάση δεδομένων SHA256 γνωστών webshells — κατεβαίνει αυτόματα κατά την εκτέλεση |
| Έλεγχος | Σοβαρότητα |
|---|---|
| Έκδοση WordPress vs. ασφαλείς εκδόσεις | HIGH / OK |
Λογαριασμοί με πρόθεμα wp2_ ή email @wp2shell.invalid | CRITICAL |
| Διαχειριστές που δημιουργήθηκαν μετά την αποκάλυψη (15/07/2026) | MEDIUM |
| Κενά στην ακολουθία user-ID (ίχνη διαγραμμένου rogue admin) | MEDIUM |
Orphaned wp_usermeta rows | MEDIUM |
Δηλητηριασμένα oembed_cache / customize_changeset rows | CRITICAL |
Αλλοιωμένες WP επιλογές (upload_path, auto_prepend_file, siteurl) | CRITICAL / HIGH |
| Έλεγχος | Σοβαρότητα |
|---|---|
wp core verify-checksums vs. wp.org | HIGH |
Γραμμή-γραμμή diff -U5 έναντι καθαρού πυρήνα | CRITICAL / HIGH / OK |
| Επιπλέον αρχεία που δεν υπάρχουν στον καθαρό πυρήνα | CRITICAL / HIGH |
| Έλεγχος | Σοβαρότητα |
|---|---|
PHP αρχεία στο uploads/ | CRITICAL |
Επιπλέον PHP extensions (.php7 .phtml .phar .php5) | HIGH |
| SHA256 αντιστοίχιση με γνωστά webshells (WSO, FilesMan, b374k, p0wny…) | CRITICAL |
PHP που τροποποιήθηκε μετά το SINCE_DATE ΚΑΙ περιέχει ύποπτο pattern — με την ακριβή γραμμή | CRITICAL / HIGH |
| PHP με ύποπτα patterns που ΔΕΝ τροποποιήθηκε πρόσφατα | LOW |
JS/HTML τροποποιημένα μετά το SINCE_DATE με obfuscation patterns | MEDIUM |
| Εξωτερικές C2/εξαγωγή δεδομένων URLs (pastebin, ngrok, Discord webhooks, bit.ly…) | CRITICAL |
Επικίνδυνα directives σε .htaccess | HIGH |
.htaccess τροποποιημένο μετά το SINCE_DATE | MEDIUM |
| Polyglot εικόνες με PHP payload | CRITICAL |
| Εκτεθειμένα backup/config αρχεία | MEDIUM |
| Έλεγχος | Σοβαρότητα |
|---|---|
Crontab χρήστη με curl/wget/php/base64 | HIGH |
| System cron αρχεία που αναφέρουν το path του site | MEDIUM |
Κάθε site λαμβάνει βαθμολογία 0–100 με ανάλυση κάθε ευρήματος:
+------------------------------------------+
| RISK SCORE: 96/100 COMPROMISED |
+------------------------------------------+
+40 wp2shell fingerprint account
+30 PHP file(s) inside uploads/
+20 Vulnerable WordPress version
+6 Core checksum failure
| Βαθμολογία | Κατηγορία |
|---|---|
| 0–20 | Probably Clean |
| 21–40 | Low Risk |
| 41–60 | Medium Risk |
| 61–80 | High Risk |
| 81+ | COMPROMISED |
wprootsendmail (για αποστολή email)python3 (για AI αξιολόγηση)curl, sha256sum, file, strings, unzipcurl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
chmod +x wp-cli.phar && sudo mv wp-cli.phar /usr/local/bin/wp
curl -fsSL https://raw.githubusercontent.com/BytesPulse-OE/wp2shell-Hestia-Scanner/main/wp2shell-scan.sh | sudo bash
curl -fsSL https://raw.githubusercontent.com/BytesPulse-OE/wp2shell-Hestia-Scanner/main/wp2shell-report-per-user.sh \
-o wp2shell-report-per-user.sh && sudo bash wp2shell-report-per-user.sh
sudo bash wp2shell-scan.sh
Βρίσκει αυτόματα όλα τα WordPress installs κάτω από /home/*/web/*/public_html/, εκτελεί όλους τους ελέγχους, τυπώνει έγχρωμη έξοδο στο terminal και αποθηκεύει πλήρες report στο /root/.
sudo bash wp2shell-report-per-user.sh
Κατά την εκκίνηση ρωτά τρία πράγματα:
[AI EVALUATION] Χρήση AI αξιολόγησης για αμφίβολα αρχεία; [y/N]
[SAVE REPORT] Αποθήκευση πλήρους report σε αρχείο; [y/N]
[DATE THRESHOLD] Διαφορετική ημερομηνία; Αφήστε κενό για default [YYYY-MM-DD]:
Ξεκινήστε πάντα με DRY_RUN=1 (default) — τα emails εμφανίζονται στην οθόνη, δεν στέλνονται. Αλλάξτε σε DRY_RUN=0 μόνο αφού επιβεβαιώσετε ότι η έξοδος είναι σωστή.
| Μεταβλητή | Default | Περιγραφή |
|---|---|---|
WEB_ROOT | /home | Root φάκελος HestiaCP |
SINCE_DATE | 2026-07-15 | Κατώφλι "πρόσφατα τροποποιημένων" |
WP | wp | Διαδρομή WP-CLI |
| Μεταβλητή | Default | Περιγραφή |
|---|---|---|
DRY_RUN | 1 | 1 = μόνο preview, 0 = αποστολή emails |
SEND_ONLY_IF_ISSUES | 0 | 1 = email μόνο αν βρεθεί κάτι |
SINCE_DATE | 2026-07-15 | Κατώφλι "πρόσφατα τροποποιημένων" |
MAIL_FROM | security@<hostname> | Sender email |
CORE_CACHE | /root/wp2shell-cores | Cache καθαρών πυρήνων |
ANTHROPIC_API_KEY | (κενό) | Claude API key για AI αξιολόγηση |
Για αμφίβολα diffs που τα patterns δεν μπορούν να ταξινομήσουν, ο σαρωτής στέλνει το diff στο Claude API (claude-sonnet-4-6) και επιστρέφει ετυμηγορία: DANGER, SUSPICIOUS, REVIEW, ή OK με μία πρόταση εξήγηση. Το AI χρησιμοποιείται μόνο στη γκρίζα ζώνη.
export ANTHROPIC_API_KEY='sk-ant-api03-...'
sudo -E bash wp2shell-report-per-user.sh
API keys: https://console.anthropic.com — ξεχωριστό από τη συνδρομή claude.ai.
Κάντε paste το output του scan στο wp2shell Report Analyzer artifact στο Claude.ai — εκτελεί την ίδια AI αξιολόγηση απευθείας στον browser.
CORE_CACHE (/root/wp2shell-cores/) επαναχρησιμοποιείται μεταξύ scans. Διαγράψτε τον για αναγκαστική επαναλήψη.known_shells.sha256 ανανεώνεται αυτόματα μία φορά ανά 24 ώρες.GPL-3.0 — δείτε LICENSE
Αναπτύχθηκε από την BytesPulse σε απόκριση της αποκάλυψης wp2shell (Ιούλιος 2026).
Πληροφορίες CVE: https://wp2shell.com