
Дампер KeePass 2.X (CVE-2023-32784)
Это моя PoC-реализация для CVE-2023-32784
Моя версия — это порт PoC от @vdohney на Python с несколькими изменениями и дополнительными функциями.
Одно из изменений — использование известных строк, которые можно найти в файле дампа, чтобы точнее переходить к местоположению символов мастер-пароля. Это приводит к меньшему количеству ложноположительных символов и значительно сокращает время сканирования файла. Если строки не найдены в файле дампа, сканирование начинается с начала. Эта опция включена по умолчанию, но если вы хотите вместо этого выполнить полное сканирование, вы можете использовать --full-scan. Для таких случаев я также добавил флаг --skip, помогающий ускорить сканирование. Это делается путём смещения указателя, чтобы перепрыгивать через следующие 1000 байт, так как они обычно содержат один и тот же символ, повторяющийся несколько раз. Например, если в файле дампа найден символ ●e, это будет выглядеть следующим образом:
●e
●e
●e
●e
●e
●e
●e
●e
●e
●e
●●c
С помощью флага --skip можно перепрыгивать через эти повторяющиеся байты, чтобы ускорить сканирование, хотя это необязательно при использовании точек перехода.
[*] 15567777 | Found: ●e
[*] 15568797 | Found: ●e
[*] 15570355 | Found: ●●c
[*] 15571375 | Found: ●●c
[*] 15572925 | Found: ●●●r
[*] 15573973 | Found: ●●●r

Эта версия включает функцию восстановления, которая пытается найти любые оставшиеся неизвестные символы ключа. Это делается путём поиска различных возможных комбинаций символов, найденных внутри дампа; если совпадение найдено, остальные символы извлекаются из дампа до тех пор, пока не встретится следующий не-ASCII символ.
Это работает, если полный пароль в открытом виде хранится в файле дампа (похоже, это происходит, когда пользователь отображает мастер-пароль, отключив скрытие с помощью звёздочек).
Вы можете включить это поведение с помощью флага --recover.

Кроме того, вы можете указать выходной файл с помощью -o, чтобы экспортировать найденные комбинации. Здесь видно, что даже в тех случаях, когда были найдены символы другого мастер-пароля, а пароль в открытом виде не хранится в дампе, в списке комбинаций мы всё равно можем получить 23/24 символа ключа в финальной комбинации, показанной ниже.

В этом случае первая запись также показывает 4/5 символов для второго ключа, ducks, который тоже находился в дампе, однако он был объединён с символами другого ключа, что дало ucks|tMasterPassword123!. Похоже, для этого потенциально может существовать обходной путь, но он ещё в стадии разработки (WIP).
Я также добавил возможность поиска потенциальных паролей внутри файла дампа с помощью передачи словаря через -w. Этот флаг генерирует строки, содержащие символы из слов, найденных в списке, для поиска в файле дампа. Вы также можете указать дополнение для создаваемых строк с помощью флагов -p или --padding.
Пример: --padding 2 => ●●a | --padding 3 => ●●●a

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

В этом случае, даже несмотря на то, что не удалось найти совпадение в открытом виде в дампе, все дополнительные символы всё равно были извлечены.
Благодарность @vdohney, который первоначально обнаружил эту уязвимость. Ссылка на его проект находится здесь
Детали CVE: CVE-2023-32784