Расшифровка хранимых в Windows паролей с помощью mimikatz и DPAPI


В статье «Как взломать пароль Windows» мы узнали, где и как Windows хранит пароли пользователей для входа в ОС, научились извлекать эти пароли в виде хеша и узнали, как можно подобрать пароль брут-форсом. Также мы познакомились с программой mimikatz, которую мы использовали для извлечения паролей в текущей системе, либо из файлов реестра Windows от другого компьютера.

В этой статье мы продолжим знакомиться с внутренним устройством Windows, а именно как эта операционная система хранит пароли других приложений. Также мы продолжим знакомиться с возможностями mimikatz.

Как Windows хранит пароли

Кроме пароля пользователя для входа в Windows (который, кстати, может быть не установлен), в ОС хранятся другие пароли:

  • Диспетчер учётных данных (Credential Manager)
  • Windows Vault,
  • Пароли браузера IE
  • Пароли для подключения к сетям Wi-Fi
  • Сертификаты
  • Пароли от VPN
  • Ключи SSH
  • Пароли браузера Google Chrome
  • Учётные данные приложения Google Talk, Skype, Dropbox, iCloud, Safari

Все эти пароли хранятся, конечно, в зашифрованном виде. Для шифрования перечисленных паролей и учётных данных используется DPAPI (Data Protection Application Programming Interface). Для конечного пользователя все процессы шифрования и расшифровки данных прозрачны, то есть не требуют каких-либо действий с его стороны.

Для шифрования этих данных используется пароль пользователя. Точнее говоря, генерируются мастер ключи, с помощью которых и происходит шифрование и расшифровка данных, а пароль пользователя используется для расшифровки мастер ключей. У одного пользователя может быть много мастер ключей. Предусмотрен механизм на случай смены пароля пользователя: по сути, хранятся хеши от всех старых паролей и делается попытка расшифровать мастер ключ пока не будет найден подходящий хеш.

Отсюда важное следствие: в системе для текущего пользователя возможно расшифровать, например, пароли из веб-браузера Google Chrome. Но если скопировать файл, где хранятся пароли этого браузера, на другой компьютер без необходимого мастер ключа, то не удастся расшифровать эти пароли.

Как зашифровать и расшифровать с помощью DPAPI

Как уже упомянуто чуть выше, DPAPI используется для шифрования и расшифровки данных. DPAPI довольно прост не только для конечных пользователей, но и для разработчиков, которые хотят воспользоваться этим шифрованием — имеются две функции, которые можно вызвать из приложения: шифрование и расшифровка.

Перед тем как переходить к извлечению паролей из веб-браузеров и других хранящихся на Windows паролей, давайте познакомимся поближе к DPAPI. Уже написано много хороших статей, объясняющих работу DPAPI. Не буду пытаться их пересказать, а просто приведу ссылки в конце этой статье. Вместо того, чтобы вникать в технические детали DPAPI, давайте пойдём практическим путём: зашифруем строку или файл с помощью DPAPI.

Все последующие действия мы будем выполнять в программе mimikatz, поэтому запустите её, как описано в этой статье.

Для работы с DPAPI используется модуль dpapi, для шифрования данных используется команда protect. У этой команды есть одна обязательная опция /data, после которой нужно указать путь до файла, который вы хотите зашифровать, или текстовую строку.

К примеру, я хочу зашифровать строку Test string to encrypt:

dpapi::protect /data:"Test string to encrypt"

Обратите внимание на секцию «Blob:» — это и есть зашифрованные данные в бинарном виде.

Вместо вывода зашифрованных данных на экран, их можно сохранить с помощью опции /out:

dpapi::protect /data:"Test string to encrypt" /out:crypted.txt

В результате будет создан файл crypted.txt. Этот файл содержит зашифрованные данные, а именно строку "Test string to encrypt".

Как вы могли заметить, нам не нужно думать о мастер ключах и паролях — система всё делает сама.

Для расшифровки используется функция blob (так называются зашифрованные этим методом данные) из этого же модуля dpapi. У этой функции одна обязательная опция — /in, после которой нужно указать данные для расшифровки. Для расшифровки также нужно указать опцию /unprotect, в противном случае будет только показана информация о blob (зашифрованных данных) без их расшифровки:

dpapi::blob /in:crypted.txt /unprotect

Вы можете увидеть на экране исходную строку.

Если вы хотите, чтобы расшифрованные данные сохранились в файл, то используйте опцию /out.


