Dirk-jan Mollema a récemment présenté une attaque permettant d'obtenir un certificat pour des comptes hautement privilégiés via Intune.. Celui-ci peut ensuite être utilisé pour compromettre l'ensemble de l'environnement Active Directory.
L'attaque est comparable dans ses grandes lignes à ce que j'ai déjà décrit dans l'article "De zéro à Enterprise Administrator grâce au service d'enregistrement des périphériques réseau (NDES) - et ce qui peut être fait à ce sujet" et dans l'article "Vecteur d'attaque sur le service d'annuaire Active Directory via le mécanisme de connexion par carte à puce"(également connu sous le nom de ESC1).
La nouveauté consiste toutefois à exploiter le système de gestion des appareils mobiles (MDM) - en l'occurrence Microsoft Intune - de manière appropriée.
Ce qui n'est pas nouveau en revanche, c'est ce qui peut être fait contre cela avec le module de politique TameMyCerts pour les Active Directory Certificate Services afin de réduire drastiquement la surface d'attaque...
Nous ne devrions pas non plus nous sentir faussement en sécurité si notre entreprise utilise un autre système MDM. L'attaque fondamentale est la même partout, et dans la plupart des autres systèmes MDM, le processus de demande de certificat est encore beaucoup moins sûr.
Le problème fondamental est que les attaques de ce type exploitent le fait que le cas d'utilisation du certificat utilisé exige que le modèle de certificat correspondant soit configuré de manière à accepter toutes les identités demandées par le demandeur (modèle de certificat hors ligne).

Si un attaquant obtient maintenant la possibilité d'envoyer directement ou indirectement une demande de certificat à l'autorité de certification, il peut se faire délivrer des certificats pour n'importe quelle identité, y compris celles de comptes privilégiés.
TameMyCerts résout ce dilemme.
Qu'est-ce que TameMyCerts et comment fonctionne-t-il ?
TameMyCerts est un Module de politiquepour sécuriser l'autorité de certification Microsoft (Active Directory Certificate Services). Il étend les fonctions de l'autorité de certification et permet de l'application élargie de la réglementationIl permet d'automatiser en toute sécurité l'émission de certificats. TameMyCerts est unique dans l'écosystème Microsoft et est disponible sous une licence libre. Il peut téléchargé via GitHub et être utilisé gratuitement.

TameMyCerts est open source et peut être utilisé gratuitement. Toutefois, pour une utilisation en entreprise, il est recommandé d'utiliser le Conclusion d'un contrat de maintenance. Cela garantit que vous recevrez un soutien qualifié et que le module pourra être développé à long terme avec une qualité élevée.
TameMyCerts est également synonyme de qualité exceptionnelle. Ainsi, toutes les fonctions sont accompagnées de tests automatiques afin de garantir un fonctionnement irréprochable.
TameMyCerts cherche toujours des raisons de refuser une demande de certificat validée par l'autorité de certification Microsoft. L'inverse ne se produit jamais, à savoir qu'une demande de certificat déjà refusée est à nouveau validée.
Forcer des champs de certificat exactement définis avec une syntaxe exactement définie
TameMyCerts permet de définir avec précision le contenu de certificat pouvant être demandé pour les modèles de certificats hors ligne.
Il nous permet d'appliquer les restrictions suivantes.
- Limiter les types de noms distincts relatifs au sujet (RDN) et de noms alternatifs au sujet (SAN) autorisés.
- Appliquer des règles syntaxiques (expressions régulières, masques de sous-réseau IP) par rapport aux types de RDN et de SAN définis
Relier (mapper) l'identité demandée en retour sur les comptes concernés
TameMyCerts peut mettre en correspondance le contenu du certificat demandé avec le compte concerné. Pour cela, le contenu du certificat est évalué selon des règles définies et un objet correspondant est recherché dans l'Active Directory.
Un refus est alors prononcé dans les cas suivants :
- Aucun objet correspondant aux critères de recherche n'a été trouvé.
- Plus d'un objet correspondant aux critères de recherche a été trouvé.
- L'objet trouvé est désactivé.
- L'objet trouvé n'est pas membre de groupes de sécurité définis (facultatif, mais très utile).
- L'objet trouvé est membre de groupes de sécurité interdits définis (facultatif, mais très utile).
- Les attributs sur l'objet trouvé ne correspondent pas aux critères syntaxiques définis (facultatif, mais très utile).
Mise en œuvre concrète d'une configuration de politique
TameMyCerts est largement documenté. La documentation est consultable en ligne.
Ainsi, afin de permettre l'émission de certificats pour les utilisateurs réguliers d'Intune dans une mesure bien définie, nous créons, après la Installation de TameMyCerts l'ensemble de règles décrites ci-dessous. Nous utiliserons une configuration pour les certificats d'utilisateur. La logique de base est toutefois comparable pour les certificats de périphérique.
Création d'un fichier de configuration
La première étape consiste à créer un fichier de configuration (XML) avec le même nom que le modèle de certificat dans le répertoire créé lors de l'installation.
Dans notre exemple, le modèle de certificat s'appelle "ADCSLaborIntuneUser", notre fichier de configuration s'appelle en conséquence "ADCSLaborIntuneUser.xml".

