
KeePass 2.X 덤퍼 (CVE-2023-32784)
이는 CVE-2023-32784에 대한 제 PoC 구현입니다.
제 버전은 @vdohney의 PoC를 파이썬으로 포팅한 것으로, 몇 가지 변경 사항과 추가 기능이 포함되어 있습니다.
한 가지 변경 사항은 덤프 파일에서 찾을 수 있는 알려진 문자열을 사용하여 마스터키 문자의 위치를 더 정확하게 찾아가는 것입니다. 이로 인해 잘못된 긍정 문자(false positive)가 줄어들고 파일 스캔 시간이 크게 단축됩니다. 덤프 파일에서 문자열이 발견되지 않으면 스캔은 처음부터 시작됩니다. 이 옵션은 기본적으로 활성화되어 있지만, 대신 전체 스캔을 원하는 경우 --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 문자를 얻을 수 있음을 확인할 수 있습니다.

이 경우, 첫 번째 항목은 실제로 덤프에 있던 두 번째 키 ducks에 대해 4/5 문자를 보여주지만, 다른 키의 문자와 함께 짝을 이루어 ucks|tMasterPassword123!로 나타납니다. 이에 대한 해결 방법이 있을 수 있지만, 아직 작업 중입니다.
또한 -w로 단어 목록을 제공하여 덤프 파일 내에서 잠재적인 비밀번호를 검색하는 기능을 추가했습니다. 이 플래그는 목록에서 찾은 단어의 문자를 포함하는 문자열을 생성하여 덤프 파일 내에서 검색합니다. -p 또는 --padding 플래그를 사용하여 생성된 문자열에 패딩을 지정할 수도 있습니다.
예: --padding 2 => ●●a | --padding 3 => ●●●a

위 예시의 경우 비밀번호가 덤프 내에 일반 텍스트로 저장되어 있었습니다. 따라서 발견된 문자열을 일치시켜 추가 문자를 가져올 수 있었습니다. 그러나 덤프에 일반 텍스트 비밀번호가 저장되지 않은 경우에도 나머지 문자를 추출하는 것이 가능합니다.

이 경우, 덤프에서 일반 텍스트 일치 항목을 찾지 못했음에도 모든 추가 문자를 추출할 수 있었습니다.
이 취약점을 최초로 발견한 @vdohney에게 감사드립니다. 프로젝트 링크는 여기에 있습니다.
CVE 세부 정보: CVE-2023-32784