Как расшифровать файлы DPAPI на другом компьютере

Что произойдёт, если я перенесу файл crypted.txt на другой компьютер и попытаюсь его расшифровать этой же командой? Давайте попробуем:

А на другом компьютере расшифровка завершилась неудачей и выведена ошибка:

 * using CryptUnprotectData API
ERROR kuhl_m_dpapi_unprotect_raw_or_blob ; NTE_BAD_KEY_STATE, needed Masterkey is: {ac45381a-d9db-4c68-b0e9-7410667c3984}

В этой ошибке сказано, что нужен мастер ключ ac45381a-d9db-4c68-b0e9-7410667c3984.

Строка ac45381a-d9db-4c68-b0e9-7410667c398 является хешем мастер ключа. Можно сказать, что это идентификатор или отпечаток ключа. На исходном компьютере, где шифровались данные, их расшифровка проходит легко и непринуждённо. А попытки расшифровать эти данные не имея мастер ключа, завершаются неудачей. То есть нам нужно указать мастер ключ с первого компьютера — причём не любой мастер ключ (у каждого пользователя их может быть много), а именно тот, которым шифровались данные.

Я уже извлёк нужный мастер ключ, поэтому укажу его с помощи опции /masterkey и вновь запущу команду расшифровки на другом компьютере:

dpapi::blob /in:crypted.txt /unprotect /masterkey:5dccd3bea06a52d4355fa6b03421845c9fe96277db0d5af1a24eb3daefb14d6fc66b386a3a235a29327d0dc1f7ca990389644af173893d4cf3392b3950953dd8

В этот раз всё прошло удачно:

Как узнать мастер ключи Windows

В mimikatz есть функция, которая извлекает все мастер ключи для текущего пользователя. Но прежде чем перейти к ней, давайте «пощупаем» сами мастер ключи, чтобы они не были для нас чем-то абстрактными.

В расшифрованном виде пример мастер ключа выглядит так: 5dccd3bea06a52d4355fa6b03421845c9fe96277db0d5af1a24eb3daefb14d6fc66b386a3a235a29327d0dc1f7ca990389644af173893d4cf3392b3950953dd8

Зашифрованные мастер ключи хранятся в папке вида %appdata%\Microsoft\Protect\{sid}\*. В этой записи:

  • %appdata% означает C:\Users\<ПОЛЬЗОВАТЕЛЬ>\AppData\Roaming
  • {sid} означает SID пользователя

В CMD (Win+r → набрать cmd) свой SID можно посмотреть командой:

wmic useraccount where name="%USERNAME%" get sid

Предыдущая команда не сработает в PowerShell. Следующие команды сработают как в CMD, так и в PowerShell.

Чтобы узнать свой SID:

whoami /user

Чтобы узнать SID всех пользователей:


wmic useraccount get name,sid

Зашифрованные файлы мастер ключей на жёстком диске:

Функция dpapi::masterkey умеет расшифровывать мастер ключи. Если использовать эту функцию только с опцией /in, после которой указать путь до мастер ключа, то будет выведена информация о нём без его расшифровки:

dpapi::masterkey /in:"%appdata%\Microsoft\Protect\S-1-5-21-4099021954-1290662600-116018068-1001\ac45381a-d9db-4c68-b0e9-7410667c3984"

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

Для того, чтобы извлечь сразу все мастер ключи текущего пользователя выполните команду:

sekurlsa::dpapi

Мастер ключи в этой секции:

Authentication Id : 0 ; 371163 (00000000:0005a9db)
Session           : Interactive from 1
User Name         : MiAl
Domain            : HACKWARE-MIAL
Logon Server      : HACKWARE-MIAL
Logon Time        : 25.02.2020 13:25:54
SID               : S-1-5-21-4099021954-1290662600-116018068-1001
         [00000000]
         * GUID      :  {abd3abfe-f620-46e4-a5ee-8dc314ef4169}
         * Time      :  25.02.2020 18:34:11
         * MasterKey :  450e3e2609e394dfef60c90533a06ddd84dc9968965bd8579a3c40607704077e506c8d0738e6f42cfd934b3eb75eedc3c29fe7deb8dd0cf05ddb4deb653fcbff
         * sha1(key) :  806d3a6453a45b9b4eb3e8edafc9dd4b12c0d494
         [00000001]
         * GUID      :  {ac45381a-d9db-4c68-b0e9-7410667c3984}
         * Time      :  25.02.2020 18:26:00
         * MasterKey :  5dccd3bea06a52d4355fa6b03421845c9fe96277db0d5af1a24eb3daefb14d6fc66b386a3a235a29327d0dc1f7ca990389644af173893d4cf3392b3950953dd8
         * sha1(key) :  d5a7975eea70b6fe5eae3809ed3c7e9c864d1333

