
C-Ark Credential Decoder pour #CVE-2021-31796
Outil d'exploitation pour CVE-2021-31796
Un outil pour décoder les fichiers de crédentiel C-Ark
Par : Aaron Mizrachi - https://twitter.com/unmanarc/
Enrique Vaamonde - https://twitter.com/_ejvm
Première version : 2/Sep/2019
Divulgation : 11/Oct/2021
Cette vulnérabilité était en attente de publication depuis septembre 2019.
Et... voici la chronologie :
Lors d'un test d'intrusion, si quelqu'un est assez intelligent pour atteindre le PSM et obtenir accidentellement accès au CredFile, il peut potentiellement utiliser ce fichier pour établir une connexion au Vault et prendre le contrôle total...
Pour contrer cela, la plupart des fichiers de crédentiels imposent certaines "restrictions" pour éviter que le mot de passe soit utilisé dans un environnement/ordinateur différent (par exemple, le propre PSM du pirate).
Cependant, ces restrictions peuvent être modifiées si vous effectuez un reverse engineering et obtenez la partie brute de la clé. Cette partie de clé déchiffrée peut être utilisée pour recréer un autre fichier avec d'autres paramètres de "sécurité" (par exemple, un autre hôte, une autre application, un autre utilisateur OS).
Pour générer la clé de déchiffrement brute AES-256 (32 octets), nous prenons une paire de SHA1SUM du champ de crédentiel "AdditionalInformation" en ajoutant "0x00000000" et "0x00000001" pour chaque hachage ; le premier hachage fournit les 20 premiers octets de la clé, et le second uniquement les 12 derniers octets.
S'il existe des restrictions environnementales (comme IP/Hôte/chemin d'exécution/...), nous préfixons chaque valeur en clair à AdditionalInformation avant de prendre les deux SHA1SUM.
Il est important de mentionner que le champ "ClientApp" est transformé avec BASE64(SHA1SUM(strlower(ClientApp))) avant d'être préfixé à "AdditionalInformation" et de générer les deux SHA1SUM.
Le déchiffrement est effectué à l'aide de la fonction OpenSSL AES-256-CBC en utilisant le champ Password ou NewPassword. (https://wiki.openssl.org/index.php/EVP_Symmetric_Encryption_and_Decryption)
Nous utilisons (verificationflags-16) pour déterminer quelle validation/restriction est en place :
usingClientApp = ((uVerificationsFlag&0x1) != 0);
usingAppPath = ((uVerificationsFlag&0x2) != 0);
usingClientIP = ((uVerificationsFlag&0x4) != 0);
usingOSUser = ((uVerificationsFlag&0x8) != 0);
usingClientHostname = ((uVerificationsFlag&0x20) != 0);
et dans le cas où certaines restrictions ne sont pas affichées dans le fichier de crédentiel en sortie, vous pouvez toujours les introduire manuellement. Je pense que nous pouvons tous deux convenir que ni "chemin d'application" ni "IP client" n'est une valeur véritablement aléatoire.
Utilisez le HSM \o/, ne stockez pas la clé de déchiffrement dans le fichier cred.
qmake .
make -j8