Home > Information > Forum > Show Topic
Show thread topic
01.03.2024
New blog post
Dumping the history of users' IP addresses in Windows
20.02.2024
Reset Windows Password v14.1
IP addresses history viewer, fast disk search, local security editor and some more
02.01.2024
Wireless Password Recovery v6.9.0
A revision of the GPU health monitor along with some minor updates
23.12.2023
HAPPY NEW YEAR!
Happy New Year greetings and holidays discount

Articles and video

You may find it helpful to read our articles on Windows security and password recovery examples. Video section contains a number of movies about our programs in action

DPAPI

RCAPDART, 21:20:17 05.04.2012 Rating: 0 #1

DPAPI  

 Здравствуйте. Крайне восхищен Вашей статьей "Секреты DPAPI". Проделана колоссальная работа. Но есть вопрос, на который я не нашел нигде ответа. 
При шифровании мастер-ключа используется шифр, полученный с помощью алгоритма PBKDF2, в который в качестве входных данных используется кэш пароля из LSA. А если пароля нет? Не может же быть, что мастер-ключ не шифруется. Как в таком случае поступает система?

PS извините, если не в ту ветку форума. Заранее благодарю!
 
Passcape_Admin, 18:19:27 06.04.2012 Rating: 1 #2

RE: DPAPI  

Спасибо за столь лестные слова, работа и вправду была проделана титаническая. Увы, но стиль изложения оставляет желать лучшего, тем не менее надеюсь, многим пригодятся мои выкладки.

Что касается Вашего вопроса... Мастер ключ шифруется всегда и этот случай (когда пароль пользователя пустой), разработчики DPAPI предусмотрели. На самом деле, в алгоритме шифрования Мастер Ключа принимает участие не только логон пароль пользователя, но и его описатель безопасности (SID). Описатель безопасности уникален и присваивается каждой учетной записи. Таким образом, даже если пароль пользователя пустой, на выходе из PBKDF2 будет уникальный ключ, поскольку на вход подается как пароль, так и SID пользователя.

Не знаю, почему в статье я упустил этот важный момент, молодец, что спросили. На самом деле, алгоритм шифрования Мастер Ключа даже немного сложнее. Если разбить его по шагам, то получится вот такая последовательность действий:
1 - Берем кэш пароля пользователя из LSA (если его нет, то предварительно создаем его)
2 - Берем SID пользователя (юникодная строка)
3 - Скармливаем их в функцию ShaHmacParam, в которой они перемешиваются и хэшируются. На выходе получаем ключ шифрования для PBKDF2.
4 - кроме того в PBKDF2 идет также 16 байт уникальных данных из файла Мастер Ключа (т.е. соль).
5 - И уже этот перемешанный ключ используется в блочном шифре для шифрования/расшифровки непосредственно самого Мастер Ключа.

Вот такой вот запутанный на первый взгляд, но довольно эффективный алгоритм. На самом деле, он даже еще сложнее, посколько сами алгоритмы шифрования (RC4, DES, AES, MD4, SHA  и т.д.) определяются как настройками Мастер Ключа, так и настройками системы. А для учетной записи SYSTEM в качестве логон пароля используется LSA секрет, который хранится в зашифрованном виде в файле SECURITY.

Вот теперь все, описание полное. Спрашивайте, если появятся еще какие-нибудь вопросы.
 
RCAPDART, 23:51:55 06.04.2012 Rating: 0 #3

RE: DPAPI  

 Спасибо за ответ! Система действительно вызывает уважение :)
Информации на данную тему критически мало.
Получается, что в HMAC мы "кормим" только SID и кэш пароля? А как же pHMACKey, который помещается в DPAPI-BLOB?

Кстати Вам можно пополнить набор програм - программой для восстановления паролей из Google Chrome. Там как раз используется DPAPI. Именно с этого я и начал изучение.
Я писал статью на хабре на эту тему, но тогда основная цель была именно вытащить пароли из хрома, а не узнавать, как он их шифрует. Был тогда ещё совсем глупым по этим вопросам.
Найденный в интернете класс очень помог. А вот после этого уже начал изучать Вашу статью. Спокойно, неспеша, пополняя знания по ходу дела вещами, которые не знал.

