문제 출처 https://www.root-me.org/en/Challenges/Forensic/Capture-this
Un merci spécial à 0x4XE|_(0x4xe__95600)

힌트 : 첨부파일, kdbx DB 파일
문제 파일 : Capture, Database.kdbx

KeePass란? 패스워드 관리 프로그램 (참고)

취약점 CVE-2023-21036 : 픽셀폰(구글 스마트폰 종류), 윈도우 OS에서 수정한 이미지 파일 원본이 수정이후 파일에 잔존한다.
취약점 관련 기사 목록
취약점 관련 기사
한국 취약점 관련 기사
취약점 메인 기사
복구 방법
픽셀이라는 구글 스마트폰에서 생성한 캡처 화면, 그리고 윈도우에서 캡처한 화면에서 취약점이 발생한다.

픽셀휴대폰에서 수정한 캡처 사진을 acropalypse사이트에서 수정한부분 일부를 복구가 가능하다.
그러나 주어진 문제에서 준 사진은 윈도우 OS에서 수정한 파일로 유추할 수 있다.
따라서, 윈도우 캡쳐 화면을 복구하는 방법을 사용했다.
png 이미지 파일 내부에 있는 원본 png 파일 일부를 분리해 별도의 파일을 만드는 코드이다.
해당 파일을 다운로드 받고, 필요한 설정 후 실행시킨다.


실제로는 파이참으로 실행했다.
Select Tool 에서 Restoring Tool 선택


복구한 원본 이미지를 저장하고, 해당 파일을 찾아보면 DB 패스워드가 존재한다.

