
Scanner di sicurezza WordPress read-only per server HestiaCP. Rileva gli indicatori di compromissione wp2shell (CVE-2026-63030 / CVE-2026-60137) su tutti i siti ospitati — report via email per utente, diff dei file principali rispetto a un WordPress pulito, analisi di PHP/JS/htaccess/immagini e valutazione AI opzionale tramite Claude API.
<div align="center">
# 🛡️ wp2shell-Hestia-Scanner
<p>
<a href="#english">🇬🇧 English</a>
|
<a href="#greek">🇬🇷 Ελληνικά</a>
</p>




**Scanner di sicurezza WordPress in sola lettura per server HestiaCP.**
Rileva gli indicatori di compromissione wp2shell su tutti i siti ospitati — con report email per cliente, diff dei file del core, rilevamento webshell SHA256, punteggio di rischio e valutazione AI opzionale.
> ⚠️ **Versioni sicure:** WordPress **6.8.6 / 6.9.5 / 7.0.2** o successive.
> Questi script **non modificano mai nulla** — sola lettura in ogni momento.
</div>
---
<a name="english"></a>
# 🇬🇧 English
## Cos'è wp2shell?
wp2shell è una catena di esecuzione remota di codice (RCE) pre-autenticazione nel core di WordPress, divulgata il **17 luglio 2026**. Una singola richiesta HTTP anonima verso un'installazione predefinita è sufficiente per creare un amministratore rogue ed eseguire codice arbitrario sul server.
La catena combina:
- **CVE-2026-60137** — SQL injection nel parametro `author__not_in` di `WP_Query`
- **CVE-2026-63030** — Route confusion nell'endpoint `/wp-json/batch/v1` dell'API REST
I siti compromessi mostrano un admin rogue con prefisso di login `wp2_` ed email `@wp2shell.invalid`.
Maggiori informazioni: <https://wp2shell.com>
---
## Contenuto del repository
| File | Scopo |
|------|---------|
| `wp2shell-scan.sh` | Scanner IoC rapido a livello di server — output a terminale colorato, punteggio di rischio per sito, report salvato automaticamente in `/root/` |
| `wp2shell-report-per-user.sh` | Scanner completo — report email per utente HestiaCP, diff dei file del core, rilevamento webshell SHA256, valutazione AI, punteggio di rischio |
| `known_shells.sha256` | Database di hash di webshell note (SHA256) — scaricato automaticamente a runtime |
---
## Cosa controlla lo scanner
### Controlli su database / utenti
| Controllo | Gravità |
|-------|----------|
| Versione di WordPress rispetto alle versioni sicure | HIGH / OK |
| Account con prefisso `wp2_` o email `@wp2shell.invalid` | CRITICAL |
| Amministratori creati dopo la divulgazione (15/07/2026) | MEDIUM |
| Lacune nella sequenza degli user-ID (tracce di admin rogue eliminati) | MEDIUM |
| Righe orfane in `wp_usermeta` | MEDIUM |
| Righe avvelenate in `oembed_cache` / `customize_changeset` | CRITICAL |
| Opzioni WordPress manomesse (`upload_path`, `auto_prepend_file`, `siteurl`) | CRITICAL / HIGH |
### Integrità dei file del core
| Controllo | Gravità |
|-------|----------|
| `wp core verify-checksums` rispetto a wp.org | HIGH |
| `diff -U5` riga per riga rispetto al core pulito scaricato | CRITICAL / HIGH / OK |
| File extra non presenti nel core pulito (contenuto e metadati mostrati) | CRITICAL / HIGH |
### Analisi dei file
| Controllo | Gravità |
|-------|----------|
| PHP in `uploads/` | CRITICAL |
| Estensioni PHP aggiuntive (`.php7` `.phtml` `.phar` `.php5`) | HIGH |
| **Corrispondenza SHA256 con il database di webshell note** (WSO, FilesMan, b374k, p0wny…) | CRITICAL |
| PHP modificato dopo `SINCE_DATE` **E** corrispondente a pattern sospetti — con la riga corrispondente mostrata inline | CRITICAL / HIGH |
| PHP con pattern sospetti ma NON modificato di recente | LOW |
| JS/HTML modificati dopo `SINCE_DATE` e corrispondenti a pattern di offuscamento | MEDIUM |
| **URL C2/esfiltrazione esterni** (pastebin, ngrok, Discord webhooks, bit.ly…) | CRITICAL |
| Direttive pericolose in `.htaccess` (`AddType`, `auto_prepend_file`, `RewriteRule` esterna) | HIGH |
| `.htaccess` modificato dopo `SINCE_DATE` | MEDIUM |
| Immagini poliglotte con payload PHP (`<?php` in `.jpg`/`.png`…) | CRITICAL |
| File di backup/configurazione esposti (`wp-config.php.bak`, `*.sql`…) | MEDIUM |
### Persistenza
| Controllo | Gravità |
|-------|----------|
| Voci crontab utente con `curl`/`wget`/`php`/`base64` | HIGH |
| File cron di sistema che fanno riferimento al percorso del sito | MEDIUM |
### Punteggio di rischio
Ogni sito riceve un **punteggio di rischio da 0–100** con il dettaglio di ogni risultato che contribuisce al punteggio:
```
+------------------------------------------+
| RISK SCORE: 96/100 COMPROMISED |
+------------------------------------------+
+40 wp2shell fingerprint account
+30 PHP file(s) inside uploads/
+20 Vulnerable WordPress version
+6 Core checksum failure
```
| Punteggio | Etichetta |
|-------|-------|
| 0–20 | Probably Clean |
| 21–40 | Low Risk |
| 41–60 | Medium Risk |
| 61–80 | High Risk |
| 81+ | **COMPROMISED** |
---
## Requisiti
- Server Linux con **HestiaCP**
- **bash** 4.0+
- **[WP-CLI](https://wp-cli.org/)** installato globalmente come `wp`
- Accesso `root`
- `sendmail` (per i report email)
- `python3` (per la gestione JSON della valutazione AI)
- `curl`, `sha256sum`, `file`, `strings`, `unzip`
### Installare WP-CLI (se mancante)
```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
```
---
## Installazione ed esecuzione in un'unica riga
### Scansione IoC rapida
```bash
curl -fsSL https://raw.githubusercontent.com/BytesPulse-OE/wp2shell-Hestia-Scanner/main/wp2shell-scan.sh | sudo bash
```
### Scansione completa con report email per cliente
```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
```
> **Nota:** lo scanner completo pone domande interattive all'avvio (valutazione AI, salvataggio report, soglia data). Scaricare prima il file e poi eseguirlo garantisce che le domande funzionino correttamente.
---
## Utilizzo
### wp2shell-scan.sh — scansione rapida a livello di server
```bash
sudo bash wp2shell-scan.sh
```
Trova tutte le installazioni WordPress in `/home/*/web/*/public_html/`, esegue tutti i controlli, stampa un output colorato sul terminale e salva un report completo in `/root/wp2shell-report-YYYYMMDD-HHMMSS.txt`.
All'avvio chiede una soglia data personalizzata opzionale (predefinita: `2026-07-15`).
### wp2shell-report-per-user.sh — scansione completa con report email
```bash
sudo bash wp2shell-report-per-user.sh
```
All'avvio, tre domande:
```
[AI EVALUATION] Usare la valutazione AI per i file ambigui? [y/N]
[SAVE REPORT] Salvare un report completo per una revisione successiva? [y/N]
[DATE THRESHOLD] Usare una data diversa? Lasciare vuoto per mantenere il default [YYYY-MM-DD]:
```
**Iniziare sempre con `DRY_RUN=1`** (il default) — le email vengono visualizzate in anteprima sullo schermo, non viene inviato nulla. Passare a `DRY_RUN=0` solo dopo aver confermato che l'output sia corretto.
---
## Configurazione
### wp2shell-scan.sh
| Variabile | Default | Descrizione |
|----------|---------|-------------|
| `WEB_ROOT` | `/home` | Web root di HestiaCP |
| `SINCE_DATE` | `2026-07-15` | Soglia "modificato di recente" |
| `WP` | `wp` | Percorso di WP-CLI |
### wp2shell-report-per-user.sh
| Variabile | Default | Descrizione |
|----------|---------|-------------|
| `DRY_RUN` | `1` | `1` = solo anteprima, `0` = invia email |
| `SEND_ONLY_IF_ISSUES` | `0` | `1` = salta l'email se il sito è pulito |
| `SINCE_DATE` | `2026-07-15` | Soglia "modificato di recente" |
| `MAIL_FROM` | `security@<hostname>` | Mittente della busta (envelope sender) |
| `CORE_CACHE` | `/root/wp2shell-cores` | Directory cache dei core puliti |
| `ANTHROPIC_API_KEY` | *(vuoto)* | Chiave API Claude per la valutazione AI |
---
## Valutazione AI (opzionale)
Per i diff ambigui che i pattern da soli non riescono a classificare, lo scanner invia il diff alla **Claude API** (`claude-sonnet-4-6`) e restituisce un verdetto: `DANGER`, `SUSPICIOUS`, `REVIEW` o `OK` con una spiegazione di una frase. L'AI viene utilizzata **solo** nella zona grigia — i casi chiari vengono classificati istantaneamente senza alcuna chiamata API.
Impostare la propria chiave nello script oppure esportarla prima di eseguire:
```bash
export ANTHROPIC_API_KEY='sk-ant-api03-...'
sudo -E bash wp2shell-report-per-user.sh
```
Chiavi API: <https://console.anthropic.com> — separate dagli abbonamenti di claude.ai.
### Nessuna chiave API? Usare l'analizzatore nel browser
Incollare l'output della scansione nell'artifact **wp2shell Report Analyzer** su Claude.ai — esegue la stessa valutazione AI direttamente nel browser senza richiedere una chiave personale.
---
## Formato dell'output
### Livelli di gravità
| Etichetta | Colore | Significato |
|-------|-------|---------|
| `[CRITICAL]` | 🔴 Rosso in grassetto | Indicatore di compromissione attiva — agire immediatamente |
| `[HIGH]` | 🔴 Rosso | Indicatore forte — verificare con urgenza |
| `[MEDIUM]` | 🟡 Giallo | Sospetto — approfondire |
| `[LOW]` | 🔵 Blu | Priorità bassa — probabile falso positivo |
| `[INFO]` | ⚫ Grigio | Informativo |
| `[OK]` | 🟢 Verde | Pulito / previsto |
### Esempio di diff del core
```
┌─ 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='));
└──────────────────────────────────────
```
---
## Note
- Lo scanner **non modifica mai** nulla. Sicuro da eseguire su server di produzione live.
- L'aggiornamento di WordPress a una versione patchata chiude la vulnerabilità ma **non pulisce** un sito già compromesso. Se vengono trovati indicatori, ripristinare da un backup pulito.
- La directory `CORE_CACHE` (`/root/wp2shell-cores/`) viene riutilizzata tra le scansioni. Eliminarla per forzare un nuovo download.
- Il database di hash `known_shells.sha256` viene aggiornato automaticamente una volta al giorno.
---
## Licenza
GPL-3.0 — consultare [LICENSE](https://github.com/bytespulse-oe/wp2shell-hestia-scanner/blob/main/LICENSE)
---
## Crediti
Sviluppato da **[BytesPulse](https://bytespulse.gr)** in risposta alla divulgazione di wp2shell (luglio 2026).
Informazioni CVE: <https://wp2shell.com>
---
---
<a name="greek"></a>
# 🇬🇷 Ελληνικά
## Cos'è wp2shell?
wp2shell è una catena di esecuzione remota di codice (RCE) pre-autenticazione nel core di WordPress, divulgata il **17 luglio 2026**. Una singola richiesta HTTP anonima verso un'installazione predefinita è sufficiente per creare un amministratore ed eseguire codice arbitrario sul server.
La catena combina:
- **CVE-2026-60137** — SQL injection nel parametro `author__not_in` di `WP_Query`
- **CVE-2026-63030** — Route confusion nell'API REST `/wp-json/batch/v1`
I siti compromessi mostrano un account amministratore con prefisso `wp2_` ed email `@wp2shell.invalid`.
Maggiori informazioni: <https://wp2shell.com>
---
## Contenuti
| File | Scopo |
|--------|--------|
| `wp2shell-scan.sh` | Scanner IoC rapido — output colorato nel terminale, punteggio di rischio per sito, salvataggio automatico del report in `/root/` |
| `wp2shell-report-per-user.sh` | Scanner completo — report email per utente HestiaCP, diff del core, rilevamento webshell SHA256, valutazione AI, punteggio di rischio |
| `known_shells.sha256` | Database SHA256 di webshell note — scaricato automaticamente durante l'esecuzione |
---
## Cosa controlla
### Controlli su database / utenti
| Controllo | Gravità |
|---------|-----------|
| Versione di WordPress rispetto alle versioni sicure | HIGH / OK |
| Account con prefisso `wp2_` o email `@wp2shell.invalid` | CRITICAL |
| Amministratori creati dopo la divulgazione (15/07/2026) | MEDIUM |
| Lacune nella sequenza user-ID (tracce di rogue admin eliminato) | MEDIUM |
| Righe orfane in `wp_usermeta` | MEDIUM |
| Righe avvelenate in `oembed_cache` / `customize_changeset` | CRITICAL |
| Opzioni WP manomesse (`upload_path`, `auto_prepend_file`, `siteurl`) | CRITICAL / HIGH |
### Integrità dei file del core
| Controllo | Gravità |
|---------|-----------|
| `wp core verify-checksums` rispetto a wp.org | HIGH |
| `diff -U5` riga per riga rispetto al core pulito | CRITICAL / HIGH / OK |
| File extra non presenti nel core pulito | CRITICAL / HIGH |
### Analisi dei file
| Controllo | Gravità |
|---------|-----------|
| File PHP in `uploads/` | CRITICAL |
| Estensioni PHP aggiuntive (`.php7` `.phtml` `.phar` `.php5`) | HIGH |
| **Corrispondenza SHA256 con webshell note** (WSO, FilesMan, b374k, p0wny…) | CRITICAL |
| PHP modificato dopo `SINCE_DATE` **E** con pattern sospetti — con la riga esatta mostrata | CRITICAL / HIGH |
| PHP con pattern sospetti ma NON modificato di recente | LOW |
| JS/HTML modificati dopo `SINCE_DATE` con pattern di offuscamento | MEDIUM |
| **URL C2/esfiltrazione esterni** (pastebin, ngrok, Discord webhooks, bit.ly…) | CRITICAL |
| Direttive pericolose in `.htaccess` | HIGH |
| `.htaccess` modificato dopo `SINCE_DATE` | MEDIUM |
| Immagini poliglotte con payload PHP | CRITICAL |
| File di backup/configurazione esposti | MEDIUM |
### Persistenza
| Controllo | Gravità |
|---------|-----------|
| Crontab utente con `curl`/`wget`/`php`/`base64` | HIGH |
| File cron di sistema che fanno riferimento al path del sito | MEDIUM |
### Punteggio di rischio
Ogni sito riceve un **punteggio da 0–100** con il dettaglio di ogni risultato:
```
+------------------------------------------+
| RISK SCORE: 96/100 COMPROMISED |
+------------------------------------------+
+40 wp2shell fingerprint account
+30 PHP file(s) inside uploads/
+20 Vulnerable WordPress version
+6 Core checksum failure
```
| Punteggio | Categoria |
|-----------|-----------|
| 0–20 | Probably Clean |
| 21–40 | Low Risk |
| 41–60 | Medium Risk |
| 61–80 | High Risk |
| 81+ | **COMPROMISED** |
---
## Requisiti
- Server Linux con **HestiaCP**
- **bash** 4.0+
- **[WP-CLI](https://wp-cli.org/)** installato come `wp`
- Accesso `root`
- `sendmail` (per l'invio di email)
- `python3` (per la valutazione AI)
- `curl`, `sha256sum`, `file`, `strings`, `unzip`
### Installazione di WP-CLI (se mancante)
```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
```
---
## Installazione con una sola riga
### Scanner IoC rapido
```bash
curl -fsSL https://raw.githubusercontent.com/BytesPulse-OE/wp2shell-Hestia-Scanner/main/wp2shell-scan.sh | sudo bash
```
### Scanner completo con report 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
```
---
## Utilizzo
### wp2shell-scan.sh
```bash
sudo bash wp2shell-scan.sh
```
Trova automaticamente tutte le installazioni WordPress in `/home/*/web/*/public_html/`, esegue tutti i controlli, stampa un output colorato nel terminale e salva un report completo in `/root/`.
### wp2shell-report-per-user.sh
```bash
sudo bash wp2shell-report-per-user.sh
```
All'avvio pone tre domande:
```
[AI EVALUATION] Usare la valutazione AI per i file ambigui? [y/N]
[SAVE REPORT] Salvare un report completo in un file? [y/N]
[DATE THRESHOLD] Data diversa? Lasciare vuoto per il default [YYYY-MM-DD]:
```
**Iniziare sempre con `DRY_RUN=1`** (default) — le email vengono visualizzate sullo schermo, non vengono inviate. Passare a `DRY_RUN=0` solo dopo aver confermato che l'output sia corretto.
---
## Impostazioni
### wp2shell-scan.sh
| Variabile | Default | Descrizione |
|-----------|---------|-----------|
| `WEB_ROOT` | `/home` | Directory root di HestiaCP |
| `SINCE_DATE` | `2026-07-15` | Soglia "modificati di recente" |
| `WP` | `wp` | Percorso di WP-CLI |
### wp2shell-report-per-user.sh
| Variabile | Default | Descrizione |
|-----------|---------|-----------|
| `DRY_RUN` | `1` | `1` = solo anteprima, `0` = invio email |
| `SEND_ONLY_IF_ISSUES` | `0` | `1` = email solo se viene trovato qualcosa |
| `SINCE_DATE` | `2026-07-15` | Soglia "modificati di recente" |
| `MAIL_FROM` | `security@<hostname>` | Mittente email |
| `CORE_CACHE` | `/root/wp2shell-cores` | Cache dei core puliti |
| `ANTHROPIC_API_KEY` | *(vuoto)* | Chiave API Claude per la valutazione AI |
---
## Valutazione AI (opzionale)
Per i diff ambigui che i pattern non riescono a classificare, lo scanner invia il diff alla **Claude API** (`claude-sonnet-4-6`) e restituisce un verdetto: `DANGER`, `SUSPICIOUS`, `REVIEW` o `OK` con una spiegazione di una frase. L'AI viene utilizzata **solo** nella zona grigia.
### Nessuna chiave API? Usare l'analizzatore nel browser
Incollare l'output della scansione nell'artifact **wp2shell Report Analyzer** su Claude.ai — esegue la stessa valutazione AI direttamente nel browser.
---
## Note
- Lo scanner **non modifica nulla**. Esecuzione sicura su server di produzione live.
- L'aggiornamento di WordPress alla versione patchata chiude la vulnerabilità ma **non pulisce** un sito già compromesso. Se vengono trovati indicatori, ripristinare da un backup pulito.
- La cartella `CORE_CACHE` (`/root/wp2shell-cores/`) viene riutilizzata tra le scansioni. Eliminarla per forzare un nuovo download.
- Il database `known_shells.sha256` viene aggiornato automaticamente una volta ogni 24 ore.
---
## Licenza
GPL-3.0 — consultare [LICENSE](https://github.com/bytespulse-oe/wp2shell-hestia-scanner/blob/main/LICENSE)
---
## Crediti
Sviluppato da **[BytesPulse](https://bytespulse.gr)** in risposta alla divulgazione di wp2shell (luglio 2026).
Informazioni CVE: <https://wp2shell.com>