Ensuite, nous affinons notre ensemble de règles jusqu'à ce qu'il limite au maximum les possibilités de demande de certificat.
Voir la structure de base comme suit :
<CertificateRequestPolicy xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<!-- here we will place our rules -->
</CertificateRequestPolicy>
Étape 1 : Règles syntaxiques
Dans notre exemple, nous partons du principe que nous avons défini les règles suivantes dans Intune :

Le contenu du certificat demandé sera donc le suivant :
- Le Subject Distinguished Name (DN) contient le nom d'utilisateur (CN={{UserName}}}) et l'adresse électronique de l'utilisateur (E={EmailAddress}}).
- Le Subject Alternative Name (SAN) contiendra le nom principal de l'utilisateur ({{UtilisateurPrincipalName}})
Nos règles syntaxiques se présentent donc comme suit :
<Subject>
<SubjectRule>
<Field>commonName</Field>
<Mandatory>true</Mandatory>
<Patterns>
<Pattern>
<Expression>^[a-zA-Z0-9]*$</Expression>
</Pattern>
</Patterns>
</SubjectRule>
<SubjectRule>
<Field>emailAddress</Field>
<Mandatory>true</Mandatory>
<Patterns>
<Pattern>
<Expression>^[a-zA-Z0-9]*\@intra\.adcslabor\.de$</Expression>
</Pattern>
</Patterns>
</SubjectRule>
</Subject>
<SubjectAlternativeName>
<SubjectRule>
<Field>userPrincipalName</Field>
<Mandatory>true</Mandatory>
<Patterns>
<Pattern>
<Expression>^[a-zA-Z0-9]*\@intra\.adcslabor\.de$</Expression>
</Pattern>
</Patterns>
</SubjectRule>
</SubjectAlternativeName>
Étape 2 : Mappage du contenu du certificat demandé sur le compte Active Directory correspondant
Nous savons que nos utilisateurs Intune se trouvent tous dans une unité organisationnelle spécifique. Nous limitons donc la recherche en conséquence.
<DirectoryServicesMapping>
<!-- ... -->
<SearchRoot>OU=ADCS Labor Users,DC=intra,DC=adcslabor,DC=de</SearchRoot>
</DirectoryServicesMapping>
Pour établir le lien entre le contenu du certificat demandé et le compte Active Directory, il faut des critères de correspondance clairs. Étant donné que les demandes de certificats sont soumises au userPrincipalName peut être utilisé. Nous souhaitons donc que le contenu du userPrincipalName SAN de la demande de certificat, afin d'inclure des objets de type user avec la même valeur dans son userPrincipalName attribut.
Une règle correspondante se présenterait comme suit. Mais comme il s'agit du paramètre par défaut, elle peut aussi être omise.
<DirectoryServicesMapping>
<!-- ... -->
<CertificateAttribute>userPrincipalName</CertificateAttribute>
<DirectoryServicesAttribute>userPrincipalName</DirectoryServicesAttribute>
<ObjectCategory>user</ObjectCategory>
</DirectoryServicesMapping>
Nous savons également que tous les utilisateurs d'Intune doivent être membres d'un certain groupe de sécurité pour obtenir un certificat.
<DirectoryServicesMapping>
<!-- ... -->
<AllowedSecurityGroups>
<string>CN=Intune Users,OU=ADCS Labor Groups,DC=intra,DC=adcslabor,DC=de</string>
</AllowedSecurityGroups>
</DirectoryServicesMapping>
De plus, nous ne souhaitons en aucun cas que les membres de groupes privilégiés reçoivent un tel certificat.
<DirectoryServicesMapping>
<!-- ... -->
<DisallowedSecurityGroups>
<string>CN=Domain Admins,CN=Users,DC=intra,DC=adcslabor,DC=de</string>
</DisallowedSecurityGroups>
</DirectoryServicesMapping>
En option : extension du certificat SID
Tant qu'on y est, on pourrait aussi ajouter l'extension Security Identifier Certificate dans le certificat émis.
<SecurityIdentifierExtension>Add</SecurityIdentifierExtension>
L'approche alternative du SID Uniform Resource Identifier (URI) est également pris en charge par TameMyCerts. Et en général, il est recommandé de ne pas faire demander ces informations hautement sensibles par le demandeur, mais de les faire inscrire dans le certificat par l'autorité de certification avec TameMyCerts. Cela permet de garantir que le SID correspondant au compte associé se retrouve dans le certificat.
Facultatif : utiliser les attributs Active Directory du compte mappé pour améliorer le contenu du certificat.
Les attributs utilisables sont ici documenté.
Nous pourrions également décider de modifier le contenu du certificat demandé. Par exemple, nous pourrions ajouter le nom de l'entreprise et écrire le nom du département dans les propriétés du compte utilisateur dans le Subject Distinguished Name du certificat délivré.
<OutboundSubject>
<OutboundSubjectRule>
<Field>organizationName</Field>
<Value>ADCS Labor</Value>
</OutboundSubjectRule>
<OutboundSubjectRule>
<Field>organizationalUnitName</Field>
<Value>{ad:department}</Value>
</OutboundSubjectRule>
</OutboundSubject>
Résumé
D'autres exemples sont fournis avec TameMyCerts. Les fichiers de configuration d'exemple sont également consultable sur GitHub.
La définition complète de la politique se présente alors comme suit :
<CertificateRequestPolicy xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Subject>
<SubjectRule>
<Field>commonName</Field>
<Mandatory>true</Mandatory>
<Patterns>
<Pattern>
<Expression>^[a-zA-Z0-9]*$</Expression>
</Pattern>
</Patterns>
</SubjectRule>
<SubjectRule>
<Field>emailAddress</Field>
<Mandatory>true</Mandatory>
<Patterns>
<Pattern>
<Expression>^[a-zA-Z0-9]*\@intra\.adcslabor\.de$</Expression>
</Pattern>
</Patterns>
</SubjectRule>
</Subject>
<SubjectAlternativeName>
<SubjectRule>
<Field>userPrincipalName</Field>
<Mandatory>true</Mandatory>
<Patterns>
<Pattern>
<Expression>^[a-zA-Z0-9]*\@intra\.adcslabor\.de$</Expression>
</Pattern>
</Patterns>
</SubjectRule>
</SubjectAlternativeName>
<DirectoryServicesMapping>
<SearchRoot>OU=ADCS Labor Users,DC=intra,DC=adcslabor,DC=de</SearchRoot>
<AllowedSecurityGroups>
<string>CN=Intune Users,OU=ADCS Labor Groups,DC=intra,DC=adcslabor,DC=de</string>
</AllowedSecurityGroups>
<DisallowedSecurityGroups>
<string>CN=Domain Admins,CN=Users,DC=intra,DC=adcslabor,DC=de</string>
</DisallowedSecurityGroups>
</DirectoryServicesMapping>
<OutboundSubject>
<OutboundSubjectRule>
<Field>organizationName</Field>
<Value>ADCS Labor</Value>
</OutboundSubjectRule>
<OutboundSubjectRule>
<Field>organizationalUnitName</Field>
<Value>{ad:department}</Value>
</OutboundSubjectRule>
</OutboundSubject>
<SecurityIdentifierExtension>Add</SecurityIdentifierExtension>
</CertificateRequestPolicy>
Enregistrement et alerte
Les événements consignés par TameMyCerts sont les suivants ici documenté.
Si l'autorité de certification refuse une demande de certificat par TameMyCerts, cet événement est consigné sur l'autorité de certification et une alerte correspondante peut être déclenchée.
Test de fonctionnement
Pour tester, j'utilise le PSCertificateEnrollment module PowerShell. Le type de demande de certificat - c'est-à-dire par MS-WCCE, par SCEP, et avec ou sans Mobile Device Management - ne joue aucun rôle pour le test, car la vérification de la demande de certificat s'effectue directement sur l'autorité de certification et est donc indépendante du type de demande.
Cas de test 1 : violation du contenu défini du certificat
Pour le premier test, nous demandons un certificat qui n'est qu'un commonName comprend.
New-CertificateRequest -Subject "CN=rudi" |
Get-IssuedCertificate -ConfigString "CA02.intra.adcslabor.de\ADCS Labor Issuing CA 1" -CertificateTemplate "ADCSLaborIntuneUser"
Cependant, comme nous le rappelons, nos règles syntaxiques exigent également qu'une emailAddress ainsi qu'un userPrincipalName sont inclus. La demande de certificat est refusée en conséquence et un événement est consigné.

