
Dumper de KeePass 2.X (CVE-2023-32784)
Esta es mi implementación de PoC para CVE-2023-32784
Mi versión es un puerto en Python del PoC de @vdohney junto con algunos cambios y características adicionales.
Un cambio fue usar cadenas conocidas que pueden encontrarse en el archivo de volcado para saltar con mayor precisión a la ubicación de los caracteres de la clave maestra. Esto da como resultado menos caracteres falsos positivos y reduce en gran medida el tiempo que se tarda en escanear el archivo. En caso de que las cadenas no se encuentren en el archivo de volcado, el escaneo comenzará desde el principio. Esta opción está habilitada por defecto, pero si quieres hacer un escaneo completo en su lugar, puedes usar --full-scan. Para estos casos, también he añadido una bandera --skip para ayudar a acelerar el escaneo. Esto se hace desplazando el puntero para saltar los siguientes 1000 bytes, ya que normalmente solo contienen el mismo carácter repetido varias veces. Por ejemplo, si el carácter ●e se encuentra en el archivo de volcado, aparecería de la siguiente manera:
●e
●e
●e
●e
●e
●e
●e
●e
●e
●e
●●c
Usando la bandera --skip, es posible saltar estos bytes repetidos para ayudar a acelerar el escaneo, aunque esto no es necesario cuando se usan los puntos de salto.
[*] 15567777 | Found: ●e
[*] 15568797 | Found: ●e
[*] 15570355 | Found: ●●c
[*] 15571375 | Found: ●●c
[*] 15572925 | Found: ●●●r
[*] 15573973 | Found: ●●●r

Esta versión incluye una funcionalidad de recuperación que intenta encontrar los caracteres desconocidos restantes de la clave. Esto se hace intentando localizar las diferentes combinaciones posibles de los caracteres encontrados dentro del volcado; si se encuentra una coincidencia, los caracteres restantes se extraen del volcado hasta que se encuentre el siguiente carácter no ASCII.
Esto funciona si la contraseña en texto plano completa está almacenada dentro del archivo de volcado (esto parece suceder cuando el usuario muestra la clave maestra desactivando la ocultación mediante asteriscos).
Puedes habilitar este comportamiento usando la bandera --recover.

También puedes especificar un archivo de salida usando -o para exportar las diferentes combinaciones encontradas. Aquí puedes ver que, incluso en el caso de que se encontraran caracteres de otra clave maestra y de que la contraseña en texto plano no estuviera almacenada en el volcado, en la lista de combinaciones todavía somos capaces de obtener 23/24 caracteres de la clave en la combinación final que se encuentra a continuación.

En este caso, la primera entrada también muestra en realidad 4/5 caracteres de la segunda clave, ducks, que también estaba dentro del volcado; sin embargo, se emparejó junto con los caracteres de la otra clave, lo que resultó en ucks|tMasterPassword123!. Parece que podría haber una solución para esto, sin embargo, sigue siendo un trabajo en progreso (WIP).
También he añadido la capacidad de buscar posibles contraseñas dentro del archivo de volcado proporcionando una lista de palabras con -w. Esta bandera generará cadenas que contienen caracteres de las palabras encontradas en la lista para buscar dentro del archivo de volcado. También puedes especificar el relleno (padding) para las cadenas creadas usando las banderas -p o --padding.
Ejemplo: --padding 2 => ●●a | --padding 3 => ●●●a

Para el ejemplo anterior, la contraseña se almacenó en texto plano dentro del volcado. Por lo tanto, fue posible hacer coincidir la cadena encontrada para extraer los caracteres adicionales. Sin embargo, en el caso de que la contraseña en texto plano no esté almacenada en texto plano dentro del volcado, todavía es posible extraer los caracteres restantes:

En este caso, aunque no fue capaz de encontrar una coincidencia de texto plano en el volcado, aún así pudo extraer todos los caracteres adicionales.
Crédito a @vdohney, quien descubrió originalmente esta vulnerabilidad. El enlace a su proyecto está aquí
Detalles del CVE: CVE-2023-32784