keepass_dumper.py
Puerto en Python de vdohney/keepass-password-dumper
(CVE-2023-32784) — todo el crédito de la implementación original en C# y de la
técnica subyacente pertenece a vdohney.
El script escanea un volcado de memoria de un proceso en busca de las cadenas de renderizado residuales que
el SecureTextBoxEx de KeePass 2.x deja atrás mientras el usuario escribe la
contraseña maestra, y recupera todos los caracteres de esa contraseña excepto el
primero. Opcionalmente, luego fuerza bruta el primer carácter desconocido
contra un archivo KDBX usando keepassxc-cli.
Versiones afectadas
- Vulnerable: KeePass 2.53.1 y anteriores (Windows y Linux).
- Corregido: KeePass 2.54 y posteriores.
- KeePassXC, KeePass 1.x y Strongbox no están afectados.
La falla está en el control personalizado SecureTextBoxEx: por cada carácter
escrito, .NET mantiene una cadena residual en memoria administrada de la forma
●a, ●●s, ●●●s, … de la cual se puede recuperar cada carácter de la contraseña
después del primero.
Requisitos y limitaciones del ataque
- Requiere un artefacto de memoria del proceso de KeePass: un volcado de proceso, el
archivo de página/intercambio, un archivo de hibernación, un volcado de kernel por caída
o una captura completa de RAM. No se necesita ejecución de código en el host objetivo.
- Funciona tanto si el espacio de trabajo está bloqueado como desbloqueado, e incluso después
de que el proceso de KeePass haya terminado (siempre que las páginas de memoria sobrevivan en algún lugar).
- El primer carácter de la contraseña no se puede recuperar de la fuga.
- La fuga captura caracteres ASCII imprimibles de forma fiable; los caracteres no ASCII son
menos fiables.
- Varias contraseñas maestras introducidas en la misma sesión pueden producir
cadenas residuales superpuestas y degradar la precisión.
Mitigación
Si usaste KeePass ≤ 2.53.1, asume que la contraseña maestra está comprometida:
- Actualiza KeePass a 2.54 o posterior.
- Cambia la contraseña maestra (y rota cualquier secreto de alto valor almacenado en
la base de datos que se haya introducido mientras la contraseña maestra antigua estaba en uso).
- Purga los artefactos de memoria que aún podrían contener las cadenas residuales:
- elimina los volcados de caída (p. ej.
C:\Windows\memory.dmp),
- desactiva/limpia la hibernación (
powercfg /h off en Windows),
- elimina o sobrescribe el archivo de página/intercambio,
- sobrescribe el espacio libre del disco (p. ej.
cipher /w: en Windows) para que
los residuos no puedan extraerse de sectores previamente asignados,
- reinicia — o, para escenarios de alta seguridad, reinstala el sistema operativo.
Requisitos
- Python 3.10+ (solo biblioteca estándar — sin paquetes de terceros)
keepassxc-cli en $PATH (solo necesario para --kdbx)
Instalación
En Debian / Ubuntu, instala la CLI de KeePassXC si planeas usar fuerza bruta:
sudo apt install keepassxc
Uso
# Recupera caracteres candidatos e imprímelos
python3 keepass_dumper.py memory.dmp
# Vuelca la lista de candidatos generada a un archivo
python3 keepass_dumper.py memory.dmp -p candidates.txt
# Recupera y fuerza bruta el primer carácter faltante contra un KDBX
python3 keepass_dumper.py memory.dmp --kdbx db.kdbx
Ejecuta python3 keepass_dumper.py --help para ver la lista completa de opciones.
Qué es diferente del original
- Filtro de escaneo más estricto (ASCII imprimible por defecto) para reducir falsos positivos.
- Conjunto de caracteres ordenado por prioridad (letras → dígitos → puntuación común → resto)
para que los candidatos más probables se prueben primero.
- Lector de volcados basado en mmap, barra de progreso de una sola línea, salida más silenciosa.