Онзи ден трябваше да внедря декриптиране на база данни KeePass. Бях поразен от факта, че няма нито един документ и нито една статия с изчерпателна информация за алгоритъма за декриптиране на .kdb и .kdbx файлове, като се вземат предвид всички нюанси. Това ме подтикна да напиша тази статия.
Структурата на файла с базата данни KeePass (.kdb, .kdbx) се състои от 3 части:
Подпис (не е криптиран);
Заглавие (не е криптирано);
Данни (криптирани).
Дешифриране на базата данни KeePass
Секвениране:
Четене на подписа на базата данни.
Четене на заглавката на базата данни.
Ние генерираме главен ключ.
Дешифриране на базата данни.
Проверка на целостта на данните.
Ако файлът е бил компресиран, декомпресирайте го.
Ние дешифрираме пароли.
Точки 5, 6 и 7 се отнасят само за .kdbx файлове!
Подпис
BaseSignature (4 байта)
Първият подпис е един и същ за .kdb и .kdbx файлове. Тя казва това даден файле база данни KeePass:
0x9AA2D903
VersionSignature (4 байта)
Вторият подпис показва версията на KeePass и следователно е различен за .kdb и .kdbx файлове:
0xB54BFB65 - KeePass 1.x (.kdb файл).
0xB54BFB66 - KeePass 2.x предварителна версия (.kdbx файл).
0xB54BFB67 - KeePass 2.x след издаване (.kdbx файл).
FileVersion (4 байта)
Третият подпис е само за .kdbx файлове и съдържа версията на файла. За .kdb файлове тази информациясъдържащи се в заглавката на базата данни.
Така в KeePass 1.x дължината на подписа е 8 байта, а в KeePass 2.x е 12 байта..
заглавка
След като базата данни е подписана, започва заглавката.
Заглавка на KeePass 1.x
Заглавката на .kdb файла се състои от следните полета:
Флагове (4 байта): Това поле показва кои типове криптиране са използвани за създаване на файла:
0x01 - SHA256;
0x02 - AES256;
0x04 - ARC4;
0x08 - Две риби.
Версия (4 байта): версия на файла.
Master Seed (16 байта): използва се за генериране на главния ключ.
Шифроване IV (16 байта): използва се за дешифриране на данни.
Брой групи (4 байта): Общият брой групи в базата данни.
Брой записи (4 байта): Общият брой записи в базата данни.
Хеш на съдържанието (32 байта): хеш на дешифрираните данни.
Transform Seed (32 байта): използва се за генериране на главния ключ.
Трансформирайте кръгове (4 байта): използвани за генериране на главния ключ.
Заглавка на KeePass 2.x
Във файловете .kdbx всяко поле за заглавка се състои от 3 части:
ID на полето (1 байт): възможни стойности от 0 до 10.
Дължина на данните (2 байта).
Данни ([дължина на данните] байтове)
Заглавката на файла .kdbx се състои от следните полета:
ID=0x01 Коментар: Това поле може да присъства в заглавката, но не съществуваше в моята база данни.
ID=0x02 Cipher ID: UUID, указващ използвания метод на криптиране (например за AES 256 UUID = ).
ID=0x03 Флагове за компресиране: ID на алгоритъма, използван за компресиране на базата данни:
0x00: няма;
0x01: gzip.
ID=0x04 Master Seed: използва се за създаване на главен ключ.
ID=0x05 Трансформиране на начален етап: използва се за създаване на главен ключ.
ID=0x06 Трансформиране на кръгове: използва се за създаване на главен ключ.
ID=0x07 Encryption IV: използва се за дешифриране на данни.
ID=0x08 Защитен ключ за поток: използва се за дешифриране на пароли.
ID=0x09 Начални байтове на потока: първите 32 байта от декриптирана база данни. Те се използват за проверка на целостта на декриптираните данни и коректността на главния ключ. Тези 32 байта се генерират произволно всеки път, когато промените се записват във файла.
ID=0x0A ID на вътрешен произволен поток: ID на алгоритъма, използван за дешифриране на пароли:
0x00: няма;
0x01: ARC4;
0x02: Салса20.
ID=0x00 Край на заглавката: последното поле на заглавката на базата данни, след което започва самата база данни.
Генериране на главен ключ
Главният ключ се генерира на 2 етапа:
Генериране на съставен ключ;
Генериране на главен ключ на базата на съставен ключ.
1. Генериране на съставен ключ
Хеш алгоритъмът SHA256 се използва за генериране на съставен ключ. Таблиците по-долу предоставят псевдокод за генериране на съставен ключ, въз основа на това коя версия на KeePass се използва и какви входни данни са необходими за дешифриране на базата данни (само парола, само ключов файл или и двете):
KeePass 1.x
KeePass 2.x
Обръщам внимание на факта, че ако са необходими няколко обекта за дешифриране на базата данни (например парола и ключов файл), първо трябва да получите хеш от всеки обект и след това да ги свържете заедно (concat) и вземете хеша от комбинираната последователност.
2. Генериране на главен ключ на базата на съставен ключ
Трябва да криптиранесъставният ключ, получен по-горе с помощта на алгоритъма AES-256-ECB.
Като ключ трябва да използвате Transform Seed от заглавката.
Това криптиране трябва да се извърши Трансформирайте кръгове (от заглавката) пъти.
Използвайки SHA256, получаваме хеш от криптирания съставен ключ.
Свързваме Master Seed от хедъра с получения хеш.
Използвайки SHA256, получаваме хеш от комбинираната последователност - това е нашият главен ключ!
Псевдокод
void GenerateMasterKey() ( //шифроване на съставния ключ на TransformRounds пъти за (int i = 0; i< TransformRounds; i++) {
result = encrypt_AES_ECB(TransformSeed, composite_key);
composite_key = result;
}