
Decodificador de credenciales C-Ark para #CVE-2021-31796
Herramienta de explotación para CVE-2021-31796
Una herramienta para decodificar archivos de credenciales C-Ark
Por: Aaron Mizrachi - https://twitter.com/unmanarc/
Enrique Vaamonde - https://twitter.com/_ejvm
Primera versión: 2/Sep/2019
Divulgación: 11/Oct/2021
Esta vulnerabilidad estaba pendiente de publicación desde Sep/2019.
Y... aquí está la línea de tiempo:
Durante un pentest, si alguien es lo suficientemente hábil como para llegar al PSM y accidentalmente obtener acceso al CredFile, esa persona podría potencialmente usar este archivo para establecer una conexión con el Vault y obtener todo el reino...
Como contramedida, la mayoría de los archivos de credenciales colocan algunas "restricciones" para evitar que la contraseña se use en un entorno/equipo diferente (p. ej., el propio PSM del hacker).
Sin embargo, esas restricciones pueden modificarse si se hace ingeniería inversa y se obtiene la porción de clave sin procesar. Esta porción de clave descifrada puede usarse para volver a crear otro archivo con otros parámetros de "seguridad" (p. ej., otro host, otra aplicación, otro usuario del SO).
Para generar la clave de descifrado sin procesar AES-256 (32 bytes), tomamos un par de SHA1SUM del campo de credencial "AdditionalInformation" añadiendo "0x00000000" y "0x00000001" para cada hash; el primer hash proporciona los primeros 20 bytes de la clave, y el segundo solo los últimos 12 bytes.
Si hay restricciones ambientales (como IP/Host/exepath/...), anteponemos cada valor de texto plano a AdditionalInformation antes de calcular ambos SHA1SUM.
Es importante mencionar que el campo "ClientApp" se transforma con BASE64(SHA1SUM(strlower(ClientApp))) antes de anteponerse a "AdditionalInformation" y generar ambos SHA1SUM.
El descifrado se realiza mediante la función AES-256-CBC de OpenSSL utilizando el campo Password o NewPassword. (https://wiki.openssl.org/index.php/EVP_Symmetric_Encryption_and_Decryption)
Estamos usando (verificationflags-16) para determinar qué validación/restricción está en vigor:
usingClientApp = ((uVerificationsFlag&0x1) != 0);
usingAppPath = ((uVerificationsFlag&0x2) != 0);
usingClientIP = ((uVerificationsFlag&0x4) != 0);
usingOSUser = ((uVerificationsFlag&0x8) != 0);
usingClientHostname = ((uVerificationsFlag&0x20) != 0);
y en el caso de que algunas restricciones no se muestren en el archivo de credenciales de salida, siempre puedes introducirlas manualmente. Creo que ambos podemos estar de acuerdo en que ni la "ruta de la aplicación" ni la "IP del cliente" son valores realmente aleatorios.
Usa el HSM \o/, no almacenes la clave de descifrado en el archivo de credenciales.
qmake .
make -j8