PS Ещё раз спасибо за ответы. В остальном - вроде всё понятно. А статью можно (наверное и нужно) дополнить. В конце-концов это на данный момент единственный источник информации о DPAPI :)

PPS Выходит, что схема шифрования выглядит следующим образом?

PPPS Под ShaHmacParam Вы имели в виду HMACSHA512? Разве он мешает, или просто все входные данные собираются в один длинный байтовый массив?
 
Passcape_Admin, 15:42:31 07.04.2012 Rating: 0 #4

RE: DPAPI  

quote:
Получается, что в HMAC мы 'кормим' только SID и кэш пароля? А как же pHMACKey, который помещается в DPAPI-BLOB?

A pHMACKey, который хранится в блобе, это уже совсем другая история. Он нужен для расшифровки самого DPAPI блоба. Если можно так выразиться, система шифрования в DPAPI двухступенчатая. На первом этапе расшифровывается Мастер Ключ пользователя (см. 5 шагов, которые я описал выше). Второй этап - это непосредственно расшифровка DPAPI блоба с помощью расшифрованного Мастер Ключа. Чтобы каждый раз не расшифровывать Мастер Ключ заново, он кэшируется в системе пока жива учетная запись пользователя.

quote:
Кстати Вам можно пополнить набор програм - программой для восстановления паролей из Google Chrome. Там как раз используется DPAPI. Именно с этого я и начал изучение.

Самое смешное, что такая программа уже давно есть. Правда она работает в консольном режиме. Просто, чтобы сделать полноценный продукт, банально не хватает времени. В программе WPR есть интересная утилита, которая создает словарь из найденых системных паролей, паролей почтовых клиентов, браузеров включая IE, opera, firefox, chrome, safari и т.д. Но оформить все это отдельными утилитами пока не удается.

quote:
Я писал статью на хабре на эту тему, но тогда основная цель была именно вытащить пароли из хрома, а не узнавать, как он их шифрует.

Прочитал комментарии к Вашей статье и вижу, что люди очень интересуются не только системой шифрования в браузерах, но по большей части их сравнительными характеристиками в плане безопасности хранения паролей. Давно хотел написать такую статью, в которой бы сравнивались системы и алгоритмы шифрования. Думаю, Chrome там был бы на последнем месте :) Но вот первое, скорее всего, отдал бы IE. Правда с выходом последней 10 версии, может и нет.

quote:
Выходит, что схема шифрования выглядит следующим образом?

Я бы нарисовал по-другому, разделив на две картинки: первая - это расшифровка Мастер Ключа, вторая - шифрование пароля в DPAPI блоб. Еще момент: пароль пользователя параметр обязательный, если его нет - хэшируется пустая строка. HMACKEY это название энтропии (соли) в алгоритме шифровании блоба и на первом этапе не используется. Но в целом, все верно.

quote:
Под ShaHmacParam Вы имели в виду HMACSHA512? Разве он мешает, или просто все входные данные собираются в один длинный байтовый массив?

Нет, классический HMACSHA (256 битный). Данные, конечно, не перемешиваются. Я неправильно выразился, имя в виду, что этот алгоритм дополнительно XOR-ит входные данные. Получается из двух дводящих параметров один выходной ключ.
 
RCAPDART, 00:38:34 08.04.2012 Rating: 0 #5

RE: DPAPI  

 Ещё раз спасибо большущее за информацию! Всё, вроде, встало на свои места. Если я понял правильно, то там, где у меня написано "ПЕРЕМЕШКА" - там HMAC, куда и подставляется HMACKey. Только остается вопрос, зачем нужен HMACKey2. Простите, что замучал совсем вопросами...

PS Это нормально, что мне предлогается редактировать не только свои посты, но и Ваши?
 
Passcape_Admin, 10:45:21 08.04.2012 Rating: 0 #6

RE: DPAPI  

 Не помню детали, нет под рукой исходников. Но при расшифровке данных с уже готовым Мастер Ключом смысл вот к чему сводится:
