Sploitus

Exploit for keepass-password-dumper

kitploit · 2026-09-03

Exploit Code

MARKDOWN95 lines
## 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».

![Usage example](https://assets.kitploit.com/production/public/readmes/33953/dadbb21eceb5d90d26485e5a7066a1f543c05922fbb707722672e8d8e15cc720.gif)

  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



Я ещё ни одну из них не проверял.