
Сканер безопасности WordPress в режиме только для чтения для серверов HestiaCP. Обнаруживает индикаторы компрометации wp2shell (CVE-2026-63030 / CVE-2026-60137) на всех размещённых сайтах — почтовые отчёты для каждого пользователя, diff основных файлов с чистой WordPress, анализ PHP/JS/htaccess/изображений и опциональная оценка ИИ через Claude API.
<div align="center">
# 🛡️ wp2shell-Hestia-Scanner
<p>
<a href="#english">🇬🇧 English</a>
|
<a href="#greek">🇬🇷 Ελληνικά</a>
</p>




**Сканер безопасности WordPress в режиме «только чтение» для серверов HestiaCP.**
Обнаруживает индикаторы компрометации wp2shell на всех размещённых сайтах — с почтовыми отчётами по каждому клиенту, сравнением файлов ядра, обнаружением веб-шеллов по SHA256, оценкой риска и необязательной ИИ-оценкой.
> ⚠️ **Безопасные версии:** WordPress **6.8.6 / 6.9.5 / 7.0.2** или новее.
> Эти скрипты **никогда ничего не изменяют** — режим «только чтение» на всём протяжении работы.
</div>
---
<a name="english"></a>
# 🇬🇧 English
## Что такое wp2shell?
wp2shell — это цепочка удалённого выполнения кода (RCE) до аутентификации в ядре WordPress, раскрытая **17 июля 2026 года**. Одного анонимного HTTP-запроса к стандартной установке достаточно, чтобы создать поддельного администратора и выполнить произвольный код на сервере.
Цепочка объединяет:
- **CVE-2026-60137** — SQL-инъекция в параметре `author__not_in` класса `WP_Query`
- **CVE-2026-63030** — путаница маршрутов (route confusion) в REST API, конечная точка `/wp-json/batch/v1`
На скомпрометированных сайтах появляется поддельный администратор с префиксом логина `wp2_` и адресом `@wp2shell.invalid`.
Подробнее: <https://wp2shell.com>
---
## Содержимое репозитория
| Файл | Назначение |
|------|---------|
| `wp2shell-scan.sh` | Быстрый сканер IoC по всему серверу — цветной вывод в терминал, оценка риска для каждого сайта, автоматическое сохранение отчёта в `/root/` |
| `wp2shell-report-per-user.sh` | Полный сканер — почтовые отчёты по каждому пользователю HestiaCP, сравнение файлов ядра, обнаружение веб-шеллов по SHA256, ИИ-оценка, оценка риска |
| `known_shells.sha256` | База хешей известных веб-шеллов (SHA256) — загружается автоматически при запуске |
---
## Что проверяет сканер
### Проверки базы данных и пользователей
| Проверка | Критичность |
|-------|----------|
| Версия WordPress по сравнению с безопасными версиями | HIGH / OK |
| Учётные записи с префиксом `wp2_` или email `@wp2shell.invalid` | CRITICAL |
| Администраторы, созданные после раскрытия (15/07/2026) | MEDIUM |
| Пропуски в последовательности user-ID (следы удалённого поддельного администратора) | MEDIUM |
| Осиротевшие строки `wp_usermeta` | MEDIUM |
| Отравленные строки `oembed_cache` / `customize_changeset` | CRITICAL |
| Подменённые параметры WP (`upload_path`, `auto_prepend_file`, `siteurl`) | CRITICAL / HIGH |
### Целостность файлов ядра
| Проверка | Критичность |
|-------|----------|
| `wp core verify-checksums` по сравнению с wp.org | HIGH |
| Построчное `diff -U5` со скачанным чистым ядром | CRITICAL / HIGH / OK |
| Лишние файлы, отсутствующие в чистом ядре (показываются содержимое и метаданные) | CRITICAL / HIGH |
### Анализ файлов
| Проверка | Критичность |
|-------|----------|
| PHP-файлы в `uploads/` | CRITICAL |
| Дополнительные PHP-расширения (`.php7` `.phtml` `.phar` `.php5`) | HIGH |
| **Совпадение SHA256 с базой известных веб-шеллов** (WSO, FilesMan, b374k, p0wny…) | CRITICAL |
| PHP-файлы, изменённые после `SINCE_DATE`, **И** совпадающие с подозрительными паттернами — с отображением совпавшей строки прямо в выводе | CRITICAL / HIGH |
| PHP-файлы с подозрительными паттернами, но НЕ изменённые недавно | LOW |
| JS/HTML, изменённые после `SINCE_DATE` И совпадающие с паттернами обфускации | MEDIUM |
| **Внешние C2/URL эксфильтрации данных** (pastebin, ngrok, Discord webhooks, bit.ly…) | CRITICAL |
| Опасные директивы `.htaccess` (`AddType`, `auto_prepend_file`, внешний `RewriteRule`) | HIGH |
| `.htaccess`, изменённый после `SINCE_DATE` | MEDIUM |
| Полиглот-изображения с PHP-нагрузкой (`<?php` в `.jpg`/`.png`…) | CRITICAL |
| Открытые backup/config файлы (`wp-config.php.bak`, `*.sql`…) | MEDIUM |
### Закрепление (persistence)
| Проверка | Критичность |
|-------|----------|
| Записи в пользовательском crontab с `curl`/`wget`/`php`/`base64` | HIGH |
| Системные cron-файлы, ссылающиеся на путь к сайту | MEDIUM |
### Оценка риска
Каждый сайт получает **оценку риска от 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-сервер под управлением **HestiaCP**
- **bash** 4.0+
- **[WP-CLI](https://wp-cli.org/)**, установленный глобально как `wp`
- доступ `root`
- `sendmail` (для почтовых отчётов)
- `python3` (для обработки JSON при ИИ-оценке)
- `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
```
### Полное сканирование с почтовыми отчётами по каждому клиенту
```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 в `/home/*/web/*/public_html/`, выполняет все проверки, выводит цветной результат в терминал и сохраняет полный отчёт в `/root/wp2shell-report-YYYYMMDD-HHMMSS.txt`.
При запуске можно указать собственную пороговую дату (по умолчанию: `2026-07-15`).
### wp2shell-report-per-user.sh — полное сканирование с почтовыми отчётами
```bash
sudo bash wp2shell-report-per-user.sh
```
При запуске задаются три вопроса:
```
[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]:
```
**Всегда начинайте с `DRY_RUN=1`** (значение по умолчанию) — письма показываются на экране в режиме предпросмотра, ничего не отправляется. Переключайтесь на `DRY_RUN=0` только после того, как убедитесь, что вывод выглядит корректно.
---
## Конфигурация
### wp2shell-scan.sh
| Переменная | По умолчанию | Описание |
|----------|---------|-------------|
| `WEB_ROOT` | `/home` | Корневой каталог веб-сайтов HestiaCP |
| `SINCE_DATE` | `2026-07-15` | Порог «недавно изменённых» |
| `WP` | `wp` | Путь к WP-CLI |
### wp2shell-report-per-user.sh
| Переменная | По умолчанию | Описание |
|-----------|---------|-----------|
| `DRY_RUN` | `1` | `1` = только предпросмотр, `0` = отправлять письма |
| `SEND_ONLY_IF_ISSUES` | `0` | `1` = не отправлять письмо, если сайт чист |
| `SINCE_DATE` | `2026-07-15` | Порог «недавно изменённых» |
| `MAIL_FROM` | `security@<hostname>` | Отправитель (envelope sender) |
| `CORE_CACHE` | `/root/wp2shell-cores` | Каталог кэша чистых версий ядра |
| `ANTHROPIC_API_KEY` | *(пусто)* | Ключ Claude API для ИИ-оценки |
---
## ИИ-оценка (необязательно)
Для неоднозначных диффов, которые одними паттернами не классифицировать, сканер отправляет diff в **Claude API** (`claude-sonnet-4-6`) и возвращает вердикт: `DANGER`, `SUSPICIOUS`, `REVIEW` или `OK` с пояснением в одно предложение. ИИ используется **только** в серой зоне — однозначные случаи классифицируются мгновенно, без обращения к API.
Укажите свой ключ в скрипте или экспортируйте его перед запуском:
```bash
export ANTHROPIC_API_KEY='sk-ant-api03-...'
sudo -E bash wp2shell-report-per-user.sh
```
Ключи API: <https://console.anthropic.com> — они не входят в подписку claude.ai.
### Нет ключа API? Воспользуйтесь анализатором в браузере
Вставьте вывод сканера в артефакт **wp2shell Report Analyzer** на Claude.ai — он выполнит ту же ИИ-оценку прямо в браузере, без необходимости в собственном ключе.
---
## Формат вывода
### Уровни критичности
| Метка | Цвет | Значение |
|-------|-------|---------|
| `[CRITICAL]` | 🔴 Жирный красный | Активный индикатор компрометации — действуйте немедленно |
| `[HIGH]` | 🔴 Красный | Сильный индикатор — срочно проверьте |
| `[MEDIUM]` | 🟡 Жёлтый | Подозрительно — провести расследование |
| `[LOW]` | 🔵 Синий | Низкий приоритет — вероятно, ложное срабатывание |
| `[INFO]` | ⚫ Серый | Информационное сообщение |
| `[OK]` | 🟢 Зелёный | Чисто / ожидаемое состояние |
### Пример диффа ядра
```
┌─ 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='));
└──────────────────────────────────────
```
---
## Примечания
- Сканер **никогда ничего не изменяет**. Безопасно запускать на работающих production-серверах.
- Обновление WordPress до исправленной версии закрывает уязвимость, но **не очищает** уже скомпрометированный сайт. Если обнаружены индикаторы, восстановите сайт из чистой резервной копии.
- Каталог `CORE_CACHE` (`/root/wp2shell-cores/`) переиспользуется между сканированиями. Удалите его, чтобы принудительно выполнить повторную загрузку.
- База хешей `known_shells.sha256` автоматически обновляется раз в сутки.
---
## Лицензия
GPL-3.0 — см. [LICENSE](https://github.com/bytespulse-oe/wp2shell-hestia-scanner/blob/main/LICENSE)
---
## Авторы
Разработано **[BytesPulse](https://bytespulse.gr)** в ответ на публикацию информации об уязвимости wp2shell (июль 2026).
Информация о CVE: <https://wp2shell.com>
---
---
<a name="greek"></a>
# 🇬🇷 Ελληνικά
## Что такое wp2shell?
wp2shell — это цепочка удалённого выполнения кода (RCE) в ядре WordPress, раскрытая **17 июля 2026 года**. Одного анонимного HTTP-запроса к стандартной установке достаточно, чтобы создать администратора и выполнить произвольный код на сервере.
Цепочка объединяет:
- **CVE-2026-60137** — SQL-инъекция в параметре `author__not_in` класса `WP_Query`
- **CVE-2026-63030** — путаница маршрутов (route confusion) в REST API `/wp-json/batch/v1`
На скомпрометированных сайтах появляется учётная запись администратора с префиксом `wp2_` и email `@wp2shell.invalid`.
Подробнее: <https://wp2shell.com>
---
## Содержимое
| Файл | Назначение |
|--------|--------|
| `wp2shell-scan.sh` | Быстрый сканер IoC — цветной вывод в терминал, оценка риска для каждого сайта, автоматическое сохранение отчёта в `/root/` |
| `wp2shell-report-per-user.sh` | Полный сканер — почтовые отчёты по каждому пользователю HestiaCP, сравнение файлов ядра, обнаружение веб-шеллов по SHA256, ИИ-оценка, оценка риска |
| `known_shells.sha256` | База SHA256-хешей известных веб-шеллов — загружается автоматически при запуске |
---
## Что проверяет
### База данных / пользователи
| Проверка | Критичность |
|---------|-----------|
| Версия WordPress по сравнению с безопасными версиями | HIGH / OK |
| Учётные записи с префиксом `wp2_` или email `@wp2shell.invalid` | CRITICAL |
| Администраторы, созданные после раскрытия (15/07/2026) | MEDIUM |
| Пропуски в последовательности user-ID (следы удалённого поддельного администратора) | MEDIUM |
| Осиротевшие строки `wp_usermeta` | MEDIUM |
| Отравленные строки `oembed_cache` / `customize_changeset` | CRITICAL |
| Подменённые параметры WP (`upload_path`, `auto_prepend_file`, `siteurl`) | CRITICAL / HIGH |
### Целостность файлов ядра
| Проверка | Критичность |
|---------|-----------|
| `wp core verify-checksums` по сравнению с wp.org | HIGH |
| Построчное `diff -U5` с чистым ядром | CRITICAL / HIGH / OK |
| Лишние файлы, отсутствующие в чистом ядре | CRITICAL / HIGH |
### Анализ файлов
| Проверка | Критичность |
|---------|-----------|
| PHP-файлы в `uploads/` | CRITICAL |
| Дополнительные PHP-расширения (`.php7` `.phtml` `.phar` `.php5`) | HIGH |
| **Совпадение SHA256 с известными веб-шеллами** (WSO, FilesMan, b374k, p0wny…) | CRITICAL |
| PHP, изменённый после `SINCE_DATE` **И** содержащий подозрительный паттерн — с показом точной строки | CRITICAL / HIGH |
| PHP с подозрительными паттернами, но НЕ изменённый недавно | LOW |
| JS/HTML, изменённые после `SINCE_DATE`, с паттернами обфускации | MEDIUM |
| **Внешние C2/URL эксфильтрации данных** (pastebin, ngrok, Discord webhooks, bit.ly…) | CRITICAL |
| Опасные директивы в `.htaccess` | HIGH |
| `.htaccess`, изменённый после `SINCE_DATE` | MEDIUM |
| Полиглот-изображения с PHP-нагрузкой | CRITICAL |
| Открытые backup/config файлы | MEDIUM |
### Закрепление (persistence)
| Проверка | Критичность |
|---------|-----------|
| Crontab пользователя с `curl`/`wget`/`php`/`base64` | HIGH |
| Системные cron-файлы, ссылающиеся на путь к сайту | MEDIUM |
### Оценка риска
Каждый сайт получает **оценку от 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-сервер с **HestiaCP**
- **bash** 4.0+
- **[WP-CLI](https://wp-cli.org/)**, установленный как `wp`
- Доступ `root`
- `sendmail` (для отправки email)
- `python3` (для ИИ-оценки)
- `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 в `/home/*/web/*/public_html/`, выполняет все проверки, выводит цветной результат в терминал и сохраняет полный отчёт в `/root/`.
### wp2shell-report-per-user.sh
```bash
sudo bash wp2shell-report-per-user.sh
```
При запуске задаёт три вопроса:
```
[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]:
```
**Всегда начинайте с `DRY_RUN=1`** (по умолчанию) — письма отображаются на экране и не отправляются. Переключайтесь на `DRY_RUN=0` только после того, как убедитесь, что вывод корректен.
---
## Настройки
### wp2shell-scan.sh
| Переменная | По умолчанию | Описание |
|-----------|---------|-----------|
| `WEB_ROOT` | `/home` | Корневой каталог HestiaCP |
| `SINCE_DATE` | `2026-07-15` | Порог «недавно изменённых» |
| `WP` | `wp` | Путь к WP-CLI |
### wp2shell-report-per-user.sh
| Переменная | По умолчанию | Описание |
|-----------|---------|-----------|
| `DRY_RUN` | `1` | `1` = только предпросмотр, `0` = отправка писем |
| `SEND_ONLY_IF_ISSUES` | `0` | `1` = отправлять email, только если что-то найдено |
| `SINCE_DATE` | `2026-07-15` | Порог «недавно изменённых» |
| `MAIL_FROM` | `security@<hostname>` | Email отправителя |
| `CORE_CACHE` | `/root/wp2shell-cores` | Кэш чистых версий ядра |
| `ANTHROPIC_API_KEY` | *(пусто)* | Ключ Claude API для ИИ-оценки |
---
## ИИ-оценка (необязательно)
Для неоднозначных диффов, которые невозможно классифицировать одними паттернами, сканер отправляет diff в **Claude API** (`claude-sonnet-4-6`) и возвращает вердикт: `DANGER`, `SUSPICIOUS`, `REVIEW` или `OK` с пояснением в одно предложение. ИИ используется **только** в серой зоне.
```bash
export ANTHROPIC_API_KEY='sk-ant-api03-...'
sudo -E bash wp2shell-report-per-user.sh
```
Ключи API: <https://console.anthropic.com> — отдельно от подписки claude.ai.
### Нет ключа API? Используйте анализатор в браузере
Вставьте вывод сканера в артефакт **wp2shell Report Analyzer** на Claude.ai — он выполнит ту же ИИ-оценку прямо в браузере.
---
## Примечания
- Сканер **ничего не изменяет**. Безопасен для запуска на работающих production-серверах.
- Обновление WordPress до исправленной версии закрывает уязвимость, но **не очищает** уже скомпрометированный сайт. Если обнаружены индикаторы, восстановите сайт из чистой резервной копии.
- Каталог `CORE_CACHE` (`/root/wp2shell-cores/`) переиспользуется между сканированиями. Удалите его, чтобы принудительно выполнить повторную загрузку.
- База `known_shells.sha256` автоматически обновляется раз в 24 часа.
---
## Лицензия
GPL-3.0 — см. [LICENSE](https://github.com/bytespulse-oe/wp2shell-hestia-scanner/blob/main/LICENSE)
---
## Авторы
Разработано **[BytesPulse](https://bytespulse.gr)** в ответ на публикацию информации об уязвимости wp2shell (июль 2026).
Информация о CVE: <https://wp2shell.com>