GUID — это идентификатор, имя файла мастер ключа. MasterKey — сам мастер ключ.

Для удобства, mimikatz хранит кэш извлечённых мастер ключей. Причём не просто хранит и показывает их, но и использует нужный мастер ключ в том случае, если он нужен для определённых операций. Чтобы посмотреть содержимое кэша выполните команду:

dpapi::cache

Извлечённые мастер ключи, то есть кэш, можно сохранить для использования на другой машине или в другой раз.


Как сохранить и использовать мастер ключи

Для сохранения кэша используйте опции /save и /file:ФАЙЛ:

dpapi::cache /save /file:cache.bin

Если не указать /file, то по умолчанию данные будут сохранены в файл mimikatz_dpapi_cache.ndr.


Для загрузки кэша используйте опции /load и /file:ФАЙЛ:

dpapi::cache /load /file:cache.bin

CREDHIST

Этот файл размещён по пути "%appdata%\Microsoft\Protect\CREDHIST", он полезен только для контекста не-домен. Этот файл:

  • содержит: предыдущие зашифрованные учётные данные пользователя (SHA1 и NTLM)
  • используется для: расшифровки мастер ключей
  • защищён: хешем SHA1 самого последнего пользовательского пароля, используемого пользователем на этой системе
  • каждый пункт защищён предыдущим ключом и т.д.

Чтобы просмотреть свойства этого файла выполните команду:

dpapi::credhist /in:"%appdata%\Microsoft\Protect\CREDHIST"

Пример вывода:

**CREDHIST**
  dwVersion : 00000001 - 1
  guid      : {86cddf31-2b68-42fb-a6e6-28b628228fc8}
  dwNextLen : 00000000 - 0

Я пытался расшифровать этот файл в mimikatz командой:

dpapi::credhist /in:"Z:\files\CREDHIST" "/password:qweqwe123" /sid:S-1-5-21-4099021954-1290662600-116018068-1003

но у меня ничего не получилось. Если знаете как его расшифровать, то пишите в комментариях.

Как извлечь все пароли из Google Chome

В mimikatz с помощью команды dpapi::chrome можно извлечь все пароли текущего пользователя. Нужно указать опцию /in с путём до файла, где хранятся учётные данные. Этим файлом является "%localappdata%\Google\Chrome\User Data\Default\Login Data". Кстати, этот файл представляет собой SQLite базу данных, в которой все данные, кроме паролей (то есть адреса сайтов, например), хранятся в открытом виде. А пароли зашифрованы с помощью DPAPI. Для расшифровки также укажите флаг /unprotect:

dpapi::chrome /in:"%localappdata%\Google\Chrome\User Data\Default\Login Data" /unprotect

Как извлечь все кукиз из Google Chome

Google Chome хранит кукиз в файле "%localappdata%\Google\Chrome\User Data\Default\Cookies". Как и с паролями для сайтов, все данные, кроме значений кукиз, хранятся в открытом виде. Для извлечения всех имён и значений кукиз выполните команду:

dpapi::chrome /in:"%localappdata%\Google\Chrome\User Data\Default\Cookies" /unprotect

Как извлечь Wi-Fi пароли из Windows

В Windows пароли Wi-Fi можно извлечь и без mimikatz, пример команд:

netsh wlan export profile interface="Беспроводная сеть" key=clear folder=c:\
netsh wlan export profile interface="*" key=clear folder=c:\

Чтобы данный метод сработал, Wi-Fi карта должна быть подключена.

Минус этого способа в том, что он не работает для выключенного компьютера, с которого можно скопировать файлы.

В mimikatz есть специальные команды dpapi::wifi и dpapi::wwan для извлечения паролей, соответственно, из сохранённых Wi-Fi и WWAN подключений.

Пароли Wi-Fi хранятся в файлах вида:

  • C:\ProgramData\Microsoft\Wlansvc\Profiles\Interfaces\{interface guid}\*.xml

А пароли WWAN в файлах вида:

  • C:\ProgramData\Microsoft\Wlansvc\Profiles\{interface guid}\*.xml

