
KeePass 2.X ダンパー (CVE-2023-32784)
これは、CVE-2023-32784 向けの私の PoC 実装です。
私のバージョンは、@vdohney の PoC を Python に移植したもので、いくつかの変更と追加機能が含まれています。
1 つの変更点として、ダンプファイル内で見つかる既知の文字列を使用して、マスターキーの文字の位置により正確にジャンプするようにしました。これにより、誤検知の文字が減り、ファイルのスキャンにかかる時間が大幅に短縮されます。ダンプファイル内に文字列が見つからない場合、スキャンは最初から開始されます。このオプションはデフォルトで有効ですが、代わりにフルスキャンを実行したい場合は --full-scan を使用できます。そのような場合のために、--skip フラグも追加しました。これは、ポインタをオフセットして、通常は同じ文字が複数回繰り返されているだけの次の1000バイトをスキップすることで、スキャンを高速化します。たとえば、ダンプファイル内で文字 ●e が見つかった場合、以下のように表示されます:
●e
●e
●e
●e
●e
●e
●e
●e
●e
●e
●●c
--skip フラグを使用すると、これらの繰り返しバイトをスキップしてスキャンを高速化できます。ただし、ジャンプポイントを使用する場合にはこれは必要ありません。
[*] 15567777 | Found: ●e
[*] 15568797 | Found: ●e
[*] 15570355 | Found: ●●c
[*] 15571375 | Found: ●●c
[*] 15572925 | Found: ●●●r
[*] 15573973 | Found: ●●●r

このバージョンには、キーの未確定の文字を復元しようとするリカバリ機能が含まれています。これは、ダンプ内で見つかった文字の可能な組み合わせを特定しようとすることで行われ、一致が見つかった場合、次の非ASCII文字が見つかるまでダンプから残りの文字が取得されます。
これは、ダンプファイル内に完全な平文パスワードが保存されている場合に機能します(これは、ユーザーがアスタリスクによる非表示を無効にしてマスターキーを表示した場合に発生するようです)。
この動作を有効にするには、--recover フラグを使用します。

-o を使用して出力ファイルを指定し、見つかった異なる組み合わせをエクスポートすることもできます。ここでは、別のマスターキーの文字が見つかった場合でも、平文パスワードがダンプに保存されていない場合でも、以下の最後の組み合わせでキーの 23/24 文字を取得できていることがわかります。

この場合、最初のエントリは実際にはダンプ内にあった2番目のキー ducks の 4/5 文字も示していますが、他のキーの文字と組み合わさって ucks|tMasterPassword123! として表示されています。これに対する回避策が存在する可能性もありますが、まだ開発中です。
また、-w でワードリストを指定して、ダンプファイル内のパスワードの可能性を検索する機能も追加しました。このフラグは、リスト内の単語から文字を含む文字列を生成し、ダンプファイル内で検索します。作成された文字列のパディングは、-p または --padding フラグで指定することもできます。
例: --padding 2 => ●●a | --padding 3 => ●●●a

上記の例では、パスワードがダンプ内に平文で保存されていました。そのため、見つかった文字列と一致させて追加の文字を取得することができました。ただし、平文パスワードがダンプ内に平文で保存されていない場合でも、残りの文字を抽出することは可能です:

この場合、ダンプ内で平文の一致を見つけることができませんでしたが、それでもすべての追加文字を抽出することができました。
この脆弱性を最初に発見した @vdohney に感謝します。彼らのプロジェクトへのリンクはこちらです。
CVE の詳細: CVE-2023-32784