Cas de test 2 : Les règles syntaxiques empêchent l'émission de certificats
Pour le deuxième test, nous demandons bien tous les champs définis, mais nous construisons une erreur dans les userPrincipalName un.
New-CertificateRequest `
-Subject "CN=rudi,E=rudi@intra.adcslabor.de" `
-Upn "rudi@adcslabor.de" |
Get-IssuedCertificate -ConfigString "CA02.intra.adcslabor.de\ADCS Labor Issuing CA 1" -CertificateTemplate "ADCSLaborIntuneUser"
La demande de certificat est refusée en conséquence.

Cas-test 3 : Échec de la cartographie de l'objet demandé
Pour le test suivant, nous demandons un userPrincipalName qui n'est pas connu dans le domaine.
New-CertificateRequest `
-Subject "CN=rudi,E=rudi@intra.adcslabor.de" `
-Upn "rudy@intra.adcslabor.de" |
Get-IssuedCertificate -ConfigString "CA02.intra.adcslabor.de\ADCS Labor Issuing CA 1" -CertificateTemplate "ADCSLaborIntuneUser"
La demande de certificat est refusée en conséquence.

Nous corrigeons notre erreur, mais l'utilisateur que nous recherchons ne se trouve pas dans l'unité organisationnelle définie.
New-CertificateRequest -Subject "CN=rudi,E=rudi@intra.adcslabor.de" -Upn "rudi@intra.adcslabor.de" | Get-IssuedCertificate -ConfigString "CA02.intra.adcslabor.de\ADCS Labor Issuing CA 1" -CertificateTemplate "ADCSLaborIntuneUser"
Notre demande de certificat est refusée en conséquence.

