## https://sploitus.com/exploit?id=KITPLOIT:TOOLS-GITHUB-VDOHNEY-KEEPASS-PASSWORD-DUMPER
# KeePass 2.X — дампер мастер-пароля (CVE-2023-32784)
## Обновление
Уязвимости присвоен идентификатор CVE-2023-32784, и она исправлена в KeePass 2.54. Ещё раз спасибо Доминику Райхлю за быструю реакцию и креативное исправление!
Уточнение: **пароль должен быть введён с клавиатуры, а не скопирован из буфера обмена** (см. разделы «Как это работает»).
### Что вы можете сделать
Во-первых, **обновитесь до KeePass 2.54 или выше**.
Во-вторых, если вы давно пользуетесь KeePass, ваш мастер-пароль (и, возможно, другие пароли) может находиться в файле подкачки (pagefile/swapfile), файле гибернации и аварийных дампах (crash dump). В зависимости от уровня вашей паранойи, вы можете рассмотреть следующие шаги для решения проблемы:
1. Смените мастер-пароль
2. Удалите аварийные дампы (зависит от ОС; в Windows как минимум `C:\Windows\memory.dmp`, но могут быть и другие)
3. Удалите файл гибернации
4. Удалите файл подкачки pagefile/swapfile (это может быть довольно неприятно, не забудьте включить его обратно)
5. Перезапишите удалённые данные на жёстком диске, чтобы предотвратить их восстановление (например, Cipher с параметром `/w` в Windows)
6. Перезагрузите компьютер
Либо просто перезапишите ваш жёсткий диск и выполните чистую установку ОС.
Неполный список продуктов, **которые не затронуты** (пожалуйста, создайте pull request или issue для добавления других). Эмпирическое правило: если это не оригинальное приложение KeePass 2.X, написанное на .NET, скорее всего, оно не затронуто.
* KeePassXC
* Strongbox
* KeePass 1.X
* * *
* * *
KeePass Master Password Dumper — это простой инструмент типа proof-of-concept, предназначенный для извлечения мастер-пароля из памяти KeePass. За исключением первого символа пароля, он в основном способен восстановить пароль в открытом виде. Для этого не требуется выполнение кода на целевой системе — достаточно дампа памяти. Неважно, откуда взята память — это может быть **дамп процесса, файл подкачки (`pagefile.sys`), файл гибернации (`hiberfil.sys`), различные аварийные дампы или дамп ОЗУ** всей системы. **Неважно, заблокировано рабочее пространство или нет**. Также можно извлечь пароль из ОЗУ после того, как KeePass больше не запущен, хотя вероятность успеха снижается со временем, прошедшим с этого момента.
Протестировано с `KeePass 2.53.1` на Windows (английская версия) и `KeePass 2.47` на Debian (пакет keepass2). Должно работать и в версии для macOS. К сожалению, включение опции `Enter master key on secure desktop` не помогает предотвратить атаку. PoC может иметь проблемы с базами данных, созданными более старыми версиями KeePass, но мне не удалось воспроизвести эту проблему (см. issue #4).
Результат был подтверждён Домиником Райхлем, автором KeePass, здесь. Я ценю быстрый ответ Доминика. Надеюсь, вскоре это будет исправлено!
## Установка
1. Установите .NET (поддерживаются большинство основных операционных систем).
2. Склонируйте репозиторий: `git clone https://github.com/vdohney/keepass-password-dumper` или скачайте его с GitHub
3. Перейдите в каталог проекта в вашем терминале (Powershell в Windows): `cd keepass-password-dumper`
4. `dotnet run PATH_TO_DUMP`
Самый простой способ протестировать это в Windows — создать дамп процесса в диспетчере задач, щёлкнув правой кнопкой мыши по процессу KeePass и выбрав «Create dump file».

4. В качестве альтернативы вы можете добавить ещё один параметр `dotnet run PATH_TO_DUMP PATH_TO_PWDLIST`, чтобы сгенерировать список всех возможных паролей, начиная со второго символа.
## Стоит ли вам беспокоиться?
Зависит от вашей модели угроз. **Если ваш компьютер уже заражён вредоносным ПО, работающим в фоне с правами вашего пользователя, эта находка не сильно ухудшит ваше положение.** Однако вредоносному ПО может быть проще оставаться незаметным и обходить антивирус, поскольку, в отличие от KeeTheft или KeeFarce, не требуются внедрение в процесс или другой тип выполнения кода.
Если у вас есть разумные подозрения, что кто-то может получить доступ к вашему компьютеру и провести криминалистический анализ, это может быть плохо. В худшем случае мастер-пароль будет восстановлен, даже если KeePass заблокирован или вообще не запущен.
Если вы используете полное шифрование диска с надёжным паролем и ваша система чиста, вам не о чем беспокоиться. Никто не сможет украсть ваши пароли удалённо через интернет, используя только эту находку.
## Как это работает
KeePass 2.X использует специально разработанное текстовое поле для ввода пароля — `SecureTextBoxEx`. Это текстовое поле используется не только для ввода мастер-пароля, но и в других местах KeePass, например в полях редактирования пароля (так что атаку можно также использовать для восстановления их содержимого).
Используемый здесь недостаток заключается в том, что для каждого введённого символа в памяти создаётся остаточная строка. Из-за того, как работает .NET, от неё почти невозможно избавиться после её создания. Например, при вводе «Password» будут созданы следующие остаточные строки: •a, ••s, •••s, ••••w, •••••o, ••••••r, •••••••d. Приложение POC ищет в дампе эти шаблоны и предлагает вероятный символ пароля для каждой позиции в пароле.
Надёжность этой атаки может зависеть от того, как был введён пароль и сколько паролей было введено за сеанс. Тем не менее я обнаружил, что даже если за сеанс было введено несколько паролей или были опечатки, способ выделения этих строк средой CLR .NET означает, что они, скорее всего, будут аккуратно упорядочены в памяти. Так, если были введены три разных пароля, вы, вероятно, получите по три кандидата для каждой позиции символа в этом порядке, что позволяет восстановить все три пароля.
## Разработка
Это быстрый POC, так что он, вероятно, не очень надёжен и устойчив. Пожалуйста, создайте pull request, если найдёте проблему, и исправьте её.
Допустимые символы пароля сейчас жёстко заданы следующим образом: `^[\x20-\x7E]+$` (все печатные символы ASCII и пробел).
## Благодарности
Спасибо adridlug за добавление возможности автоматической генерации списка паролей и ynuwenhof за рефакторинг кода.
## Связанные проекты
* Реализация PoC на Python от CMEPW
* Реализация PoC на Rust от ynuwenhof
Я ещё ни одну из них не проверял.