
wp2shell (CVE-2026-63030) WordPress 침해 탐지 및 정리 — 대량 실행 가능, 기본적으로 읽기 전용
하나 또는 여러 WordPress 사이트에서 wp2shell (CVE‑2026‑63030) 침해를 탐지하고 정리합니다.
wp2shell은 WordPress 7.0.2 / 6.9.5 / 6.8.6 (2026‑07‑17)에서 수정된 인증 전 원격 코드 실행 취약점입니다. 하루 만에 공개 PoC가 등장했고 약 48시간 이내에 대규모 악용이 이어졌습니다. 패치는 구멍을 막아주지만, 패치 이전에 악용된 사이트는 이미 침해된 상태이며, 업데이트해도 공격자의 지속성(persistence)이 제거되지 않습니다.
이 도구는 그 지속성을 찾아 제거합니다. 의존성이 적은 단일 Bash 스크립트로, 기본적으로 읽기 전용으로 실행되며 한 번에 수천 개의 사이트를 스캔할 수 있습니다.
⚠️ 이 도구는 방어용입니다. 익스플로잇 코드는 포함되어 있지 않습니다.
--clean을 실행하기 전에 사이트를 스냅샷하십시오.
침해 이후 wp2shell 도구는 일반적으로 두 가지 지속성 아티팩트를 남기며, 이 도구는 둘 다 찾아냅니다:
user_login = wpsvc_<hex> / wp2_<hex> / w2s_<hex>, 또는 공격자 도메인의 이메일(@wp2shell.*, @shellcode.*, @wordpress-svc.internal, @wordpress-noreply.net, @x.lol)과 함께 administrator 역할을 가진 계정. (참고: @system.local은 일부 관리형 호스트에서 정상적인 자리표시자 관리자 이메일입니다 — 의도적으로 IOC로 취급하지 않습니다.)wp-content/plugins/<그럴듯한-이름>-<6hex>/<동일한-이름>.php: 위조된 Author: WordPress.org Community 헤더를 가진 작은(~1.3 KB) PHP 파일로, 토큰으로 보호되며 ?c=<command> 인터페이스를 노출합니다.또한 일반적인 경우도 탐지합니다: wp-content/ 아래에서 $_GET['c']를 명령/eval 싱크로 전달하는 모든 작은 PHP 파일입니다.
curl -fsSLO https://raw.githubusercontent.com/InstaWP/wp2shell-scan/main/wp2shell-scan.sh
chmod +x wp2shell-scan.sh
bash, find, grep 및 mysql/mariadb 클라이언트가 필요합니다. WP‑CLI는 존재할 경우 사용되지만(더 깔끔한 사용자 삭제) 필수는 아닙니다 — 웹셸 탐지에는 데이터베이스가 전혀 필요하지 않습니다.
# Scan ONE site (read-only)
./wp2shell-scan.sh --path /var/www/example.com
# Scan EVERY WordPress install under a base directory (bulk)
./wp2shell-scan.sh --base /var/www
./wp2shell-scan.sh --base /home # shared hosting
# Auto-detect common layouts (/var/www/*, /home/*/public_html, ...)
./wp2shell-scan.sh
# Machine-readable
./wp2shell-scan.sh --base /var/www --json > report.json
# CLEAN — quarantine + remove backdoors, rotate wp-config salts (logs everyone out)
./wp2shell-scan.sh --base /var/www --clean --yes
# Vet a BACKUP / SNAPSHOT / TEMPLATE dump before restoring it (see warning below)
./wp2shell-scan.sh --sql /path/to/backup.sql
제거된 아티팩트는 격리 디렉터리로 이동되며(완전히 삭제되지 않음) 증거를 보존할 수 있습니다. 종료 코드는 감염이 발견되거나(scan) 정리되었을 때(clean) 1, 깨끗할 때 0이며, cron/CI에 유용합니다.
[COMPROMISED] /var/www/example.com — 2 backdoor admin(s), 2 webshell(s)
admin: ID=41 wpsvc_2e1487df8abb <[email protected]> (2026-07-19 06:41:48)
webshell: .../wp-content/plugins/security-headers-manager-8d1d21/security-headers-manager-8d1d21.php
[clean] /var/www/other-site.com
----------------------------------------------------------------
scanned=812 clean=811 compromised=1 cleaned=0
운영 중인 사이트를 정리해도 백업은 정리되지 않습니다. 사이트가 침해된 상태에서 캡처된 백업, 스냅샷 또는 스테이징/블루프린트 템플릿에는 여전히 공격자의 관리자 계정이 포함되어 있습니다. 이를 복원하거나(또는 이를 기반으로 새 사이트를 프로비저닝하면) 즉시 재감염됩니다. 우리는 이를 뼈저리게 경험했습니다. 영향을 받은 모든 운영 사이트를 정리한 후에도 백도어가 포함된 새 사이트가 계속 나타났는데, 이는 오염된 템플릿 스냅샷에서 프로비저닝되고 있었기 때문입니다.
덤프를 복원하기 전에 검증하세요:
./wp2shell-scan.sh --sql /path/to/backup.sql
./wp2shell-scan.sh --sql backup1.sql --sql backup2.sql.gz # repeatable, .gz supported
종료 코드는 덤프 중 하나라도 오염되었으면 1입니다. 그런 경우: 복원하지 마세요 — 먼저 라이브 사이트를 정리한 다음, 새로운 백업을 생성하고, 노출 기간 동안 생성된 스냅샷이나 템플릿은 삭제하거나 교체하세요.
--clean은 관리자 계정과 웹셸을 제거하고 salts를 교체합니다. 그래도 다음을 반드시 수행해야 합니다:
wp core verify-checksums).?c= 명령 값이 기록되어 있습니다./wp-json/batch/v1, ?rest_route=/batch/v1, %2f 인코딩 포함). CDN이 REST 경로를 통과시킬 수 있다면 오리진에 차단을 설정하세요.악성 관리자 계정:
SELECT u.ID,u.user_login,u.user_email,u.user_registered
FROM wp_users u JOIN wp_usermeta m ON u.ID=m.user_id
WHERE m.meta_key='wp_capabilities' AND m.meta_value LIKE '%administrator%'
ORDER BY u.user_registered DESC;
웹셸 플러그인:
find wp-content/plugins -maxdepth 1 -type d -regextype posix-extended -regex '.*-[0-9a-f]{6}$'
grep -rl "\$_GET\['c'\]" wp-content/plugins/
단일 사이트에서 동일한 탐지 및 정리를 Claude Code(또는 유능한 코딩 에이전트)로 수행하도록 안내하는, 바로 붙여넣을 수 있는 프롬프트는 CLEANUP-WITH-CLAUDE.md를 참조하세요. 각 파괴적 단계 전에는 사람의 확인을 거칩니다.
MIT — LICENSE를 참조하세요. 있는 그대로 제공되며 보증은 없습니다. InstaWP 팀이 실제 인시던트 대응 중에 구축하고 실전 검증했습니다.