PoC CVE-2023-32784: Keepass Master Password vulnerability
En esta entrada trato de traer un PoC sobre la ejecución de la vulnerabilidad CVE-2023-32784, que afecta directamente al gestor de contraseñas Keepass y permite la obtención de la contraseña maestra de acceso al vault de contraseñas.
Concepto y ejecución
Esta vulnerabilidad es de carácter crítico pues con ella se puede obtener la contraseña maestra de acceso a la base de datos y almacén de contraseñas.
El origen de la vulnerabilidad se encuentra a la hora de escribir la contraseña para iniciar la aplicación. Cuando introducimos la contraseña en Keepass, al desbloquear la bases de datos, los caracteres que escribimos se almacenan en memoria, y estos pueden ser recuperados a posteriori buscando una serie de patrones.
Lo “mejor” de esta vulnerabilidad es que ha sido confirmada, existe una PoC pública y el desarrollador de Keepass ha comunicado que hasta la próxima versión (v 2.54) programada para Julio, no se resolverá la vulnerabilidad. En esto entorno, encontramos que cualquier Keepass a la hora de escribir esta entrada, es vulnerable mediante los siguientes pasos.
Explotando la vulnerabilidad
En primer lugar, es necesario contar con la PoC que podemos encontrar en el siguiente enlace de GitHub:
https://github.com/vdohney/keepass-password-dumper
Una vez descargado, y siguiendo las instrucciones, descargaremos en SDK de Microsoft .NET.
La PoC descargada contiene el código fuente que será ejecutado. Para poder trabajar con ello, en primer lugar, debemos crear un entorno de trabajo. Si ya tenemos el SDK de .NET instalado, esto puede realizarse mediante la ejecución desde una consola de PowerShell,
dotnet new console -o app
Esta instrucción creará un entorno llamado “app”, donde copiaremos el “Program.cs” y el “keepass_password_dumper.csproj”, sobreescribiendo lo que hubiera.
Una vez creados los pasos previos, tenemos que conseguir un volcado de memoria del equipo. Existen diferentes maneras de obtener esta información, con el archivo de hibernación del equipo, el pagefile.sys, swapfile.sys, etc. Para esta PoC, lo haremos a través de un volcado de memoria del proceso de Keepass. Para ello, desde el administrador de tareas de Windows, seleccionamos el proceso de Keepass y con el botón derecho seleccionamos, “Crear archivo de volcado”
Esto creara un archivo llamado “KeePass.DMP”. Una vez lo tengamos, vamos al directorio “app” mediante Powershell y ejecutamos,
dotnet run .\KeePass.DMP
Tras esperar un breve periodo de tiempo, ¡contraseña obtenida!
Como se observa la contraseña no la obtiene al completo, los primeros dos caracteres salen incompletos, pero perfectamente se puede saber la contraseña y, si no, una fuerza bruta básica puede ayudar. En esta caso de prueba la contraseña de Keepass era “Sysbears2023”.
Soluciones
La verdad que no hay muchas soluciones para esta vulnerabilidad, y de ahi tambien la posible explotación. El creador de la herramienta propone algunas pero tampoco son grandes soluciones:
- Cambiar la contraseña maestra
- Eliminar posibles volcados de memoria
- Deshabilitar la hibernación del equipo
- Eliminar los archivos pagefile/swapfile
- Reiniciar el equipo
Como se puede observar no son soluciones muy viables en muchas casos, y luego no resuelven el problema al completo. En este caso, lo mejor será esperar al parcheo de la vulnerabilidad con la nueva versión 2.54 de Keepass…
Lo mas destacable de esta vulnerabilidad es que no es explotable remotamente desde Internet, por lo que teniendo encriptación a nivel de disco duro y una salud del equipo buena, no deberían existir mayores problemas.
Solución paranoica
Otra solución un tanto paranoica que si quiero destacar, es la que pasa por no escribir la contraseña al iniciar Keepass. Me explico.
Enfocándonos en la propia vulnerabilidad, hace referencia a la escritura y carga en memoria de caracteres al introducirla para iniciar la base de datos de Keepass. Si en vez de escribir la contraseña, la pegamos, es decir, copiamos en un bloc de notas por ejemplo y la pegamos en Keepass, la vulnerabilidad no se puede ejecutar. La siguiente captura muestra el resultado de este proceso.
Como se observa, no es posible explotar la vulnerabilidad con está técnica, ahora bien, a lo mejor esta no es posible explotar pero se pueden dar otros problemas. Todo dependerá del nivel de paranoia 🙂