Cas-test 4 : Les adhésions de groupe pour l'objet demandé échouent
Maintenant que nous avons déplacé notre utilisateur test Rudi dans l'unité d'organisation correcte, nous tentons à nouveau notre chance.
New-CertificateRequest `
-Subject "CN=rudi,E=rudi@intra.adcslabor.de" `
-Upn "rudi@intra.adcslabor.de" |
Get-IssuedCertificate -ConfigString "CA02.intra.adcslabor.de\ADCS Labor Issuing CA 1" -CertificateTemplate "ADCSLaborIntuneUser"
L'utilisateur n'est cependant pas membre d'un des groupes définis - en conséquence, la demande de certificat est à nouveau refusée.

Ok, alors ajoutons maintenant Rudi dans les "Intune Users" définis et essayons à nouveau.
Cependant, comme l'utilisateur est membre du groupe interdit des administrateurs de domaine, nous échouons à nouveau.

Cas-test 5 : Délivrance réussie du certificat
Si notre utilisateur Rudi remplit enfin toutes les conditions, nous recevrons enfin notre certificat.

Dans le Subject Distinguished Name, nous voyons que le "département"du compte Active Directory associé a été transféré dans le champ organizationalUnit du certificat. De même, le nom de l'entreprise a été transféré dans le champ organizationName champ du certificat.