Начать нужно с получения мастер ключей. Поскольку я выполняю команды на локальной машине, то я расшифровываю мастер ключи командой:

sekurlsa::dpapi

Я нашёл на локальной машине два сетевых интерфейса, в каждом из которых по одному профилю Wi-Fi подключения:

  • C:\ProgramData\Microsoft\Wlansvc\Profiles\Interfaces\{24FF5798-6078-4148-96B5-75191CCEA209}\{0C67E040-68A8-42A4-B870-8B5AA5E4823B}.xml
  • C:\ProgramData\Microsoft\Wlansvc\Profiles\Interfaces\{C623DA26-72C0-4DD6-99B1-6E2C2D06E8C5}\{A372AA08-55B8-4A66-A349-EAAB48580E0A}.xml

Для извлечения Wi-Fi паролей я запускаю команды:

dpapi::wifi /in:"C:\ProgramData\Microsoft\Wlansvc\Profiles\Interfaces\{24FF5798-6078-4148-96B5-75191CCEA209}\{0C67E040-68A8-42A4-B870-8B5AA5E4823B}.xml"

Пароль в строке «Key Material :».

dpapi::wifi /in:"C:\ProgramData\Microsoft\Wlansvc\Profiles\Interfaces\{C623DA26-72C0-4DD6-99B1-6E2C2D06E8C5}\{A372AA08-55B8-4A66-A349-EAAB48580E0A}.xml" /unprotect

Если мастер ключ отсутствует в кэше mimikatz, то его можно явно указать опцией /masterkey.

Как извлечь пароли Google Chrome с другого компьютера

1. Для расшифровки файла %localappdata%\Google\Chrome\User Data\Default\Login Data понадобится мастер ключ, которым зашифрованы пароли в этом файле.

2. Для расшифровки мастер ключа понадобится пароль пользователя Windows для входа в систему и зашифрованный файл мастер ключа, то есть файлы %appdata%\Microsoft\Protect\{sid}\*.

3. Для взлома пароля пользователя Windows понадобится NTLM хеш.

4. Для извлечения хеша NTLM понадобятся ИЛИ файлы реестра C:/Windows/System32/config/SAM и C:/Windows/System32/config/SYSTEM, ИЛИ дамп lsass.DMP. Причём предпочтительнее именно дамп, т. к. из него можно извлечь хеш SHA1 и этот хеш можно использовать напрямую для расшифровки мастер ключа, минуя брут-форс пароля. Способы получения NTLM хеша описаны в статье «Как взломать пароль Windows»:

lsadump::sam /system:C:\путь\до\SYSTEM /sam:C:\путь\до\SAM

5. Затем для получения мастер ключа офлайн нужно запустить команду вида:

dpapi::masterkey /in:"путь\до\зашифрованного\мастер_ключа" "/password:пароль_целевого_пользователя" /sid:SID_целевого_пользователя

SID можно взять из имени папки до зашифрованного мастер ключа.

Пример команды:

dpapi::masterkey /in:"Z:\files\1f89c852-1c9d-47f9-81f8-b18be7c11512" "/password:qweqwe123" /sid:S-1-5-21-4099021954-1290662600-116018068-1003

При успешном выполнении в конце будет выведено примерно следующее:

[masterkey] with volatile cache: SID:S-1-5-21-4099021954-1290662600-116018068-1003;GUID:{1bd91e0f-25f3-49e9-a370-bc68d1f0d272};MD4:ca76a176340f0291e1cc8ea7277fc571;SHA1:886d0f341f3c29030ec855334a08e52868c06c69;
  key : 89e43af0a178c2f1c7311c028dd75e2d2489fc78a3df92808094b1671785d6fd7f107ec562320bcaa8563be759abbf60bf70791107c5240cda2cfddcb003df19
  sha1: b73d4d8cbbdafa960e49ca480559a4b530e65f05

Самая главная строка начинается с key — это и есть расшифрованный мастер ключ.

Также мастер ключ будет помещён в кэш.

6. Наконце для офлайн расшифровки паролей браузера Google Chrome выполните команду вида:

dpapi::chrome /in:"ПУТЬ\ДО\Login Data" /unprotect /masterkey:МАСТЕР_КЛЮЧ

Если мастер ключ уже в кэше, то можно пропустить опцию /masterkey.

Где Windows хранит пароли

