
# HestiaCP 서버용 읽기 전용 WordPress 보안 스캐너 호스팅된 모든 사이트에서 wp2shell 침해 지표(CVE-2026-63030 / CVE-2026-60137)를 탐지합니다 — 사용자별 이메일 보고서, 정상 WordPress와의 핵심 파일 비교, PHP/JS/htaccess/이미지 분석, Claude API를 통한 선택적 AI 평가 기능을 제공합니다.
<div align="center">
# 🛡️ wp2shell-Hestia-Scanner
<p>
<a href="#english">🇬🇧 English</a>
|
<a href="#greek">🇬🇷 Ελληνικά</a>
</p>




**HestiaCP 서버용 읽기 전용 WordPress 보안 스캐너.**
호스팅된 모든 사이트에서 wp2shell 침해 지표를 탐지합니다 — 클라이언트별 이메일 보고서, 코어 파일 diff, SHA256 웹셸 탐지, 위험 점수, 선택적 AI 평가 포함.
> ⚠️ **안전한 버전:** WordPress **6.8.6 / 6.9.5 / 7.0.2** 이상.
> 이 스크립트는 **아무것도 수정하지 않습니다** — 전체 과정이 읽기 전용입니다.
</div>
---
<a name="english"></a>
# 🇬🇧 English
## wp2shell이란 무엇인가요?
wp2shell은 **2026년 7월 17일**에 공개된 WordPress 코어의 사전 인증 원격 코드 실행(RCE) 체인입니다. 기본 설치에 대한 단일 익명 HTTP 요청만으로도 악성 관리자 계정을 생성하고 서버에서 임의 코드를 실행할 수 있습니다.
이 체인은 다음을 결합합니다:
- **CVE-2026-60137** — `WP_Query`의 `author__not_in` 매개변수의 SQL 인젝션
- **CVE-2026-63030** — REST API `/wp-json/batch/v1` 엔드포인트의 라우트 혼동
침해된 사이트에는 로그인 접두사 `wp2_`와 이메일 `@wp2shell.invalid`을 가진 악성 관리자가 나타납니다.
자세한 정보: <https://wp2shell.com>
---
## 저장소 내용
| 파일 | 용도 |
|------|---------|
| `wp2shell-scan.sh` | 빠른 서버 전체 IoC 스캐너 — 색상 구분 터미널 출력, 사이트별 위험 점수, `/root/`에 자동 저장되는 보고서 |
| `wp2shell-report-per-user.sh` | 전체 스캐너 — HestiaCP 사용자별 이메일 보고서, 코어 파일 diff, SHA256 웹셸 탐지, AI 평가, 위험 점수 |
| `known_shells.sha256` | 알려진 웹셸 해시 데이터베이스(SHA256) — 실행 시 자동으로 가져옴 |
---
## 스캐너가 확인하는 항목
### 데이터베이스 / 사용자 확인
| 확인 항목 | 심각도 |
|-------|----------|
| WordPress 버전 vs. 안전한 버전 | HIGH / OK |
| `wp2_` 접두사 또는 `@wp2shell.invalid` 이메일을 가진 계정 | CRITICAL |
| 공개(15/07/2026) 이후 생성된 관리자 | MEDIUM |
| 사용자 ID 시퀀스의 공백(삭제된 악성 관리자 흔적) | MEDIUM |
| 고아가 된 `wp_usermeta` 행 | MEDIUM |
| 오염된 `oembed_cache` / `customize_changeset` 행 | CRITICAL |
| 변조된 WP 옵션(`upload_path`, `auto_prepend_file`, `siteurl`) | CRITICAL / HIGH |
### 코어 파일 무결성
| 확인 항목 | 심각도 |
|-------|----------|
| wp.org 대비 `wp core verify-checksums` | HIGH |
| 깨끗한 다운로드 코어 대비 줄 단위 `diff -U5` | CRITICAL / HIGH / OK |
| 깨끗한 코어에 없는 추가 파일(콘텐츠 및 메타데이터 표시) | CRITICAL / HIGH |
### 파일 분석
| 확인 항목 | 심각도 |
|-------|----------|
| `uploads/` 내 PHP 파일 | CRITICAL |
| 추가 PHP 확장자(`.php7` `.phtml` `.phar` `.php5`) | HIGH |
| **알려진 웹셸 데이터베이스와 SHA256 일치**(WSO, FilesMan, b374k, p0wny…) | CRITICAL |
| `SINCE_DATE` 이후 수정된 PHP **그리고** 의심스러운 패턴 일치 — 일치하는 줄 인라인 표시 | CRITICAL / HIGH |
| 의심스러운 패턴이 있지만 최근에 수정되지 않은 PHP | LOW |
| `SINCE_DATE` 이후 수정되고 난독화 패턴과 일치하는 JS/HTML | MEDIUM |
| **외부 C2/데이터 유출 URL**(pastebin, ngrok, Discord webhooks, bit.ly…) | CRITICAL |
| 위험한 `.htaccess` 지시문(`AddType`, `auto_prepend_file`, 외부 `RewriteRule`) | HIGH |
| `SINCE_DATE` 이후 수정된 `.htaccess` | MEDIUM |
| PHP 페이로드가 포함된 폴리글롯 이미지(`.jpg`/`.png` 내 `<?php`…) | CRITICAL |
| 노출된 백업/설정 파일(`wp-config.php.bak`, `*.sql`…) | MEDIUM |
### 지속성(Persistence)
| 확인 항목 | 심각도 |
|-------|----------|
| `curl`/`wget`/`php`/`base64`가 포함된 사용자 crontab 항목 | 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** |
---
## 요구 사항
- **HestiaCP**가 실행 중인 Linux 서버
- **bash** 4.0+
- **[WP-CLI](https://wp-cli.org/)**가 `wp`로 전역 설치
- `root` 액세스
- `sendmail`(이메일 보고서용)
- `python3`(AI 평가 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
```
> **참고:** 전체 스캐너는 시작 시 대화형 질문(AI 평가, 보고서 저장, 날짜 기준)을 합니다. 먼저 다운로드한 후 실행하면 프롬프트가 올바르게 작동합니다.
---
## 사용법
### wp2shell-scan.sh — 빠른 서버 전체 스캔
```bash
sudo bash wp2shell-scan.sh
```
`/home/*/web/*/public_html/` 아래의 모든 WordPress 설치를 찾아 모든 검사를 실행하고, 색상 구분 출력을 터미널에 표시하며, 전체 보고서를 `/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>` | 봉투 발신자 |
| `CORE_CACHE` | `/root/wp2shell-cores` | 깨끗한 코어 캐시 디렉터리 |
| `ANTHROPIC_API_KEY` | *(비어 있음)* | AI 평가용 Claude API 키 |
---
## AI 평가(선택 사항)
패턴만으로 분류할 수 없는 모호한 diff의 경우, 스캐너는 diff를 **Claude API**(`claude-sonnet-4-6`)로 보내고 `DANGER`, `SUSPICIOUS`, `REVIEW` 또는 `OK` 판정을 한 문장 설명과 함께 반환합니다. AI는 **회색 지대에서만** 사용됩니다 — 명확한 경우는 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 키가 없으신가요? 브라우저 분석기를 사용하세요
스캔 출력을 Claude.ai의 **wp2shell Report Analyzer** 아티팩트에 붙여넣으세요 — 자체 키 없이 브라우저에서 동일한 AI 평가를 수행합니다.
---
## 출력 형식
### 심각도 수준
| 라벨 | 색상 | 의미 |
|-------|-------|---------|
| `[CRITICAL]` | 🔴 굵은 빨간색 | 활성 침해 지표 — 즉시 조치 |
| `[HIGH]` | 🔴 빨간색 | 강력한 지표 — 긴급 검토 |
| `[MEDIUM]` | 🟡 노란색 | 의심스러움 — 조사 필요 |
| `[LOW]` | 🔵 파란색 | 낮은 우선순위 — 오탐 가능성 높음 |
| `[INFO]` | ⚫ 회색 | 정보 제공용 |
| `[OK]` | 🟢 녹색 | 깨끗함 / 정상 |
### 코어 diff 예시
```
┌─ 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='));
└──────────────────────────────────────
```
---
## 참고 사항
- 스캐너는 **아무것도 수정하지 않습니다**. 운영 중인 프로덕션 서버에서 안전하게 실행할 수 있습니다.
- WordPress를 패치된 버전으로 업데이트하면 취약점은 해결되지만 이미 침해된 사이트는 **정리되지 않습니다**. 지표가 발견되면 깨끗한 백업에서 복원하세요.
- `CORE_CACHE` 디렉터리(`/root/wp2shell-cores/`)는 스캔 간에 재사용됩니다. 새로 다운로드하려면 삭제하세요.
- `known_shells.sha256` 해시 데이터베이스는 하루에 한 번 자동으로 새로 고쳐집니다.
---
## 라이선스
GPL-3.0 — [LICENSE](https://github.com/bytespulse-oe/wp2shell-hestia-scanner/blob/main/LICENSE) 참조
---
## 크레딧
wp2shell 공개(2026년 7월)에 대응하여 **[BytesPulse](https://bytespulse.gr)**가 개발했습니다.
CVE 정보: <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>