- сначала формируется ключ шифрования блоба. Для этого Microsoft применяет свой алгоритм, похожий на HMAC. Отличие от последнего в том, что на вход подаются не два, а три параметpа: расшифрованный Мастер Ключ, pHmacKey (эти данные находятся в блобе) и опциональная энтропия, которая задается через функцию CryptProtectData.
- создается материал для проверки целостности данных. Для этого аналогично отрабатывается HMAC подобная функция, на входе в которую подается Мастер Ключ, pHmacKey2 и нерасшифрованные данные всего блоба. На выходе получается хэш (длина зависит от алгоритма, применяемого в блобе), который должен совпадать с аналогичным слотом в блобе.
- если все нормально, расшифровываются данные, содержащиеся в блобе

Вот теперь так.

Насчет форума я посмотрю, немного он криво сделан.
 
RCAPDART, 19:14:18 09.04.2012 Rating: 0 #7

RE: DPAPI  

Большое спасибо за столь подробные ответы. Теперь всё понял! Ещё раз отдельно хочу поблагодарить за статью. Без неё так бы и прошла столь интересная вещь мимо меня :)
 
Passcape_Admin, 09:40:48 10.04.2012 Rating: 0 #8

RE: DPAPI  

Всегда пожалуйста. Спрашивайте, если в дальнейшем возникнут к.л. вопросы.

Кстати, могу подкинуть Вам еще одну интересную тему для статьи: Windows Vault (система шифрования и хранения персональных данных). Публикаций по ней не найти вообще. Похоже, что в Windows 8, большинство паролей будет храниться в этой системе. Там есть очень много интересных моментов. Например, несмотря на то, что в  Windows 7 Vault не используется (а скорее обкатывается), большинство структур Windows Vault из Windows 7 не совместимы с аналогичными в Windows 8. Или, например, пароли Internet Explorer 10 в Windows 8 теперь будут храниться именно в Vault. Причем, в текстовом виде. По крайней мере, в бета версии Windows 8.
 
RCAPDART, 11:16:54 10.04.2012 Rating: 0 #9

RE: DPAPI  

Был бы очень благодарен!
Вы всё это методом обратной разработки узнаете?
Vault будет идти в замену DPAPI, а DPAPI оставят в целях обратной совместимости, или же они работают сообща?
Насчет статьи - тут я скорее изучаю для себя, а статью публиковать буду исключительно с Вашего согласия и с ссылками на Ваш сайт, ибо моей работы тут нет. :)
 
Passcape_Admin, 11:40:23 10.04.2012 Rating: 0 #10

RE: DPAPI  

Эх, да только материала по Vault совсем пока нет, есть только начало работы - программа, которая выдает список кошельков Vault и их паролей, если это возможно. Сейчас я Вам напишу по почте.

Vault не идет на замену DPAPI, по крайней мере пока, я так думаю. Скорее наоборот, дополняет. Если DPAPI это система шифрования данных, то Vault, скорее, система их хранения. При этом он использует DPAPI. Вообще, я еще не разбирался с этой системой, пока на это нет времени.
 
kleo148, 15:40:53 16.08.2012 Rating: 0 #11

DPAPI  

 Добрый день, очень интересная статья! огромное спасибо автору! Однако я не очень разобралась с алгоритмами хэширования применяемыми в Windows 7, для Win XP все просто - везде SHA-1. 

Для получения входных данных для ф-и PBKDF2, как Вы писали выше: 
"1 - Берем кэш пароля пользователя из LSA (если его нет, то предварительно создаем его)
2 - Берем SID пользователя (юникодная строка)
3 - Скармливаем их в функцию ShaHmacParam, в которой они перемешиваются и хэшируются. На выходе получаем ключ шифрования для PBKDF2."

Используется именно пароль? Или его хэш в SHA-512? Это я не совсем понимаю.. А также в ф-и PBKDF2 используется SHA-1, как и в стандарте или SHA-512? Все вопросы касаются Windows 7. 
 
Passcape_Admin, 19:53:41 16.08.2012 Rating: 0 #12

RE: DPAPI  

Добрый день, уважаемая Клео.

Постараюсь ответить по пунктам, которые я описал ранее...

1. Если быть точнее, то берется 20 байтный хэш от пароля, который создается при помощи SHA1.
2.
3. В ShaHmacParam используется этот 20 байтный хэш и алгоритм SHA1. В Windows 7 в функции PBKDF2 уже используется SHA512.
4.
5. Соответственно, блочный шифр в Windows 7 тоже изменился на AES256 (был 3DES в Windows XP).

 
kleo148, 14:02:17 17.08.2012 Rating: 0 #13