L'extension du certificat Security Identifier se trouve également dans le certificat délivré.

Conclusion
La confiance c'est bien, le contrôle c'est mieux. TameMyCerts permet aux administrateurs de PKI de reprendre le contrôle sur les certificats qu'ils émettent et d'augmenter considérablement le niveau de sécurité de la PKI.
TameMyCerts est open source et peut être utilisé gratuitement. Toutefois, pour une utilisation en entreprise, il est recommandé d'utiliser le Conclusion d'un contrat de maintenance. Cela garantit que vous recevrez un soutien qualifié et que le module pourra être développé à long terme avec une qualité élevée.
Mais attendez... il y a plus
TameMyCerts peut faire bien plus encore, et peut en conséquence offrir une valeur ajoutée significative dans un grand nombre de cas d'application. Voici un extrait de ces...
- Comment le module de politique TameMyCerts pour Active Directory Certificate Services (ADCS) peut empêcher les attaques contre le vecteur d'attaque ESC1
- Attestation YubiKey Personal Identity Verification (PIV) - avec le module TameMyCerts Policy pour Microsoft Active Directory Certificate Services (ADCS)
- Comment le module de politique TameMyCerts pour Active Directory Certificate Services (ADCS) peut détecter et prévenir les attaques contre les vecteurs d'attaque ESC6 et ESC7
- Comment le module de politique de TameMyCerts pour Active Directory Certificate Services (ADCS) peut aider à établir des processus de signature numérique dans l'entreprise
- Ajouter automatiquement l'extension de certificat Security Identifier (SID) aux certificats demandés via Mobile Device Management (MDM) - avec le module TameMyCerts Policy pour Microsoft Active Directory Certificate Services (ADCS)
- Comment la sécurisation des imprimantes peut devenir un désastre en matière de sécurité - et comment le module de politique TameMyCerts pour Active Directory Certificate Services (ADCS) peut empêcher cela
- Comment le module de politique TameMyCerts pour Active Directory Certificate Services (ADCS) peut aider à sécuriser des scénarios avec Microsoft Intune et d'autres systèmes de gestion des dispositifs mobiles (MDM)
- Prolonger ou raccourcir la période de validité des certificats d'autorité de certification racine
Liens complémentaires :
- Comment le module de politique TameMyCerts pour Active Directory Certificate Services (ADCS) peut empêcher les attaques contre le vecteur d'attaque ESC1
- Vecteur d'attaque sur le service d'annuaire Active Directory via le mécanisme de connexion par carte à puce
- De zéro à Enterprise Administrator grâce au service d'enregistrement des périphériques réseau (NDES) - et ce qui peut être fait à ce sujet
- Un module de politique pour les apprivoiser : Présentation du module de politique TameMyCerts pour Microsoft Active Directory Certificate Services
- Comment le module de politique TameMyCerts pour Active Directory Certificate Services (ADCS) peut aider à sécuriser des scénarios avec Microsoft Intune et d'autres systèmes de gestion des dispositifs mobiles (MDM)
Sources externes
- Sleepw4lker/TameMyCerts : Module de politique pour Microsoft Active Directory Certificate Services (Projet GitHub de TameMyCert)
- Le module de politique TameMyCerts pour Microsoft Active Directory Certificate Services (Documentation produit TameMyCerts)
- Extension de la surface d'attaque AD CS au cloud avec les certificats Intune (Dirk-jan Mollema)
- Exploiter ADCS NDES pour l'escalade des privilèges (Giulio Pierantoni)
- Utiliser les profils de certificats SCEP avec Microsoft Intne (Microsoft)
- Architecture des services de certificats - Win32 apps (Microsoft)
- Conseil d'assistance : Mettre en œuvre une cartographie forte dans les certificats Microsoft Intune | Microsoft Community Hub (Microsoft)
- Mappage de certificat solide pour les certificats Intune PKCS et SCEP (Richard Hicks)