
Leitor de segurança WordPress somente leitura para servidores HestiaCP. Detecta indicadores de comprometimento wp2shell (CVE-2026-63030 / CVE-2026-60137) em todos os sites hospedados — relatórios por e-mail por usuário, diff de arquivos principais contra WordPress limpo, análise de PHP/JS/htaccess/imagens e avaliação opcional de IA via Claude API.
<div align="center">
# 🛡️ wp2shell-Hestia-Scanner
<p>
<a href="#english">🇬🇧 Inglês</a>
|
<a href="#greek">🇬🇷 Grego</a>
</p>




**Scanner de segurança WordPress somente leitura para servidores HestiaCP.**
Detecta indicadores de comprometimento do wp2shell em todos os sites hospedados — com relatórios por e-mail por cliente, diff de arquivos do núcleo, detecção de webshells por SHA256, pontuação de risco e avaliação por IA opcional.
> ⚠️ **Versões seguras:** WordPress **6.8.6 / 6.9.5 / 7.0.2** ou mais recente.
> Estes scripts **nunca modificam nada** — somente leitura em todo o processo.
</div>
---
<a name="english"></a>
# 🇬🇧 Inglês
## O que é o wp2shell?
O wp2shell é uma cadeia de execução remota de código (RCE) pré-autenticação no núcleo do WordPress, divulgada em **17 de julho de 2026**. Uma única requisição HTTP anônima contra uma instalação padrão é suficiente para criar um administrador malicioso e executar código arbitrário no servidor.
A cadeia combina:
- **CVE-2026-60137** — injeção de SQL no parâmetro `author__not_in` do `WP_Query`
- **CVE-2026-63030** — confusão de rota no endpoint `/wp-json/batch/v1` da API REST
Sites comprometidos exibem um administrador malicioso com prefixo de login `wp2_` e e-mail `@wp2shell.invalid`.
Mais informações: <https://wp2shell.com>
---
## Conteúdo do repositório
| Arquivo | Finalidade |
|------|---------|
| `wp2shell-scan.sh` | Scanner rápido de IoC em todo o servidor — saída colorida no terminal, pontuação de risco por site, relatório salvo automaticamente em `/root/` |
| `wp2shell-report-per-user.sh` | Scanner completo — relatórios por e-mail por usuário HestiaCP, diff de arquivos do núcleo, detecção de webshells por SHA256, avaliação por IA, pontuação de risco |
| `known_shells.sha256` | Base de dados de hashes de webshells conhecidos (SHA256) — baixada automaticamente em tempo de execução |
---
## O que o scanner verifica
### Verificações de banco de dados / usuários
| Verificação | Gravidade |
|-------|----------|
| Versão do WordPress vs. versões seguras | HIGH / OK |
| Contas com prefixo `wp2_` ou e-mail `@wp2shell.invalid` | CRITICAL |
| Administradores criados após a divulgação (15/07/2026) | MEDIUM |
| Lacunas na sequência de IDs de usuário (vestígios de administrador malicioso removido) | MEDIUM |
| Linhas órfãs em `wp_usermeta` | MEDIUM |
| Linhas envenenadas em `oembed_cache` / `customize_changeset` | CRITICAL |
| Opções do WP adulteradas (`upload_path`, `auto_prepend_file`, `siteurl`) | CRITICAL / HIGH |
### Integridade dos arquivos do núcleo
| Verificação | Gravidade |
|-------|----------|
| `wp core verify-checksums` vs. wp.org | HIGH |
| Diff `diff -U5` linha por linha contra o núcleo limpo baixado | CRITICAL / HIGH / OK |
| Arquivos extras não presentes no núcleo limpo (conteúdo + metadados exibidos) | CRITICAL / HIGH |
### Análise de arquivos
| Verificação | Gravidade |
|-------|----------|
| PHP em `uploads/` | CRITICAL |
| Extensões PHP extras (`.php7` `.phtml` `.phar` `.php5`) | HIGH |
| **Correspondência SHA256 com a base de dados de webshells conhecidos** (WSO, FilesMan, b374k, p0wny…) | CRITICAL |
| PHP modificado após `SINCE_DATE` **E** com padrões suspeitos — com a linha correspondente exibida inline | CRITICAL / HIGH |
| PHP com padrões suspeitos, mas NÃO modificado recentemente | LOW |
| JS/HTML modificados após `SINCE_DATE` E com padrões de ofuscação | MEDIUM |
| **URLs externas de C2/exfiltração** (pastebin, ngrok, Discord webhooks, bit.ly…) | CRITICAL |
| Diretivas perigosas no `.htaccess` (`AddType`, `auto_prepend_file`, `RewriteRule` externa) | HIGH |
| `.htaccess` modificado após `SINCE_DATE` | MEDIUM |
| Imagens poliglotas com payload PHP (`<?php` em `.jpg`/`.png`…) | CRITICAL |
| Arquivos de backup/config expostos (`wp-config.php.bak`, `*.sql`…) | MEDIUM |
### Persistência
| Verificação | Gravidade |
|-------|----------|
| Entradas de crontab de usuário com `curl`/`wget`/`php`/`base64` | HIGH |
| Arquivos de cron do sistema que referenciam o caminho do site | MEDIUM |
### Pontuação de risco
Cada site recebe uma **pontuação de risco de 0 a 100** com a decomposição de cada achado que contribuiu:
```
+------------------------------------------+
| RISK SCORE: 96/100 COMPROMISED |
+------------------------------------------+
+40 wp2shell fingerprint account
+30 PHP file(s) inside uploads/
+20 Vulnerable WordPress version
+6 Core checksum failure
```
| Pontuação | Classificação |
|-------|-------|
| 0–20 | Probably Clean |
| 21–40 | Low Risk |
| 41–60 | Medium Risk |
| 61–80 | High Risk |
| 81+ | **COMPROMISED** |
---
## Requisitos
- Servidor Linux com **HestiaCP**
- **bash** 4.0+
- **[WP-CLI](https://wp-cli.org/)** instalado globalmente como `wp`
- Acesso `root`
- `sendmail` (para relatórios por e-mail)
- `python3` (para manipulação de JSON da avaliação por IA)
- `curl`, `sha256sum`, `file`, `strings`, `unzip`
### Instalar o WP-CLI (se ausente)
```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
```
---
## Instalação e execução em uma única linha
### Varredura IoC rápida
```bash
curl -fsSL https://raw.githubusercontent.com/BytesPulse-OE/wp2shell-Hestia-Scanner/main/wp2shell-scan.sh | sudo bash
```
### Varredura completa com relatórios por e-mail por 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:** O scanner completo faz perguntas interativas na inicialização (avaliação por IA, salvar relatório, limite de data). Baixar primeiro e depois executar garante que os prompts funcionem corretamente.
---
## Uso
### wp2shell-scan.sh — varredura rápida em todo o servidor
```bash
sudo bash wp2shell-scan.sh
```
Encontra todas as instalações do WordPress sob `/home/*/web/*/public_html/`, executa todas as verificações, imprime saída colorida no terminal e salva um relatório completo em `/root/wp2shell-report-YYYYMMDD-HHMMSS.txt`.
Na inicialização, pergunta por um limite de data personalizado opcional (padrão: `2026-07-15`).
### wp2shell-report-per-user.sh — varredura completa com relatórios por e-mail
```bash
sudo bash wp2shell-report-per-user.sh
```
Na inicialização, três perguntas:
```
[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]:
```
**Comece sempre com `DRY_RUN=1`** (o padrão) — os e-mails são pré-visualizados na tela, nada é enviado. Altere para `DRY_RUN=0` somente depois de confirmar que a saída parece correta.
---
## Configuração
### wp2shell-scan.sh
| Variável | Padrão | Descrição |
|----------|---------|-------------|
| `WEB_ROOT` | `/home` | Raiz web do HestiaCP |
| `SINCE_DATE` | `2026-07-15` | Limite de "modificado recentemente" |
| `WP` | `wp` | Caminho para o WP-CLI |
### wp2shell-report-per-user.sh
| Variável | Padrão | Descrição |
|----------|---------|-------------|
| `DRY_RUN` | `1` | `1` = apenas pré-visualização, `0` = enviar e-mails |
| `SEND_ONLY_IF_ISSUES` | `0` | `1` = pular o e-mail se o site estiver limpo |
| `SINCE_DATE` | `2026-07-15` | Limite de "modificado recentemente" |
| `MAIL_FROM` | `security@<hostname>` | Remetente do envelope |
| `CORE_CACHE` | `/root/wp2shell-cores` | Diretório de cache do núcleo limpo |
| `ANTHROPIC_API_KEY` | *(vazio)* | Chave da API Claude para avaliação por IA |
---
## Avaliação por IA (opcional)
Para diffs ambíguos que apenas os padrões não conseguem classificar, o scanner envia o diff para a **API Claude** (`claude-sonnet-4-6`) e retorna um veredito: `DANGER`, `SUSPICIOUS`, `REVIEW` ou `OK` com uma explicação de uma frase. A IA é usada **apenas** na zona cinzenta — casos claros são classificados instantaneamente, sem nenhuma chamada de API.
Defina sua chave no script ou exporte antes de executar:
```bash
export ANTHROPIC_API_KEY='sk-ant-api03-...'
sudo -E bash wp2shell-report-per-user.sh
```
Chaves de API: <https://console.anthropic.com> — separadas das assinaturas do claude.ai.
### Sem chave de API? Use o analisador no navegador
Cole a saída da sua varredura no artefato **wp2shell Report Analyzer** no Claude.ai — ele realiza a mesma avaliação por IA diretamente no navegador, sem exigir a sua própria chave.
---
## Formato da saída
### Níveis de gravidade
| Rótulo | Cor | Significado |
|-------|-------|---------|
| `[CRITICAL]` | 🔴 Vermelho em negrito | Indicador de comprometimento ativo — aja imediatamente |
| `[HIGH]` | 🔴 Vermelho | Indicador forte — revise com urgência |
| `[MEDIUM]` | 🟡 Amarelo | Suspeito — investigue |
| `[LOW]` | 🔵 Azul | Prioridade baixa — provavelmente falso positivo |
| `[INFO]` | ⚫ Cinza | Informativo |
| `[OK]` | 🟢 Verde | Limpo / esperado |
### Exemplo de diff do núcleo
```
┌─ 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='));
└──────────────────────────────────────
```
---
## Notas
- O scanner **nunca modifica** nada. Seguro para executar em servidores de produção em atividade.
- Atualizar o WordPress para uma versão corrigida fecha a vulnerabilidade, mas **não limpa** um site já comprometido. Se indicadores forem encontrados, restaure a partir de um backup limpo.
- O diretório `CORE_CACHE` (`/root/wp2shell-cores/`) é reutilizado entre varreduras. Exclua-o para forçar um novo download.
- A base de dados de hashes `known_shells.sha256` é atualizada automaticamente uma vez por dia.
---
## Licença
GPL-3.0 — veja [LICENSE](https://github.com/bytespulse-oe/wp2shell-hestia-scanner/blob/main/LICENSE)
---
## Créditos
Desenvolvido por **[BytesPulse](https://bytespulse.gr)** em resposta à divulgação do wp2shell (julho de 2026).
Informações sobre CVE: <https://wp2shell.com>
---
---
<a name="greek"></a>
# 🇬🇷 Grego
## O que é o wp2shell?
O wp2shell é uma cadeia de execução remota de código (RCE) pré-autenticação no núcleo do WordPress, divulgada em **17 de julho de 2026**. Uma única requisição HTTP anônima contra uma instalação padrão é suficiente para criar um administrador e executar código arbitrário no servidor.
A cadeia combina:
- **CVE-2026-60137** — injeção de SQL no parâmetro `author__not_in` do `WP_Query`
- **CVE-2026-63030** — confusão de rota no endpoint `/wp-json/batch/v1` da API REST
Sites comprometidos exibem uma conta de administrador com prefixo `wp2_` e e-mail `@wp2shell.invalid`.
Mais informações: <https://wp2shell.com>
---
## Conteúdo do repositório
| Arquivo | Finalidade |
|--------|--------|
| `wp2shell-scan.sh` | Scanner rápido de IoC — saída colorida no terminal, pontuação de risco por site, relatório salvo automaticamente em `/root/` |
| `wp2shell-report-per-user.sh` | Scanner completo — relatórios por e-mail por usuário HestiaCP, diff do núcleo, detecção de webshells por SHA256, avaliação por IA, pontuação de risco |
| `known_shells.sha256` | Base de dados de hashes SHA256 de webshells conhecidos — baixada automaticamente durante a execução |
---
## O que ele verifica
### Banco de dados / Usuários
| Verificação | Gravidade |
|---------|-----------|
| Versão do WordPress vs. versões seguras | HIGH / OK |
| Contas com prefixo `wp2_` ou e-mail `@wp2shell.invalid` | CRITICAL |
| Administradores criados após a divulgação (15/07/2026) | MEDIUM |
| Lacunas na sequência de IDs de usuário (vestígios de administrador malicioso excluído) | MEDIUM |
| Linhas órfãs em `wp_usermeta` | MEDIUM |
| Linhas envenenadas em `oembed_cache` / `customize_changeset` | CRITICAL |
| Opções do WP adulteradas (`upload_path`, `auto_prepend_file`, `siteurl`) | CRITICAL / HIGH |
### Integridade dos arquivos do núcleo
| Verificação | Gravidade |
|---------|-----------|
| `wp core verify-checksums` vs. wp.org | HIGH |
| Diff `diff -U5` linha por linha contra o núcleo limpo | CRITICAL / HIGH / OK |
| Arquivos extras que não existem no núcleo limpo | CRITICAL / HIGH |
### Análise de arquivos
| Verificação | Gravidade |
|---------|-----------|
| Arquivos PHP em `uploads/` | CRITICAL |
| Extensões PHP extras (`.php7` `.phtml` `.phar` `.php5`) | HIGH |
| **Correspondência SHA256 com webshells conhecidos** (WSO, FilesMan, b374k, p0wny…) | CRITICAL |
| PHP modificado após `SINCE_DATE` **E** contendo padrão suspeito — com a linha exata | CRITICAL / HIGH |
| PHP com padrões suspeitos que NÃO foi modificado recentemente | LOW |
| JS/HTML modificados após `SINCE_DATE` com padrões de ofuscação | MEDIUM |
| **URLs externas de C2/exfiltração de dados** (pastebin, ngrok, Discord webhooks, bit.ly…) | CRITICAL |
| Diretivas perigosas no `.htaccess` | HIGH |
| `.htaccess` modificado após `SINCE_DATE` | MEDIUM |
| Imagens poliglotas com payload PHP | CRITICAL |
| Arquivos de backup/config expostos | MEDIUM |
### Persistência
| Verificação | Gravidade |
|---------|-----------|
| Crontab de usuário com `curl`/`wget`/`php`/`base64` | HIGH |
| Arquivos de cron do sistema que referenciam o caminho do site | MEDIUM |
### Pontuação de risco
Cada site recebe uma **pontuação de 0 a 100** com a decomposição de cada achado:
```
+------------------------------------------+
| RISK SCORE: 96/100 COMPROMISED |
+------------------------------------------+
+40 wp2shell fingerprint account
+30 PHP file(s) inside uploads/
+20 Vulnerable WordPress version
+6 Core checksum failure
```
| Pontuação | Classificação |
|-----------|-----------|
| 0–20 | Probably Clean |
| 21–40 | Low Risk |
| 41–60 | Medium Risk |
| 61–80 | High Risk |
| 81+ | **COMPROMISED** |
---
## Requisitos
- Servidor Linux com **HestiaCP**
- **bash** 4.0+
- **[WP-CLI](https://wp-cli.org/)** instalado como `wp`
- Acesso `root`
- `sendmail` (para envio de e-mails)
- `python3` (para avaliação por IA)
- `curl`, `sha256sum`, `file`, `strings`, `unzip`
### Instalação do WP-CLI (se ausente)
```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
```
---
## Instalação com um único comando
### Scanner IoC rápido
```bash
curl -fsSL https://raw.githubusercontent.com/BytesPulse-OE/wp2shell-Hestia-Scanner/main/wp2shell-scan.sh | sudo bash
```
### Scanner completo com relatórios por e-mail
```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
```
---
## Uso
### wp2shell-scan.sh
```bash
sudo bash wp2shell-scan.sh
```
Encontra automaticamente todas as instalações do WordPress sob `/home/*/web/*/public_html/`, executa todas as verificações, imprime saída colorida no terminal e salva um relatório completo em `/root/`.
### wp2shell-report-per-user.sh
```bash
sudo bash wp2shell-report-per-user.sh
```
Na inicialização, faz três perguntas:
```
[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]:
```
**Comece sempre com `DRY_RUN=1`** (o padrão) — os e-mails aparecem na tela, não são enviados. Altere para `DRY_RUN=0` somente depois de confirmar que a saída está correta.
---
## Configuração
### wp2shell-scan.sh
| Variável | Padrão | Descrição |
|-----------|---------|-----------|
| `WEB_ROOT` | `/home` | Diretório raiz do HestiaCP |
| `SINCE_DATE` | `2026-07-15` | Limite de "modificado recentemente" |
| `WP` | `wp` | Caminho do WP-CLI |
### wp2shell-report-per-user.sh
| Variável | Padrão | Descrição |
|-----------|---------|-----------|
| `DRY_RUN` | `1` | `1` = apenas pré-visualização, `0` = envio de e-mails |
| `SEND_ONLY_IF_ISSUES` | `0` | `1` = e-mail somente se algo for encontrado |
| `SINCE_DATE` | `2026-07-15` | Limite de "modificado recentemente" |
| `MAIL_FROM` | `security@<hostname>` | E-mail do remetente |
| `CORE_CACHE` | `/root/wp2shell-cores` | Cache de núcleos limpos |
| `ANTHROPIC_API_KEY` | *(vazio)* | Chave da API Claude para avaliação por IA |
---
## Avaliação por IA (opcional)
Para diffs ambíguos que os padrões não conseguem classificar, o scanner envia o diff para a **API Claude** (`claude-sonnet-4-6`) e retorna um veredito: `DANGER`, `SUSPICIOUS`, `REVIEW` ou `OK` com uma explicação de uma frase. A IA é usada **apenas** na zona cinzenta.
```bash
export ANTHROPIC_API_KEY='sk-ant-api03-...'
sudo -E bash wp2shell-report-per-user.sh
```
Chaves de API: <https://console.anthropic.com> — separadas da assinatura do claude.ai.
### Sem chave de API? Use o analisador no navegador
Cole a saída da varredura no artefato **wp2shell Report Analyzer** no Claude.ai — ele executa a mesma avaliação por IA diretamente no navegador.
---
## Notas
- O scanner **não modifica nada**. Execução segura em servidores de produção em atividade.
- Atualizar o WordPress para a versão corrigida fecha a vulnerabilidade, mas **não limpa** um site já comprometido. Se forem encontrados indicadores, restaure a partir de um backup limpo.
- O diretório `CORE_CACHE` (`/root/wp2shell-cores/`) é reutilizado entre varreduras. Exclua-o para forçar um novo download.
- A base de dados `known_shells.sha256` é atualizada automaticamente uma vez a cada 24 horas.
---
## Licença
GPL-3.0 — veja [LICENSE](https://github.com/bytespulse-oe/wp2shell-hestia-scanner/blob/main/LICENSE)
---
## Créditos
Desenvolvido por **[BytesPulse](https://bytespulse.gr)** em resposta à divulgação do wp2shell (julho de 2026).
Informações sobre CVE: <https://wp2shell.com>