
Dumper KeePass 2.X (CVE-2023-32784)
Ceci est mon implémentation de PoC pour CVE-2023-32784
Ma version est un portage Python du PoC de @vdohney avec quelques modifications et fonctionnalités supplémentaires.
Un changement consistait à utiliser des chaînes connues pouvant être trouvées dans le fichier de dump afin de sauter plus précisément à l'emplacement des caractères du mot de passe principal. Cela réduit les faux positifs et diminue considérablement le temps nécessaire pour analyser le fichier. Si les chaînes ne sont pas trouvées dans le fichier de dump, l'analyse commence depuis le début. Cette option est activée par défaut, mais si vous souhaitez effectuer une analyse complète à la place, vous pouvez utiliser --full-scan. Pour ces cas, j'ai également ajouté un drapeau --skip pour accélérer l'analyse. Cela fonctionne en décalant le pointeur pour sauter les 1000 prochains octets, car ils contiennent généralement le même caractère répété plusieurs fois. Par exemple, si le caractère ●e est trouvé dans le fichier de dump, il apparaîtrait comme suit :
●e
●e
●e
●e
●e
●e
●e
●e
●e
●e
●●c
En utilisant le drapeau --skip, il est possible de sauter ces octets répétés pour accélérer l'analyse, bien que cela ne soit pas nécessaire lorsqu'on utilise les points de saut.
[*] 15567777 | Found: ●e
[*] 15568797 | Found: ●e
[*] 15570355 | Found: ●●c
[*] 15571375 | Found: ●●c
[*] 15572925 | Found: ●●●r
[*] 15573973 | Found: ●●●r

Cette version inclut une fonctionnalité de récupération qui tente de trouver les caractères inconnus restants pour la clé. Pour cela, elle essaie de localiser les différentes combinaisons possibles des caractères trouvés dans le dump. Si une correspondance est trouvée, les caractères restants sont extraits du dump jusqu'au prochain caractère non-ASCII.
Cela fonctionne si le mot de passe en clair complet est stocké dans le fichier de dump (cela semble se produire lorsque l'utilisateur affiche le mot de passe principal en désactivant le masquage par astérisques).
Vous pouvez activer ce comportement à l'aide du drapeau --recover.

Vous pouvez également spécifier un fichier de sortie avec -o pour exporter les différentes combinaisons trouvées. Ici, vous pouvez voir que même lorsque des caractères appartenant à un autre mot de passe principal ont été trouvés, et que le mot de passe en clair n'est pas stocké dans le dump, nous sommes quand même capables d'obtenir 23/24 caractères de la clé dans la combinaison finale trouvée ci-dessous.

Dans ce cas, la première entrée montre également 4/5 caractères pour la seconde clé, ducks, qui était aussi dans le dump, mais elle a été appariée avec les caractères de l'autre clé, ce qui donne ucks|tMasterPassword123!. Il semble y avoir potentiellement une solution de contournement pour cela, mais c'est encore un WIP.
J'ai également ajouté la possibilité de rechercher des mots de passe potentiels dans le fichier de dump en fournissant une liste de mots avec -w. Ce drapeau génère des chaînes contenant des caractères provenant des mots trouvés dans la liste, à rechercher dans le fichier de dump. Vous pouvez aussi spécifier un padding pour les chaînes créées à l'aide des drapeaux -p ou --padding.
Exemple : --padding 2 => ●●a | --padding 3 => ●●●a

Pour l'exemple ci-dessus, le mot de passe était stocké en clair dans le dump. Il a donc été possible de faire correspondre la chaîne trouvée pour extraire les caractères supplémentaires. Cependant, dans le cas où le mot de passe en clair n'est pas stocké dans le dump, il est toujours possible d'extraire les caractères restants :

Dans ce cas, même s'il n'a pas été possible de trouver une correspondance en clair dans le dump, il a tout de même réussi à extraire tous les caractères supplémentaires.
Merci à @vdohney qui a découvert cette vulnérabilité. Le lien vers son projet se trouve ici
Détails de la CVE : CVE-2023-32784