1. 카카오톡 복호화
이번 2021 KDFS DFC 문제에 카카오톡 대화내역을 분석해야 할 일이 있어서 찾은 카카오톡 데이터 복호화 방법과 관련해서 포스팅 해보겠습니다.
카카오톡의 대화내역 암호화 방법은 카카오톡 어플을 디컴파일해서 소스코드를 보면 알 수 있다고 합니다.
이에 대해서는 이미 많은 분들이 분석을 진행하셨더라구요.
분석을 하셨던 분들이 내린 결론은 카카오톡의 정수 형태 사용자 ID 값을 암호화 키 값으로 사용한다는 것입니다. 그래서 카카오톡 ID 값을 복호화 키로 사용하고 복호화 소스코드를 작성해서 복호화를 하면 대화내역 원문을 얻어낼 수가 있다는 것입니다.
그런데 분석 방법을 포스팅하신 분들이 복호화 코드는 또 공유를 안하셔서 이리저리 찾다가 깃허브에서 카카오톡 복호화 코드를 찾을 수 있었습니다.
https://github.com/jiru/kakaodecrypt
위 링크에 접속하면 파이썬으로 작성된 복호화 코드를 다운로드 할 수 있습니다. (저는 Python3로 복호화를 진행했습니다.)
카카오톡 db 파일은 다음 경로에 위치하고 있습니다.
/data/com.kakao.talk/databases
분석할 파일은 위 경로의 KakaoTalk.db 파일과 KakaoTalk2.db 파일입니다.
KakaoTalk.db 파일의 데이터 중 "chat_logs" 테이블에서 대화 내역을 저장해두고 있는 것을 알 수 있습니다. 하지만 복호화를 하지 않았기 때문에 "message", "attachment" 필드 값이 암호화되어 확인할 수 없는 상태입니다.
같은 파일의 "chat_rooms" 테이블에서 마찬가지로 메세지 값을 암호화하여 확인할 수 없는 것을 볼 수 있습니다.
2. kakaodecrypt 사용법
python guess_user_id.py [KakaoTalk.db]
guess_user_id.py 코드로 카카오톡 사용자의 ID 값을 확인할 수 있습니다. 사실 이 부분은 암호화되지 않기 때문에 db 파일을 열어서 확인할 수 있는 데이터입니다.
python kakaodecrypt.py -u [KakaoTalk_User_ID] [KakaoTalk.db]
kakaodecrypt.py 코드를 사용해서 -u 옵션의 인자 값에 사용자 ID 값을 입력해주면 대화 내역을 복호화할 수 있습니다. 코드를 실행하면 "chat_logs_dec" , "chat_rooms_dec" 테이블이 생성되었다는 출력문을 확인할 수 있습니다.
파일로 새로 생성해주는 것이 아니라 기존 db 파일에 테이블을 추가해주는 형식입니다.
3. KakaoTalk.db 분석
3-1. chat_logs table
위와 같이 "chat_logs_dec" 라는 테이블이 새로 생성이 되었으며 message 값과 attachment 값이 복호화되어 원래의 값을 확인할 수 있습니다.
해당 테이블은 카카오톡의 모든 방의 대화 내역을 모아 놓은 테이블이며, 주목해야 할 필드 5개는 다음과 같습니다.
- chat_id : 카카오톡 채팅방의 ID
- user_id : 카카오톡 사용자의 ID
- message : 카카오톡 채팅방에서 전송된 메시지
- attachment : 카카오톡 채팅방에서 전송된 이모티콘과 업로드한 파일
- created_at : 카카오톡 대화가 전송된 시간 (Unix epoch time)
chat_id 값으로 어떤 톡방에서 이루어진 대화인지, user_id 값으로 어떤 사용자가 전송한 대화인지, created_at 값으로 언제 전송한 대화인지 분석할 수 있겠습니다.
3-2. chat_rooms table
"chat_rooms" 테이블 역시 복호화되어 "chat_rooms_dec" 테이블에서 값을 확인할 수 있습니다.
해당 테이블은 카카오톡의 채팅방에 대한 정보가 저장되어 있는 테이블이며, 주목해야 할 필드 5개는 다음과 같습니다.
- id : 카카오톡 채팅방의 ID
- type : 카카오톡 채팅방의 종류(1:1, 플러스챗, 그룹챗, 오픈챗)
- members : 채팅방에 속해있는 사용자의 ID
- last_message : 채팅방에 접속하기 전 보이는 미리보기 메시지
- last_updated_at : 마지막으로 올라온 메시지의 전송된 시간 (Unix epoch time)
chat_logs_dec 테이블에서 봤던 chat_id 값을 chat_rooms 테이블에서 id 값으로 확인할 수 있습니다. 카카오톡 채팅방에 플러스 챗과 1:1 챗 기록 밖에 없어서 type 값은 플러스 챗과 1:1챗만 값을 확인할 수 있는데 아마도 오픈챗, 그룹챗도 값이 다를 것이라 예상됩니다. 추후 확인해봐야겠네요
members 도 그룹챗인 경우에 어떻게 표현이 될지 생각해봤는데, 멤버 1명당 행을 새로 추가할 것 같으면서도 사용자가 많은 그룹챗인 경우 몇 백 명의 데이터를 다 추가하기에는 좀 그렇지 않나는 생각이 들기도 하네요. 이에 대해서도 추후 확인해보겠습니다.
4. KakaoTalk2.db 분석
4-1. friends table
KakaoTalk2.db 파일의 friends 테이블에는 친구로 등록된 사용자에 대한 정보가 저장되어 있습니다. 그 중 주목해야 할 필드 몇 가지를 뽑아봤습니다.
- id : 카카오톡 사용자의 ID
- name : 카카오톡 사용자의 등록된 이름(nickname 필드는 별도 존재)
- status_message : 카카오톡 사용자의 상태 메시지
- involved_chat_ids : 해당 사용자와 연관있는 채팅방의 ID
- created_at : 해당 사용자를 친구 추가한 시점으로 예상 (Unix epoch time) (검증해보진 않았습니다)
처음 봤을 때, 친구 테이블에 본인의 정보가 들어가 있어 의아했습니다. 생각을 해보니 카카오톡을 실행하고 친구 탭에 들어가면 본인의 정보도 같이 있더라구요. 아마 이 이유가 맞지 않을까 싶습니다.
KakaoTalk2.db 파일에는 friends 테이블 외에 item, item_resource 테이블이 추가로 복호화됩니다.
item 관련 테이블은 데이터가 부족해서 무슨 정보가 저장되어있는지 파악을 못했기 때문에 생략하도록 하겠습니다.
이번 포스팅은 복호화하는 방법을 중점으로 다루다보니 분석 방법에 대한 내용은 빈약하네요.
추후에 카카오톡 분석 포스팅을 추가로 올리게 된다면 다른 테이블들까지 참고해서 더 자세히 작성해보겠습니다.
'DFIR > Mobile Forensics' 카테고리의 다른 글
다양한 텔레그램 메시지 수집 방법 (14) | 2023.01.06 |
---|