Здесь собраны пути до файлов, которые зашифрованы с использованием DPAPI. Если что-то пропущено, то пишите в комментариях со ссылкой на источник.

Сводная таблица от автора mimikatz (очень тяжёлая для восприятия): https://onedrive.live.com/redir?resid=A352EBC5934F0254!3104&authkey=!ACGFg7R-U5xkTh4&ithint=file%2cxlsx

Пароли Wi-Fi хранятся в файлах вида:

  • C:\ProgramData\Microsoft\Wlansvc\Profiles\Interfaces\{interface guid}\*.xml

А пароли WWAN в файлах вида:

  • C:\ProgramData\Microsoft\Wlansvc\Profiles\{interface guid}\*.xml

Кукиз Google Chrome в файле:

  • %localappdata%\Google\Chrome\User Data\Default\Cookies

Пароли от веб сайтов в Google Chrome:

  • %localappdata%\Google\Chrome\User Data\Default\Login Data

Здесь %localappdata% в большинстве систем означает «C:\Users\<ПОЛЬЗОВАТЕЛЬ>\AppData\Local».

Зашифрованные мастер ключи хранятся в папке вида %appdata%\Microsoft\Protect\{sid}\*. В этой записи:

  • %appdata% означает C:\Users\<ПОЛЬЗОВАТЕЛЬ>\AppData\Roaming
  • {sid} означает SID пользователя

Системные мастер ключи:

  • c:\Windows\System32\Microsoft\Protect\*

Пользовательские сертификаты:

  • %APPDATA%\Microsoft\SystemCertificates\My\Certificates\
  • %APPDATA%\Microsoft\Crypto\RSA\<SID>\

Системные сертификаты:

  • HKLM:\SOFTWARE\Microsoft\SystemCertificates\MY\Certificates\*
  • C:\Programdata\Microsoft\Crypto\RSA\MachineKeys\

Dropbox

  • HKCU\SOFTWARE\Dropbox\ks
  • HKCU\SOFTWARE\Dropbox\ks1
  • %APPDATA%\Local\Dropbox\instance1\config.dbx
  • %APPDATA%\Local\Dropbox\instance_db\instanse.dbx

Rsa securid:

  • %LOCALAPPDATA%\RSA\SecurIDStorage

Заключение

Как и первая статья, в этой раскрыты далеко не все возможности mimikatz. Больше информации вы найдёте в документации по модулям и командам этой программы: https://kali.tools/?p=5342, хотя ещё не всё документировано. К примеру, даже в модуле DPAPI мы не рассмотрели следующие команды, предназначенные для извлечения паролей из Windows:

  • capi
  • cng
  • cred
  • vault
  • ssh
  • rdg
  • ps
  • luna

Литература

Используемая для подготовки данной статьи литература:


Рекомендуется Вам:

7 комментариев to Расшифровка хранимых в Windows паролей с помощью mimikatz и DPAPI

  1. Сергей:

    А как узнать мастер-ключ, если знаешь sha1 хэш, а не пароль пользователя?

    • Alexey:

      А у вас sha1 хеш пароля или всё-таки sha1 хеш мастер ключа? Что-то мне подсказывает, что у вас именно второе.

      Если у вас только sha1 хеш мастер ключа и нет самого зашифрованного мастер ключа, то никак.

      • Kiril:

        sha1 именно учётки взят из lsass.DMP
        Получается вместо пароля просто вставить его ?

        • Alexey:

          Для команды dpapi::masterkey есть опция /hash. Видимо, это именно то, что вам нужно.

          • petro:

            Для команды dpapi::masterkey есть опция /hash. Видимо, это именно то, что вам нужно.

             

            Кажется нет там такой команды, есть sha1 из lsass.dmp, ввожу:

            mimikatz # dpapi::masterkey /hash 75e818e9a8e605cae00d0fc496d99de8f87ee48c
            ERROR kuhl_m_dpapi_masterkey ; Input masterkeys file needed (/in:file)

             

             

            • Alexey:

              Почему вы пишите что нет такой команды, если в сообщении совершенно однозначно написано, что ошибка вызвана отсутствием входного файла мастерключей?

  2. Илья:

    Добрый день.
    На другой компьютер перенесены данные  пользователя включая директории и поддиректории Appdata. В том числе файл паролей Chrome. Реально ли на другой компьютере восстановить пароли(пароль)? Так как отображается пароль в виде Blob значений.
    Спасибо

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *