
# Schreibgeschützter WordPress-Sicherheitsscanner für HestiaCP-Server Erkennt wp2shell-Kompromittierungsindikatoren (CVE-2026-63030 / CVE-2026-60137) auf allen gehosteten Websites – E-Mail-Berichte pro Benutzer, Dateidiff des Kerns gegenüber sauberem WordPress, PHP/JS/htaccess/Bildanalyse und optionale KI-Bewertung über die Claude-API.
<div align="center">
# 🛡️ wp2shell-Hestia-Scanner
<p>
<a href="#english">🇬🇧 English</a>
|
<a href="#greek">🇬🇷 Ελληνικά</a>
</p>




**Nur-Lese-WordPress-Sicherheitsscanner für HestiaCP-Server.**
Erkennt wp2shell-Kompromittierungsindikatoren auf allen gehosteten Websites – mit E-Mail-Berichten pro Kunde, Core-Datei-Diff, SHA256-Webshell-Erkennung, Risikobewertung und optionaler KI-Auswertung.
> ⚠️ **Sichere Versionen:** WordPress **6.8.6 / 6.9.5 / 7.0.2** oder neuer.
> Diese Skripte **ändern niemals etwas** – durchgehend nur lesend.
</div>
---
<a name="english"></a>
# 🇬🇧 English
## Was ist wp2shell?
wp2shell ist eine Pre-Authentication-Remote-Code-Execution-Kette (RCE) im WordPress-Core, die am **17. Juli 2026** offengelegt wurde. Eine einzige anonyme HTTP-Anfrage gegen eine Standardinstallation genügt, um einen Schatten-Administrator zu erstellen und beliebigen Code auf dem Server auszuführen.
Die Kette kombiniert:
- **CVE-2026-60137** – SQL-Injection im Parameter `author__not_in` von `WP_Query`
- **CVE-2026-63030** – Route-Confusion im REST-API-Endpunkt `/wp-json/batch/v1`
Kompromittierte Websites zeigen einen Schatten-Admin mit dem Login-Präfix `wp2_` und der E-Mail `@wp2shell.invalid`.
Weitere Informationen: <https://wp2shell.com>
---
## Repository-Inhalt
| Datei | Zweck |
|------|---------|
| `wp2shell-scan.sh` | Schneller serverweiter IoC-Scanner – farbcodierte Terminalausgabe, Risikobewertung pro Website, automatisch gespeicherter Bericht unter `/root/` |
| `wp2shell-report-per-user.sh` | Vollständiger Scanner – E-Mail-Berichte pro HestiaCP-Benutzer, Core-Datei-Diff, SHA256-Webshell-Erkennung, KI-Auswertung, Risikobewertung |
| `known_shells.sha256` | Datenbank bekannter Webshell-Hashes (SHA256) – wird zur Laufzeit automatisch abgerufen |
---
## Was der Scanner prüft
### Datenbank-/Benutzerprüfungen
| Prüfung | Schweregrad |
|-------|----------|
| WordPress-Version vs. sichere Versionen | HIGH / OK |
| Konten mit Präfix `wp2_` oder E-Mail `@wp2shell.invalid` | CRITICAL |
| Administratoren, die nach der Offenlegung (15.07.2026) erstellt wurden | MEDIUM |
| Lücken in der Benutzer-ID-Sequenz (Spuren gelöschter Schatten-Admins) | MEDIUM |
| Verwaiste `wp_usermeta`-Zeilen | MEDIUM |
| Vergiftete `oembed_cache` / `customize_changeset`-Zeilen | CRITICAL |
| Manipulierte WP-Optionen (`upload_path`, `auto_prepend_file`, `siteurl`) | CRITICAL / HIGH |
### Core-Datei-Integrität
| Prüfung | Schweregrad |
|-------|----------|
| `wp core verify-checksums` vs. wp.org | HIGH |
| Zeilenweises `diff -U5` gegen sauberen heruntergeladenen Core | CRITICAL / HIGH / OK |
| Zusätzliche Dateien, die im sauberen Core nicht vorhanden sind (Inhalt + Metadaten werden angezeigt) | CRITICAL / HIGH |
### Dateianalyse
| Prüfung | Schweregrad |
|-------|----------|
| PHP in `uploads/` | CRITICAL |
| Zusätzliche PHP-Erweiterungen (`.php7` `.phtml` `.phar` `.php5`) | HIGH |
| **SHA256-Abgleich mit bekannter Webshell-Datenbank** (WSO, FilesMan, b374k, p0wny…) | CRITICAL |
| PHP nach `SINCE_DATE` geändert **UND** mit verdächtigen Mustern – mit passender Zeile inline angezeigt | CRITICAL / HIGH |
| PHP mit verdächtigen Mustern, aber NICHT kürzlich geändert | LOW |
| JS/HTML nach `SINCE_DATE` geändert UND mit Verschleierungsmustern | MEDIUM |
| **Externe C2-/Exfiltrations-URLs** (pastebin, ngrok, Discord-Webhooks, bit.ly…) | CRITICAL |
| Gefährliche `.htaccess`-Direktiven (`AddType`, `auto_prepend_file`, externe `RewriteRule`) | HIGH |
| `.htaccess` nach `SINCE_DATE` geändert | MEDIUM |
| Polyglot-Bilder mit PHP-Payload (`<?php` in `.jpg`/`.png`…) | CRITICAL |
| Offengelegte Backup-/Konfigurationsdateien (`wp-config.php.bak`, `*.sql`…) | MEDIUM |
### Persistenz
| Prüfung | Schweregrad |
|-------|----------|
| Benutzer-Crontab-Einträge mit `curl`/`wget`/`php`/`base64` | HIGH |
| System-Cron-Dateien, die den Website-Pfad referenzieren | MEDIUM |
### Risikobewertung
Jede Website erhält eine **Risikobewertung von 0–100** mit einer Aufschlüsselung jedes beitragenden Befunds:
```
+------------------------------------------+
| RISK SCORE: 96/100 COMPROMISED |
+------------------------------------------+
+40 wp2shell fingerprint account
+30 PHP file(s) inside uploads/
+20 Vulnerable WordPress version
+6 Core checksum failure
```
| Bewertung | Kennzeichnung |
|-------|-------|
| 0–20 | Probably Clean |
| 21–40 | Low Risk |
| 41–60 | Medium Risk |
| 61–80 | High Risk |
| 81+ | **COMPROMISED** |
---
## Anforderungen
- Linux-Server mit **HestiaCP**
- **bash** 4.0+
- **[WP-CLI](https://wp-cli.org/)** global als `wp` installiert
- `root`-Zugriff
- `sendmail` (für E-Mail-Berichte)
- `python3` (für die KI-Auswertung der JSON-Verarbeitung)
- `curl`, `sha256sum`, `file`, `strings`, `unzip`
### WP-CLI installieren (falls fehlend)
```bash
curl -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
```
---
## Einzeiler-Installation und Ausführung
### Schneller IoC-Scan
```bash
curl -fsSL https://raw.githubusercontent.com/BytesPulse-OE/wp2shell-Hestia-Scanner/main/wp2shell-scan.sh | sudo bash
```
### Vollständiger Scan mit E-Mail-Berichten pro Kunde
```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
```
> **Hinweis:** Der vollständige Scanner stellt beim Start interaktive Fragen (KI-Auswertung, Bericht speichern, Datumsschwelle). Das Herunterladen und anschließende Ausführen stellt sicher, dass die Eingabeaufforderungen korrekt funktionieren.
---
## Verwendung
### wp2shell-scan.sh – schneller serverweiter Scan
```bash
sudo bash wp2shell-scan.sh
```
Findet alle WordPress-Installationen unter `/home/*/web/*/public_html/`, führt alle Prüfungen durch, gibt farbcodierte Ausgabe im Terminal aus und speichert einen vollständigen Bericht unter `/root/wp2shell-report-YYYYMMDD-HHMMSS.txt`.
Beim Start wird optional eine benutzerdefinierte Datumsschwelle abgefragt (Standard: `2026-07-15`).
### wp2shell-report-per-user.sh – vollständiger Scan mit E-Mail-Berichten
```bash
sudo bash wp2shell-report-per-user.sh
```
Beim Start drei Fragen:
```
[AI EVALUATION] Use AI evaluation for ambiguous files? [y/N]
[SAVE REPORT] Save a full report file for later review? [y/N]
[DATE THRESHOLD] Use a different date? Leave blank to keep default [YYYY-MM-DD]:
```
**Immer mit `DRY_RUN=1` starten** (Standard) – E-Mails werden auf dem Bildschirm in der Vorschau angezeigt, nichts wird gesendet. Erst nach Bestätigung, dass die Ausgabe korrekt aussieht, auf `DRY_RUN=0` ändern.
---
## Konfiguration
### wp2shell-scan.sh
| Variable | Standard | Beschreibung |
|----------|---------|-------------|
| `WEB_ROOT` | `/home` | HestiaCP-Web-Root |
| `SINCE_DATE` | `2026-07-15` | Schwelle für „kürzlich geändert“ |
| `WP` | `wp` | Pfad zu WP-CLI |
### wp2shell-report-per-user.sh
| Variable | Standard | Beschreibung |
|----------|---------|-------------|
| `DRY_RUN` | `1` | `1` = nur Vorschau, `0` = E-Mails senden |
| `SEND_ONLY_IF_ISSUES` | `0` | `1` = E-Mail überspringen, wenn Website sauber ist |
| `SINCE_DATE` | `2026-07-15` | Schwelle für „kürzlich geändert“ |
| `MAIL_FROM` | `security@<hostname>` | Umschlag-Absender |
| `CORE_CACHE` | `/root/wp2shell-cores` | Cache-Verzeichnis für saubere Core-Dateien |
| `ANTHROPIC_API_KEY` | *(leer)* | Claude-API-Schlüssel für KI-Auswertung |
---
## KI-Auswertung (optional)
Für mehrdeutige Diffs, die Muster allein nicht klassifizieren können, sendet der Scanner das Diff an die **Claude-API** (`claude-sonnet-4-6`) und gibt ein Urteil zurück: `DANGER`, `SUSPICIOUS`, `REVIEW` oder `OK` mit einer einzeiligen Erklärung. KI wird **nur** in der Grauzone verwendet – eindeutige Fälle werden sofort ohne API-Aufruf klassifiziert.
Setzen Sie Ihren Schlüssel im Skript oder exportieren Sie ihn vor der Ausführung:
```bash
export ANTHROPIC_API_KEY='sk-ant-api03-...'
sudo -E bash wp2shell-report-per-user.sh
```
API-Schlüssel: <https://console.anthropic.com> – getrennt von claude.ai-Abonnements.
### Kein API-Schlüssel? Verwenden Sie den Browser-Analyzer
Fügen Sie Ihre Scan-Ausgabe in das **wp2shell Report Analyzer**-Artefakt auf Claude.ai ein – es führt dieselbe KI-Auswertung direkt im Browser durch, ohne dass Sie einen eigenen Schlüssel benötigen.
---
## Ausgabeformat
### Schweregrade
| Kennzeichnung | Farbe | Bedeutung |
|-------|-------|---------|
| `[CRITICAL]` | 🔴 Fett rot | Aktiver Kompromittierungsindikator – sofort handeln |
| `[HIGH]` | 🔴 Rot | Starker Indikator – dringend prüfen |
| `[MEDIUM]` | 🟡 Gelb | Verdächtig – untersuchen |
| `[LOW]` | 🔵 Blau | Niedrige Priorität – wahrscheinlich Fehlalarm |
| `[INFO]` | ⚫ Grau | Informativ |
| `[OK]` | 🟢 Grün | Sauber / erwartet |
### Core-Diff-Beispiel
```
┌─ 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='));
└──────────────────────────────────────
```
---
## Hinweise
- Der Scanner **ändert niemals etwas**. Sicher für den Einsatz auf Live-Produktionsservern.
- Die Aktualisierung von WordPress auf eine gepatchte Version schließt die Schwachstelle, **bereinigt aber nicht** eine bereits kompromittierte Website. Wenn Indikatoren gefunden werden, stellen Sie aus einem sauberen Backup wieder her.
- Das Verzeichnis `CORE_CACHE` (`/root/wp2shell-cores/`) wird über mehrere Scans hinweg wiederverwendet. Löschen Sie es, um einen frischen Download zu erzwingen.
- Die Hash-Datenbank `known_shells.sha256` wird automatisch einmal täglich aktualisiert.
---
## Lizenz
GPL-3.0 – siehe [LICENSE](https://github.com/bytespulse-oe/wp2shell-hestia-scanner/blob/main/LICENSE)
---
## Credits
Entwickelt von **[BytesPulse](https://bytespulse.gr)** als Reaktion auf die wp2shell-Offenlegung (Juli 2026).
CVE-Informationen: <https://wp2shell.com>
---
---
<a name="greek"></a>
# 🇬🇷 Ελληνικά
## Τι είναι το wp2shell;
Το wp2shell είναι μια αλυσίδα εκμετάλλευσης απομακρυσμένης εκτέλεσης κώδικα (RCE) στον πυρήνα του WordPress, που αποκαλύφθηκε στις **17 Ιουλίου 2026**. Ένα μόνο ανώνυμο HTTP αίτημα σε μια προεπιλεγμένη εγκατάσταση αρκεί για τη δημιουργία διαχειριστή και την εκτέλεση αυθαίρετου κώδικα στον server.
Η αλυσίδα συνδυάζει:
- **CVE-2026-60137** — SQL injection στην παράμετρο `author__not_in` του `WP_Query`
- **CVE-2026-63030** — Route confusion στο REST API `/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 |
### Persistence
| Έλεγχος | Σοβαρότητα |
|---------|-----------|
| Crontab χρήστη με `curl`/`wget`/`php`/`base64` | HIGH |
| System cron αρχεία που αναφέρουν το path του site | MEDIUM |
### Risk Score
Κάθε 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** |
---
## Απαιτήσεις
- Linux server με **HestiaCP**
- **bash** 4.0+
- **[WP-CLI](https://wp-cli.org/)** εγκατεστημένο ως `wp`
- Πρόσβαση `root`
- `sendmail` (για αποστολή email)
- `python3` (για AI αξιολόγηση)
- `curl`, `sha256sum`, `file`, `strings`, `unzip`
### Εγκατάσταση WP-CLI (αν λείπει)
```bash
curl -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
```
---
## Εγκατάσταση με μία εντολή
### Γρήγορος σαρωτής IoC
```bash
curl -fsSL https://raw.githubusercontent.com/BytesPulse-OE/wp2shell-Hestia-Scanner/main/wp2shell-scan.sh | sudo bash
```
### Πλήρης σαρωτής με email αναφορές
```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
```
---
## Χρήση
### wp2shell-scan.sh
```bash
sudo bash wp2shell-scan.sh
```
Βρίσκει αυτόματα όλα τα WordPress installs κάτω από `/home/*/web/*/public_html/`, εκτελεί όλους τους ελέγχους, τυπώνει έγχρωμη έξοδο στο terminal και αποθηκεύει πλήρες report στο `/root/`.
### wp2shell-report-per-user.sh
```bash
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` μόνο αφού επιβεβαιώσετε ότι η έξοδος είναι σωστή.
---
## Ρυθμίσεις
### wp2shell-scan.sh
| Μεταβλητή | Default | Περιγραφή |
|-----------|---------|-----------|
| `WEB_ROOT` | `/home` | Root φάκελος HestiaCP |
| `SINCE_DATE` | `2026-07-15` | Κατώφλι "πρόσφατα τροποποιημένων" |
| `WP` | `wp` | Διαδρομή WP-CLI |
### wp2shell-report-per-user.sh
| Μεταβλητή | 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 αξιολόγηση |
---
## AI Αξιολόγηση (προαιρετική)
Για αμφίβολα diffs που τα patterns δεν μπορούν να ταξινομήσουν, ο σαρωτής στέλνει το diff στο **Claude API** (`claude-sonnet-4-6`) και επιστρέφει ετυμηγορία: `DANGER`, `SUSPICIOUS`, `REVIEW`, ή `OK` με μία πρόταση εξήγηση. Το AI χρησιμοποιείται **μόνο** στη γκρίζα ζώνη.
```bash
export ANTHROPIC_API_KEY='sk-ant-api03-...'
sudo -E bash wp2shell-report-per-user.sh
```
API keys: <https://console.anthropic.com> — ξεχωριστό από τη συνδρομή claude.ai.
### Χωρίς API key; Χρησιμοποιήστε τον browser analyzer
Κάντε paste το output του scan στο **wp2shell Report Analyzer** artifact στο Claude.ai — εκτελεί την ίδια AI αξιολόγηση απευθείας στον browser.
---
## Σημειώσεις
- Ο σαρωτής **δεν τροποποιεί τίποτα**. Ασφαλής εκτέλεση σε live production servers.
- Η ενημέρωση του WordPress στην patched έκδοση κλείνει την ευπάθεια αλλά **δεν καθαρίζει** ένα ήδη παραβιασμένο site. Αν βρεθούν indicators, επαναφέρετε από καθαρό backup.
- Ο φάκελος `CORE_CACHE` (`/root/wp2shell-cores/`) επαναχρησιμοποιείται μεταξύ scans. Διαγράψτε τον για αναγκαστική επαναλήψη.
- Η βάση `known_shells.sha256` ανανεώνεται αυτόματα μία φορά ανά 24 ώρες.
---
## Άδεια
GPL-3.0 — δείτε [LICENSE](https://github.com/bytespulse-oe/wp2shell-hestia-scanner/blob/main/LICENSE)
---
## Credits
Αναπτύχθηκε από την **[BytesPulse](https://bytespulse.gr)** σε απόκριση της αποκάλυψης wp2shell (Ιούλιος 2026).
Πληροφορίες CVE: <https://wp2shell.com>