RE: DPAPI  

Огромное спасибо, так уже намного понятнее, однако выше RCAPDART уже уточнял про ShaHmacParam:

"Под ShaHmacParam Вы имели в виду HMACSHA512? Разве он мешает, или просто все входные данные собираются в один длинный байтовый массив?

Нет, классический HMACSHA (256 битный). Данные, конечно, не перемешиваются. Я неправильно выразился, имя в виду, что этот алгоритм дополнительно XOR-ит входные данные. Получается из двух дводящих параметров один выходной ключ."

Так получается, что в Windows 7, используется SHA-1 или таки SHA-256? 
 
Passcape_Admin, 17:31:14 17.08.2012 Rating: 0 #14

RE: DPAPI  

И в Windows XP, и в Windows 7 используется SHA-1 (160 бит). Прошу прошения, что ввел в заблуждение. Не глянув на исходники, сам уже начинаю путаться.

Таким образом, вот финальная схема работы алгоритма шифрования мастер ключа для Windows 7.
1. Получаем хэш пароля пользователя: hash=SHA1(password)
где password - текстовый пароль в формате юникод
2. Вычисляем ключ шифрования пользователя user_enc_key=SHA1_HMAC(hash,sid)
где sid - текстовый идентификатор пользователя в формате юникод
3. Вычисляем ключ шифрования мастер ключа mk_enc_key=SHA512_PBKDF2(user_enc_key,salt,counter)
где salt - соль мастер ключа
counter - счетчик итераций в алгоритме PBKDF2
4. mk_enc_key (256 бит) используется в блочном шифре AES256 для шифрования или расшифровки мастер ключа. Кстати, размер мастер ключа составляет 512 бит или 64 байта.
 
alex45, 18:06:04 21.08.2012 Rating: 0 #15

DPAPI  

Доброго времени суток! очень понравилась ваша статья, решил все разложить для себя по полочкам. и вопрос в продолжении дискуссии:) В блобе есть поле соли. на windows 7 это поле 256 битное. при работе AES CBC используется соль 128 битная. Как происходит свертка соли той что в блобе к нужному размеру? ведь соль большего размера не может быть обработа.

Заранее большое  спасибо за ответ!
 
Passcape_Admin, 18:33:18 21.08.2012 Rating: 0 #16

RE: DPAPI  

Добрый день,

Размер соли нефиксированный. Этот размер задается алгоритмом шифрования при создании блоба (функция CryptSetKeyParam). В Win7 по умолчанию используется AES-256 с размером соли 128 бит. Могу привести соответствующую функцию использования и проверки размера соли при расшифровке блоба:

BOOL CDpapiBlob::SetSalt(HCRYPTKEY hKey, LPBYTE pSalt, DWORD dwSaltLength)
{
DWORD dwDataLength;

if ( !pSalt || !dwSaltLength )
return TRUE;

if ( !CryptGetKeyParam(hKey,KP_SALT,NULL,&dwDataLength,0) )
return FALSE;

if ( dwDataLength!=dwSaltLength )
return FALSE;

return CryptSetKeyParam(hKey,KP_SALT,pSalt,0);
}

Точно не знаю, но по-моему CryptGetKeyParam просто отбрасывает ненужные биты.
 
vladimir, 18:12:30 11.05.2013 Rating: 0 #17

RE: DPAPI  

Здравствуйте!
А что насчет формата файла с Мастер-ключом и формата BLOB-ов? Меняется ли он от версии к версии Windows? Если да, то являются ли форматы совместимыми?
Спасибо!
 
IvanO, 21:07:48 11.05.2013 Rating: 0 #18

RE: DPAPI  

Здравствуйте.
Сам формат мастер ключа не меняется уже много лет. Первая версия содержала довольно много критических ошибок, благодаря которым можно было расшифровывать DPAPI блобы даже не зная пароля пользователя. Не помню точно, кажется в 4 сервис паке Win2K формат был обновлен. Благодаря тому, что разработчики потрудились на славу и хорошо продумали структуру мастер ключа, эта вторая версия (см. поле dwVersion) используется до сих пор. Формат не меняется, но с выходом очередной версии Windows, меняются алгоритмы шифрования и хэширования, счетчик итераций pbkdf2 и т.д., что очень важно, т.к. находятся дыры в старых алгоритмах, растет быстродействие компьютеров и видеокарт.
 
