WordPress REST API 배치 엔드포인트 탐색, 당사 인프라에서 3배 이상 급증
10월 26일 주간에 wp2shell 취약점 체인의 진입점인 WordPress REST API 배치 엔드포인트를 당사 인프라에 요청한 출발지 수가 이전 주간 평균의 3.3배로 늘었습니다. 스캐너들은 백업 파일, 디버그 페이지, 애플리케이션 내부 정보도 더 자주 요청했습니다.
291 Intercept는 자동화된 스캐너가 당사 인프라에서 무엇을 노렸는지 정리하는 주간 보고서로, 여러분의 시스템에서도 같은 항목을 점검할 수 있도록 돕습니다. 각 호는 최소 7일 전에 끝난 한 주를 다룹니다.
10월 26일 주간에 당사 인프라에서 가장 뚜렷하게 나타난 변화는 WordPress의 한 주소인 /wp-json/batch/v1에 대한 요청 급증이었습니다. 약 40개 출발지가 이 주소를 요청했으며, 이는 직전 3주간 주간 평균의 3.3배입니다. 이 엔드포인트는 wp2shell의 출발점입니다. wp2shell은 WordPress 코어에 있는 두 가지 취약점을 엮은 체인으로, 로그인하지 않은 공격자가 사이트에서 코드를 실행할 수 있게 합니다.
전반적으로도 분주한 한 주였습니다. 약 620개 출발지가 당사의 인터넷 노출 인프라를 탐색했으며, 이는 직전 3주 평균보다 10% 많은 수치입니다. WordPress는 여전히 주요 표적이었습니다. 전체 출발지의 66%가 WordPress 로그인, XML-RPC, 플러그인 경로를 노렸으며 이는 20% 증가한 것입니다. 스캐너들은 비공개로 유지되어야 할 애플리케이션 영역도 더 자주 요청했습니다.
wp2shell이란
/wp-json/은 WordPress REST API의 루트이며, /wp-json/batch/v1은 여러 API 요청을 묶어 한꺼번에 처리하는 배치 프로세서입니다. Rapid7에 따르면 wp2shell은 두 가지 취약점을 결합합니다. CVE-2026-63030은 이 배치 프로세서의 로직 결함이고, CVE-2026-60137은 posts 엔드포인트의 SQL 인젝션입니다. 이 둘을 연계하면 계정이 없는 사람도 WordPress 6.9.0부터 6.9.4까지, 그리고 7.0.0부터 7.0.1까지의 버전에서 코드를 실행할 수 있습니다.
이 취약점은 2026년 7월 17일에 공개되었으며, Rapid7에 따르면 CISA는 7월 21일 이를 알려진 악용 취약점(Known Exploited Vulnerabilities) 카탈로그에 추가했습니다. 수정된 릴리스는 6.9.5, 7.0.2, 7.1 Beta 2입니다.
이미 수정판이 나온 취약점을 왜 탐색할까요? 스캐너 입장에서는 모든 사이트가 취약할 필요 없이 일부만 취약하면 됩니다. 요청 하나에 드는 비용은 거의 없으며, 아직 영향받는 버전을 쓰는 사이트가 하나라도 있다면 다시 찾아올 가치가 충분합니다.
익숙한 WordPress 스캐닝
몇몇 국가에 분포한 약 20개 출발지로 이루어진 조직적인 툴킷이 약 10개 경로로 구성된 동일한 목록을 실행했습니다. 이 툴킷은 /wp/wp-includes/wlwmanifest.xml, /shop/wp-includes/wlwmanifest.xml, /wordpress/wp-includes/wlwmanifest.xml처럼 같은 파일을 여러 폴더 이름 아래에서 요청했고, /xmlrpc.php도 함께 요청했습니다.
wlwmanifest.xml은 기본 WordPress 설치에 포함된 Windows Live Writer 매니페스트 파일입니다. 흔한 폴더 이름 아래에서 이 파일을 요청하는 것은 플러그인이나 테마 익스플로잇을 시도하기 전에 WordPress 사이트를 찾아내는 방법입니다. XML-RPC는 그다음 단계입니다. 연구자들은 2015년에 XML-RPC의 system.multicall 메서드를 이용하면 공격자가 요청 한 번으로 수백 개의 비밀번호를 시도할 수 있다는 사실을 밝혀냈습니다.
남겨진 파일과 내부 정보
직전 3주와 비교해 백업 및 덤프 파일을 찾는 출발지 수는 73%, Spring Boot actuator 같은 애플리케이션 내부 정보를 노리는 출발지 수는 63%, /phpinfo.php나 /info.php 같은 진단 페이지를 요청한 출발지 수는 52% 증가했습니다. 전체 출발지 수도 함께 늘었기 때문에 비중 변화는 이보다 작았습니다. 예를 들어 진단 페이지의 비중은 전체 출발지 대비 평균 15%에서 21%로 높아졌습니다. 아래 차트는 이번 주 6개 범주에 대해 각 범주의 이번 주 출발지 비중을 직전 3주 평균과 비교해 보여 줍니다.
각 대상을 노린 출발지가 전체 개별 출발지에서 차지하는 비율(%)입니다. 하나의 출발지가 여러 대상을 노릴 수 있으므로 비율의 합은 100%를 넘습니다.
| 이번 주 | 이전 3주 평균 | |
|---|---|---|
| 백업 및 데이터베이스 덤프 | 12% | 9% |
| 애플리케이션 관리 엔드포인트 | 13% | 9% |
| 디버그 및 진단 페이지 | 21% | 15% |
| WordPress 로그인 페이지 및 파일 | 66% | 61% |
| 노출된 소스 코드(Git, SVN) | 29% | 24% |
| 시크릿 및 설정 파일 | 33% | 33% |
/actuator/env에는 약 40개 출발지가 몰렸으며, 이는 이전 평균의 2.4배입니다. Spring Boot에서 이 엔드포인트는 애플리케이션의 구성 속성을 보여 줍니다. Spring 문서에 따르면 기본적으로 HTTP로 접근할 수 있는 엔드포인트는 health뿐이고 env 값도 기본적으로 마스킹됩니다. 하지만 개발자가 접근 제한 없이 이 엔드포인트를 열어 두면 자격 증명, API 키, 내부 설정이 유출될 수 있습니다. 잊힌 WordPress 설정 백업 파일인 /wp-config.php.bak는 요청이 두 배로 늘어 약 40개 출발지가 찾았습니다.
약 20개 출발지로 이루어진 두 번째 툴킷은 이러한 관심사를 한 번의 스캔에 섞어 /.env, /.git/config, /info.php, /config.json, /server-status, /debug/default/view를 요청했습니다. 마지막 경로는 세션 데이터, 환경 변수, 데이터베이스 쿼리를 보여 주는 Yii 2 디버거의 경로입니다. Yii 가이드에 따르면 이 디버거는 보통 localhost에서만 동작합니다. 그러나 9월 30일 공개된 CVE-2026-103475는 yii2-starter-kit 4.2.0 이하 버전을 다루며, 이 버전들은 기본 구성에서 디버거를 모든 IP 주소에 개방합니다.
지난주 후속 상황
지난 호에서는 하위 폴더의 .env 파일을 찾는 스캐너가 늘었다고 언급했습니다. 이 추세는 계속되었습니다. /v2/.env와 /old/.env에는 각각 약 60개 출발지가 몰려 이전 평균의 약 두 배를 기록했고, /production/.env는 50개, /storage/.env는 40개였습니다. 비밀 정보 및 구성 파일을 노린 출발지는 모두 200개로 16% 늘었는데, 전체 출발지 증가율과 거의 비슷한 수준이어서 비중은 33%로 유지되었습니다. 규모를 가늠해 보자면, 연구자들은 공개적으로 접근 가능한 .env 형식 파일을 노출하는 IP 주소가 12,088,677개에 달한다고 2월에 보고했습니다.
지난주 주요 소식으로 다룬 Git 탐색은 비중이 줄었지만 이전 수준보다는 여전히 높았습니다. 소스 코드 저장소를 찾은 출발지는 모두 170개로 3주 평균보다 20% 많았지만, 전체 출발지 대비 비중은 37%에서 29%로 떨어졌습니다.
누가 요청했나
출발지의 절반 이상(55%)이 클라우드 및 호스팅 네트워크에서 왔으며, DigitalOcean과 Google Cloud가 각각 20%를 차지했습니다. 또한 전체 출발지의 85%는 단 하루만 나타났습니다. 대부분은 사람처럼 보이려고도 했습니다. 82%가 일반 브라우저를 가장한 User-Agent 문자열을 보냈지만 85%는 자동화 도구처럼 행동했으므로, 위장은 허술한 편입니다.
잠잠해진 항목
주당 평균 약 20개 출발지가 요청하던 /wp-content/plugins/hellopress/wp_filemanager.php는 79% 감소해 거의 자취를 감췄습니다. 스캐너들이 관심을 다른 곳으로 옮겼는지 판단하기에는 아직 이릅니다. /service-account.json 같은 클라우드 키 파일은 약 70개 출발지로 대체로 비슷한 수준을 유지했습니다.
조치 사항
- WordPress 버전을 확인하십시오. 6.9.0부터 6.9.4 또는 7.0.0부터 7.0.1 사이의 버전이라면 지금 바로 6.9.5 또는 7.0.2로 업데이트하십시오.
- .env 파일은 공개 폴더에 절대 두지 마십시오. 이전 릴리스와 버전별 하위 폴더도 마찬가지입니다. 웹 루트보다 한 단계 위가 안전한 위치입니다.
- 백업과 덤프 파일을 삭제하십시오.
/database.sql이나/wp-config.php.bak같은 파일은 브라우저로 접근할 수 있는 모든 위치에서 제거해야 합니다. - 내부 정보를 차단하십시오. Spring Boot actuator 엔드포인트 접근을 제한하고 env 마스킹은 켜 둔 채로 유지하며, phpinfo 테스트 페이지는 제거하고, Yii 디버거는 localhost에서만 쓸 수 있도록 제한하십시오.
- 사이트에서 XML-RPC를 필요로 하는 기능이 없다면 XML-RPC를 비활성화하십시오.
관측 자료에 대하여
이 보고서는 291 Group의 보안 모니터링 시스템인 291 Heat Seeker One이 작성하며, 이 시스템은 당사의 독자적인 보안 운영 플랫폼인 291 Crossband에서 동작합니다. 보고서는 291 Group 자체의 인터넷 노출 인프라로 들어오는 트래픽만 다룹니다.
수치는 반올림한 값이며, 비중과 변화율은 요청 수가 아니라 개별 출발지 수를 기준으로 산출합니다. 또한 최소 20개의 개별 출발지에서 관측된 패턴만 포함합니다. 국가는 출발지 서버가 위치한 곳을 뜻하며, 이를 운영하는 사람이 있는 곳과 반드시 일치하지는 않습니다. 네트워크 유형은 각 네트워크의 운영 주체를 기준으로 분류하며, 이름을 밝히는 것은 잘 알려진 대형 사업자에 한합니다.