
Dumper para KeePass 2.X (CVE-2023-32784)
Esta é a minha implementação de PoC para CVE-2023-32784
A minha versão é um port em Python do PoC do @vdohney com algumas alterações e funcionalidades adicionais.
Uma mudança foi usar strings conhecidas que podem ser encontradas no arquivo de dump para saltar com mais precisão para a localização dos caracteres da chave-mestra. Isso resulta em menos caracteres falsos positivos e reduz bastante o tempo necessário para analisar o arquivo. Caso as strings não sejam encontradas no arquivo de dump, a análise começará do início. Esta opção está ativada por padrão, mas se quiser fazer uma análise completa, pode usar --full-scan. Para estes casos, também adicionei a flag --skip para acelerar a análise. Isso é feito deslocando o ponteiro para saltar os próximos 1000 bytes, uma vez que normalmente contêm apenas o mesmo caractere repetido várias vezes. Por exemplo, se o caractere ●e for encontrado no arquivo de dump, aparecerá da seguinte forma:
●e
●e
●e
●e
●e
●e
●e
●e
●e
●e
●●c
Usando a flag --skip, é possível saltar esses bytes repetidos para acelerar a análise, embora isso não seja necessário quando se utilizam os pontos de salto.
[*] 15567777 | Found: ●e
[*] 15568797 | Found: ●e
[*] 15570355 | Found: ●●c
[*] 15571375 | Found: ●●c
[*] 15572925 | Found: ●●●r
[*] 15573973 | Found: ●●●r

Esta versão inclui uma funcionalidade de recuperação que tenta encontrar quaisquer caracteres desconhecidos restantes da chave. Isso é feito tentando localizar as diferentes combinações possíveis dos caracteres encontrados no dump; se uma correspondência for encontrada, os caracteres restantes são extraídos do dump até que o próximo caractere não ASCII seja encontrado.
Isso funciona se a senha completa em texto simples estiver armazenada no arquivo de dump (isso parece acontecer quando o usuário exibe a chave-mestra desativando a ocultação por asteriscos).
Você pode ativar esse comportamento usando a flag --recover.

Você também pode especificar um arquivo de saída usando -o para exportar as diferentes combinações encontradas. Aqui você pode ver que, mesmo no caso em que caracteres de outra chave-mestra foram encontrados, e com a senha em texto simples não estando armazenada no dump, na lista de combinações ainda conseguimos obter 23/24 caracteres da chave na combinação final encontrada abaixo.

Neste caso, a primeira entrada também mostra na verdade 4/5 caracteres da segunda chave, ducks, que também estava no dump, no entanto foi emparelhada com os caracteres da outra chave, resultando em ucks|tMasterPassword123!. Parece haver potencialmente uma solução alternativa para isso, porém ainda é um WIP.
Também adicionei a capacidade de procurar possíveis senhas dentro do arquivo de dump fornecendo uma wordlist com -w. Essa flag gerará strings contendo caracteres das palavras encontradas na lista para procurar dentro do arquivo de dump. Você também pode especificar o padding para as strings criadas usando as flags -p ou --padding.
Exemplo: --padding 2 => ●●a | --padding 3 => ●●●a

Para o exemplo acima, a senha estava armazenada em texto simples dentro do dump. Então foi possível corresponder a string encontrada para extrair os caracteres adicionais. No entanto, no caso em que a senha em texto simples não está armazenada em texto simples dentro do dump, ainda é possível extrair os caracteres restantes:

Neste caso, mesmo não tendo conseguido encontrar uma correspondência de texto simples no dump, ainda foi capaz de extrair todos os caracteres adicionais.
Créditos para @vdohney que originalmente descobriu esta vulnerabilidade. O link para o projeto dele está aqui
Detalhes do CVE: CVE-2023-32784