그런데 중간에 있는 특수기호 ( ' ) 우측으로 틀어진 따옴표같은데 키보드에서는 못 찾았다.
나무위키에서 정리한 특수기호에서 찾아냈다.

프랑스 문자이지 않을까 했는데 한국말로는 억음부호, tab 키 위에 있는 특수기호였다.
해당 패스워드로 CASE 제시에서 주어진 Keepass DB 파일을 열면 플래그가 나온다.


포렌식 문제를 푸는 스터디에서 이 문제에 대해 이야기를 나누었다.
이 문제를 풀어보고 힌트를 알려줘야 하는 입장에서 문제 출제 부분에서 힌트를 조금 잘못 준것 같다고 생각이 들었다.
이 문제에서 사용한 취약점은 픽셀 휴대폰의 이미지 원본 획득에 관련된 내용이고, 윈도우 캡처 이미지에서도 동일하게 원본을 획득할 수 있다고 확인할 수 있다. 즉, 취약점 키워드를 CASE 제시 부분과 연관성이 크게 있지 않다...난이도는 2단계정도인데.
crop image 라는 단어를 사용해 알려주었다면 관련 검색을 하면서 취약점을 찾아냈을 것이다.
또는 픽셀 휴대폰에서 사용한 이미지라던가..
해당 문제에서는 DB 패스워드를 물어보았는데, 캡처 사진과 DB파일도 준게 의아했다.
결론은 단순히 힌트와 플래그가 존재하는 DB 파일이었다.
아래는 시도했던 취약점 방법이다.
Kali linux에서 John the Ripper를 사용해 문제의 DB 패스워드를 크랙하고자 했다.
원본 DB파일(Database.kdbx)로부터 keepass 해시 파일을 생성하고, 단어목록(rockyou.txt)를 사용해 하나씩 대입해 푸는 방식이다.

john --wordlist=/home/kali/Desktop/rockyou.txt /home/kali/Desktop/keepasshash.txt hash

경우의 수가 너무 많으면 오래 걸리니 칼리리눅스 할당 프로세스를 늘려주자.
HxD에서 해당 원본 파일의 길이를 임의로 늘려 숨겨진 패스워드를 확인하려고 시도했다.
캡처 사진의 우측에 숨겨진 글자가 있지 않을까 해서 IDHR 가로 크기를 늘려봤지만, 가로로 늘렸을때는 이미지가 깨지고, 세로로 늘리면 깨지지 않았다.
혹시 몰라 LineFeed 문제에서 사용한 PNG 파일의 CRC값에 대해 가로 세로 길이가 다르지 않을까 해서 살펴봤지만, 주어진 파일에서 가로 세로의 넓이는 CRC 길이에 비해 정상이다. 따라서 해당 파일의 원본은 IDHR 청크를 수정해 획득 불가능하다.

wordlist으로 DB 패스워드 크랙은 동일하지만, 임의의 wordlist file을 사용하는 것이 아닌, 프로그램 사용 메모리 파일으로 획득한 비밀번호를 탐색해 사용한다.
CVE-2023-32784 취약점을 이용한다. 해당 취약점으로부터 패스워드에 대한 힌트를 얻고, 이를 사용해 wordlist를 생성하고, john the ripper를 사용해 DB 패스워드를 크랙한다.
해당 취약점을 이용하기 위해서는 해당 keepass 파일을 실행시킨 메모리의 원본이 있어야 했다.
취약점 CVE-2023-32784 : 메모리에서 마스터 암호 유추해낼 수 있다.
소스코드
https://github.com/vdohney/keepass-password-dumper?tab=readme-ov-file

위 사진과 같이 패스워드 첫 글자는 나오지 않지만, 이후 글자는 유추가 가능하다. 물론 위는 원본 메모리 덤프를 사용한 것이고, 주어진 문제에서는 메모리 파일이 없기 때문에 내가 직접 DB를 실행해 작업 관리자에서 얻은 덤프 파일을 사용했고, 위에서 나온 9자리가 아닌, 훨씬 더 많은 경우의 수가 나왔다.

dotnet run PATH_TO_DUMP PATH_TO_PWDLIST
이 명령어를 사용하면, dotnet 명령어 결과인 각 자리의 패스워드 경우의 수를 파일로 만들 수 있는데, 아래 사진에 보이듯 첫번째 자리는 알 수 없었다.

나는 첫번째 자리 수가 힌트에서 주어진 캡처 사진의 k 가 알 수 없는 첫번째 패스워드인줄 알았다.
아래 파이썬 코드로 '●'를 'k' 로 바꾸어 john 명령어의 wordlist 로써 사용했다.
file_path = 'C:\\Users\\USER\\Desktop\\ch42\\pwdlist.txt'
# 파일 읽기
with open(file_path, 'r', encoding='utf-8') as file:
lines = file.readlines()
# 문자열 처리
for i in range(len(lines)):
lines[i] = lines[i].replace('●', 'k')
# 파일 쓰기 (변경 내용을 파일에 저장)
with open(file_path, 'w', encoding='utf-8') as file:
file.writelines(lines)
print("파일을 수정하여 '●'을 'k'로 바꾸었습니다.")

약 6시간정도 john 명령어를 실행해 봤지만 결과는 나오지 않았다.
취약점 CVE-2023-21036에서 파일을 복구시키는 소스코드를 github에서 찾아 실행시켜보았다.
윈도우 OS에서 수정한 이미지에서 삭제되지 않은 파일의 일부를 가져와 PNG 파일을 생성하는 코드를 사용했다.

문제는 가로 세로 길이를 지정해 만들어 줘야 하는데 모니터 픽셀 크기를 맞춰 임의로 집어넣어 봤는데 비스무리하게만 나오고 나오지 않는다.
임의의 범위를 지정하거나 모니터 픽셀 크기를 맞춰 약 60장의 사진을 추출해냈으나 아래 사진과 같이 깨진 이미지만 나왔다.
아래 이미지가 그나마 가장 원본과 비슷한(엑셀을 띄워놓은) 이미지였으나 해당 방법으로는 가로/세로 길이를 지정해야 하므로 이 방법으로는 원본 사진을 복구할 수 없었다.
