Question de sécurité : Windows conserve-t-il la clé privée lors de la suppression d’un certificat ?

A vide, sans certificat

Du point de vue de certutil

c:\temp>certutil -user -store my
CertUtil: -store La commande s'est terminée correctement.

c:\temp>certutil -store my
CertUtil: -store La commande s'est terminée correctement.

Du point de vue des conteneurs de clés

c:\temp>pkconteneurs
Conteneur(s) utilisateur :
Conteneur(s) machine :

Avec des certificats…

Installation de deux certificats (un dans le magasin utilisateur, l’autre machine)

c:\temp>certutil -user -p password -importpfx user.p12
c:\temp>certutil -p password -importpfx machine.p12

Du point de vue de certutil

c:\temp>certutil -user -store my
================ Certificat 0 ================
Objet: CN=user_export_noprotect
Conteneur de clé = user_export_noprotect-050c8772-126a-4815-8de8-0d3b27dda6e1

c:\temp>certutil -store my
================ Certificat 0 ================
Objet: CN=machine_export_noprotect
Conteneur de clé = machine_export_noprotect-69edbe24-fc12-43ff-ae70-7fa3ce723058

Du point de vue des conteneurs de clés

c:\temp>pkconteneurs
Conteneur(s) utilisateur :
user_export_noprotect-050c8772-126a-4815-8de8-0d3b27dda6e1
Conteneur(s) machine :
machine_export_noprotect-69edbe24-fc12-43ff-ae70-7fa3ce723058

A vide, en ayant supprimé les certificats

Suppression des certificats précédemment importés

c:\temp>certutil -user -delstore my "user_export_noprotect"
Suppression du certificat 0

c:\temp>certutil -delstore my "machine_export_noprotect"
Suppression du certificat 0

Du point de vue de certutil

c:\temp>certutil -user -store my
CertUtil: -store La commande s'est terminée correctement.

c:\temp>certutil -store my
CertUtil: -store La commande s'est terminée correctement.

Du point de vue des conteneurs de clés

c:\temp>pkconteneurs
Conteneur(s) utilisateur :
user_export_noprotect-050c8772-126a-4815-8de8-0d3b27dda6e1
Conteneur(s) machine :
machine_export_noprotect-69edbe24-fc12-43ff-ae70-7fa3ce723058

Conclusion

Il semblerait que les conteneurs des clés privées des certificats précédemment importés soient encore présent…
Astuce disponible dans mimikatz (export des clés privées orphelines) !

Code de l’éxecutable : pkconteneurs

#pragma comment(lib, "advapi32.lib")

#include <windows.h>
#include <iostream>

using namespace std;

void listContainers(bool isMachine)
{
	DWORD flags = CRYPT_VERIFYCONTEXT | (isMachine ? CRYPT_MACHINE_KEYSET : NULL);

	HCRYPTPROV hCryptProv = NULL;
	if(CryptAcquireContext(&hCryptProv, NULL, NULL, PROV_RSA_FULL, flags))
	{
		DWORD buflen = 0;
		if(CryptGetProvParam(hCryptProv, PP_ENUMCONTAINERS, NULL, &buflen, CRYPT_FIRST))
		{
			char * cname = new char[buflen];
			for (DWORD idx = 0;;idx++)
			{
				if(CryptGetProvParam(hCryptProv, PP_ENUMCONTAINERS, reinterpret_cast<BYTE *>(cname), &buflen, (idx == 0 ? CRYPT_FIRST : CRYPT_NEXT)))
				{
					wcout << cname << endl;
				}
				else
				{
					break;
				}
			}
			delete[] cname;
		}
	}
	CryptReleaseContext(hCryptProv, 0);
}

int wmain(int argc, wchar_t * argv[])
{
	wcout << L"Conteneur(s) utilisateur :" << endl << endl;
	listContainers(false);
	wcout << endl;
	
	wcout << L"Conteneur(s) machine :" << endl << endl;
	listContainers(true);
	wcout << endl;

	return ERROR_SUCCESS;
}

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *