
C-Ark Credential Decoder para #CVE-2021-31796
Ferramenta de exploração para CVE-2021-31796
Uma ferramenta para decodificar arquivos de credenciais C-Ark
Por: Aaron Mizrachi - https://twitter.com/unmanarc/
Enrique Vaamonde - https://twitter.com/_ejvm
Primeiro lançamento: 2/Set/2019
Divulgação: 11/Out/2021
Esta vulnerabilidade estava pendente de divulgação desde Set/2019.
E... aqui está a linha do tempo:
Durante um pentest, se alguém for esperto o suficiente para alcançar o PSM e acidentalmente obter acesso ao CredFile, essa pessoa pode potencialmente usar este arquivo para estabelecer uma conexão com o Vault e obter todo o domínio...
Como contramedida, a maioria dos arquivos de credenciais impõem algumas "restrições" para evitar que a senha seja usada em um ambiente/computador diferente (ex.: o próprio PSM do hacker).
No entanto, essas restrições podem ser modificadas se você reverter e obter a parte da chave bruta. Esta parte da chave decriptada pode ser usada para recriar outro arquivo com outros parâmetros de "segurança" (ex.: outro host, outro aplicativo, outro usuário do SO).
Para gerar a chave de decriptação bruta AES-256 (32 bytes), pegamos um par de SHA1SUM do campo de credencial "AdditionalInformation" acrescentando "0x00000000" e "0x00000001" para cada Hash; o primeiro Hash fornece os primeiros 20 bytes da chave, e o segundo apenas os últimos 12 bytes.
Se houver alguma restrição ambiental (como IP/Host/exepath/...), prefixamos cada valor de texto simples a AdditionalInformation antes de calcular ambos os SHA1SUMs.
É importante mencionar que o campo "ClientApp" é transformado com BASE64(SHA1SUM(strlower(ClientApp))) antes de ser prefixado a "AdditionalInformation" e gerar ambos os SHA1SUMs.
A decriptação é feita usando a função AES-256-CBC do OpenSSL utilizando o campo Password ou NewPassword. (https://wiki.openssl.org/index.php/EVP_Symmetric_Encryption_and_Decryption)
Estamos usando (verificationflags-16) para determinar qual validação/restrição está em vigor:
usingClientApp = ((uVerificationsFlag&0x1) != 0);
usingAppPath = ((uVerificationsFlag&0x2) != 0);
usingClientIP = ((uVerificationsFlag&0x4) != 0);
usingOSUser = ((uVerificationsFlag&0x8) != 0);
usingClientHostname = ((uVerificationsFlag&0x20) != 0);
e no caso de algumas restrições não serem exibidas no arquivo de credencial de saída, você sempre pode introduzi-las manualmente. Acho que ambos podemos concordar que nem "caminho do aplicativo" nem "IP do cliente" são valores verdadeiramente aleatórios.
Use o HSM \o/, não armazene a chave de decriptação no arquivo de credencial.
qmake .
make -j8