mc, 21:14:03 12.07.2013 Rating: 0 #19

RE: RE: DPAPI  

Passcape_Admin quote:
И в Windows XP, и в Windows 7 используется SHA-1 (160 бит). Прошу прошения, что ввел в заблуждение. Не глянув на исходники, сам уже начинаю путаться.

Таким образом, вот финальная схема работы алгоритма шифрования мастер ключа для Windows 7.
1. Получаем хэш пароля пользователя: hash=SHA1(password)
где password - текстовый пароль в формате юникод
2. Вычисляем ключ шифрования пользователя user_enc_key=SHA1_HMAC(hash,sid)
где sid - текстовый идентификатор пользователя в формате юникод
3. Вычисляем ключ шифрования мастер ключа mk_enc_key=SHA512_PBKDF2(user_enc_key,salt,counter)
где salt - соль мастер ключа
counter - счетчик итераций в алгоритме PBKDF2
4. mk_enc_key (256 бит) используется в блочном шифре AES256 для шифрования или расшифровки мастер ключа. Кстати, размер мастер ключа составляет 512 бит или 64 байта.
 

Sorry to resurrect this old posting, but I had a question about the process. Also, sorry for switching to English. I don't speak Russian but was able to follow the thread using google translate.

It seems something is still missing. Where do you get the IV for AES 256 decryption, and what is the mode?
 
Passcape_Admin, 08:54:46 13.07.2013 Rating: 0 #20

RE: DPAPI  

IV for AES 256 is generated at step 3. The first 0x20 bytes of the generated data is used as a key for AES256, and 0x10 bytes starting with offset 0x20 is used as IV. AES256 CBC is used.
 
mc, 15:20:41 13.07.2013 Rating: 0 #21

RE: DPAPI  

Thank you very much. That is what I had guessed. Your article and these forum postings have been very informative. In trying to understand the process, I wrote some c# code to do the master key file decryption, and I don't believe it is working properly. Are any of the crypto primitives different from standard? Is there any way to check whether the decryption was successful?
 
Passcape_Admin, 20:25:11 13.07.2013 Rating: 0 #22

RE: DPAPI  

As far as I know Windows 7, unlike previous OSes, use BCRYPT APIs in the encryption/decryption process. So there should be no problems, I guess. However in order to keep a backward compatibility and make your code fully compatible with older versions, you should write your own implementation for DES, RC4 and SHA algorithms.
 
mc, 20:53:22 13.07.2013 Rating: 0 #23

RE: RE: DPAPI  

Thanks for the suggestions. I don't plan on implementing the whole thing (that is what we have WPR for). This is more just an exercise in understanding. 

Thanks for the help! I am definitely starting to understand DPAPI much better.
 
mc, 18:26:02 26.07.2013 Rating: 0 #24

RE: DPAPI  

Okay, so I've coded everything up to help me understand the Windows 7 process. I parse the master key file according to your other writeup. The header I parse gives the same info as WPR. I parse the user master key, and get the proper header data and ciphertext. I then decrypt using the process you've outlined. What is the format of the decrypted data? Is there any way to check the decrypted data to make sure it is correct?

Your writeups have been very helpful and informative. Thank you!
 
Passcape_Admin, 22:08:50 28.07.2013 Rating: 0 #25

RE: DPAPI  

Well the decoded data is a raw binary 512-bit key. Unfortunately, I have no access to source code, but as far as I can remember, the decrypted data contains a hmac signature to check the key with. However even though it is not recommended, you can simply bypass the check for validity and try to directly decrypt a DPAPI blob. Successful decryption guarantees the key is correct.
 
mc, 20:25:39 01.08.2013 Rating: 0 #26

RE: RE: DPAPI  

Is the blob decryption process detailed anywhere on the site? In other words, once I have a possible 512 bit key, what do I do with it to decrypt the blob?
 
Passcape_Admin, 16:48:49 02.08.2013 Rating: 0 #27

RE: DPAPI  

DPAPI offline blob decryption algorithm is much more difficult than Master Key one. Even though it is not outlined in details, you can get some usefull info out of our article about DPAPI offline recovery (see blog section). It is also available in English.
 
Entries 1 to 27 from 27  [ <<  1  >> ]