
Dumper di KeePass 2.X (CVE-2023-32784)
Questa è la mia implementazione PoC per CVE-2023-32784
La mia versione è una porting in Python del PoC di @vdohney con alcune modifiche e funzionalità aggiuntive.
Una modifica consiste nell'usare stringhe note che possono essere trovate nel file di dump per saltare in modo più preciso alla posizione dei caratteri della chiave master. Questo riduce i falsi positivi e diminuisce notevolmente il tempo necessario per eseguire la scansione del file. Nel caso in cui le stringhe non vengano trovate nel file di dump, la scansione partirà dall'inizio. Questa opzione è abilitata di default, ma se vuoi fare una scansione completa puoi usare --full-scan. Per questi casi, ho anche aggiunto un flag --skip per accelerare la scansione. Questo avviene spostando il puntatore per saltare i successivi 1000 byte, poiché di solito contengono solo lo stesso carattere ripetuto più volte. Ad esempio, se il carattere ●e viene trovato nel file di dump, apparirà come segue:
●e
●e
●e
●e
●e
●e
●e
●e
●e
●e
●●c
Usando il flag --skip, è possibile saltare questi byte ripetuti per accelerare la scansione, anche se non è necessario quando si usano i punti di salto.
[*] 15567777 | Trovato: ●e
[*] 15568797 | Trovato: ●e
[*] 15570355 | Trovato: ●●c
[*] 15571375 | Trovato: ●●c
[*] 15572925 | Trovato: ●●●r
[*] 15573973 | Trovato: ●●●r

Questa versione include una funzionalità di recupero che tenta di trovare eventuali caratteri sconosciuti rimanenti per la chiave. Questo viene fatto cercando di individuare le diverse possibili combinazioni dei caratteri trovati all'interno del dump; se viene trovata una corrispondenza, i caratteri rimanenti vengono estratti dal dump fino al successivo carattere non ASCII.
Questo funziona se la password in chiaro completa è memorizzata nel file di dump (sembra che ciò accada quando l'utente visualizza la chiave master disattivando l'oscuramento con gli asterischi).
Puoi abilitare questo comportamento usando il flag --recover.

Puoi anche specificare un file di output usando -o per esportare le diverse combinazioni trovate. Qui puoi vedere che, anche nel caso in cui vengano trovati caratteri appartenenti a un'altra chiave master, e la password in chiaro non sia memorizzata nel dump, nella lista delle combinazioni siamo comunque in grado di ottenere 23/24 caratteri per la chiave nell'ultima combinazione trovata qui sotto.

In questo caso, la prima voce mostra anche effettivamente 4/5 caratteri per la seconda chiave, ducks, che era anch'essa presente nel dump, ma è stata abbinata insieme ai caratteri dell'altra chiave risultando in ucks|tMasterPassword123!. Sembra esserci potenzialmente un workaround per questo, ma è ancora un WIP.
Ho anche aggiunto la possibilità di cercare potenziali password all'interno del file di dump fornendo una wordlist con -w. Questo flag genererà stringhe contenenti caratteri dalle parole trovate nella lista da cercare nel file di dump. Puoi anche specificare il padding per le stringhe create usando i flag -p o --padding.
Esempio: --padding 2 => ●●a | --padding 3 => ●●●a

Per l'esempio sopra, la password era memorizzata in chiaro nel dump. Quindi è stato possibile abbinare la stringa trovata per estrarre i caratteri aggiuntivi. Tuttavia, nel caso in cui la password in chiaro non sia memorizzata in chiaro nel dump, è comunque possibile estrarre i caratteri rimanenti:

In questo caso, anche se non è stato possibile trovare una corrispondenza in chiaro nel dump, è comunque riuscito a estrarre tutti i caratteri aggiuntivi.
Credito a @vdohney che ha originariamente scoperto questa vulnerabilità. Il link al suo progetto è qui
Dettagli CVE: CVE-2023-32784