카카오톡 포렌식(1) - 안드로이드
카카오톡은 한국에서 가장 많이 사용되고 있는 메신저 어플리케이션이다.
그래서 디지털 포렌식 분석 시 카카오톡 데이터베이스를 분석하는 것이 매우 중요할 것이라 생각이 된다.
최근에는 멘티와 카카오톡 데이터베이스 복호화와 관련된 프로시딩을 하나 작성했다. :)
아무튼 카카오톡 분석 케이스를 나누자면 한 다섯 가지 정도가 될것 같다.
개인적으로 중요도 순으로 정렬해본다면 다음 순서가 될것같다.
1. 안드로이드
2. iOS
3. 윈도우(x86)
4. MacOS
5. linux (wine)
간단하게 이유를 설명해보자면
1. 피쳐폰 시대가 저물면서 스마트폰이 광범위하게 보급되었다.
2. 스마트폰이 널리 보급되어, 컴퓨터는 없어도 스마트폰은 가진 인구가 굉장히 많을 것이다
3. 한국에서는 안드로이드를 사용하는 갤럭시폰과 태블릿이 강세이지 않을까(추정)
4. 그 다음으로는 아이폰, 아이패드 등이 점유율이 높을 것이고
5. 개인 사용자들 중 대다수가 사용하는 운영체제 윈도우
6. 그 뒤를 이어 MacOS
7. 리눅스를 PC로, 거기다 wine으로 카카오톡을 사용하는 경우 더더욱 적을것이라 추정
뭐 이런 이유들이다.
그래서 가장 중요하다 생각되는 안드로이드 카카오톡 데이터베이스를 먼저 포스팅해볼까 한다.
1. DB 획득하기
1-1. 루팅?!
스마트폰에서 카카오톡 DB를 직접 수집하려면 루팅을 해야한다. 스마트폰의 여명기인 초창기에야 루팅의 패널티가 적었지만, 요즘은 루팅된 기기로는 금융거래를 할 수 없기때문에 루팅을 해버린다면 반쪽짜리 멍텅구리가 되고 말 것이다.
그래서 루팅을 하지않고 스마트폰의 내부 데이터를 획득할 수 있는 우회 방법을 사용할 것이다.
1-2. 안드로이드 에뮬레이터
모바일 게임을 좋아하는 독자라면 아마도 LDPlayer, Nox, Bluestack 등의 안드로이드 에뮬레이터에 대해 들어보았을 것이라 생각한다. 컴퓨터에서 안드로이드를 에뮬레이팅 할 수 있게 도와주는 프로그램인데, 우리는 이 에뮬레이터를 사용해서 내부 데이터를 열어 볼 것이다.
무엇을 사용하든 큰 차이는 없겠지만 일단 필자는 LDPlayer를 사용했다.
모바일 데이터베이스를 추출하는 과정은 다음과 같다.
1. LDPlayer 설치
2. 카카오톡 설치한 후 로그인
3. 파일 관리자를 열어 /data/data/com.kakao.talk/database 경로로 이동한다.
4. KakaoTalk.db 파일을 가져온다.
2. DB 열어보기
데스크탑 환경과는 다르게 모바일 카카오톡은 데이터베이스 전체를 암호화하지 않았다. 무슨 이유일까?
데이터베이스 파일을 통으로 암호화하고 다시 복호화하는 과정을 매번 하기는 오버헤드가 너무 크기 때문일까?
아무튼 정말 정직한 파일명을(KakaoTalk.db) 보면 sqlite db browser와 같은 도구로 바로 열어볼 수 있을것만 같은 기분이다.
데이터베이스를 열어 살펴보면 chat_logs 테이블에서 다양한 정보들을 확인할 수 있는데 'message' 컬럼을 보면 base64로 encode 되어있는 것을 볼 수 있다.
해당 데이터를 base64 decode 해보면 알 수 없는 문자열이 나타날 것이다. 왜그럴까 :D 아마도 암호화 되어있기 때문일 것이다!
그럼 복호화하면 내부 데이터를 확인할 수 있겠다. 근데 어떻게?
3. DB 복호화하기
https://github.com/jiru/kakaodecrypt
GitHub - jiru/kakaodecrypt: Decrypt chat history from the local database of Kakaotalk’s Android app
Decrypt chat history from the local database of Kakaotalk’s Android app - jiru/kakaodecrypt
github.com
복호화는 여기 공개되어 있는 코드를 참고했다.
코드를 간단하게 분석해보자면 다음과 같다.
guess_user_id.py
db 파일을 입력받아 user_id를 추정 (여기서 user_id는 사용자별로 부여되는 고유식별번호다)
KakaoDbGuessUserId class
1. chat_rooms 테이블에서 id, members 컬럼을 가져와 id를 key, members를 value로 갖는 dictionary 객체를 생성
* 여기서 id는 채팅방 별 고유식별번호, members는 해당 채팅방에 참여중인 멤버들의 고유식별번호로 추정된다.
2. 같은 번호의 채팅방 대화를 모두 찾아 members에 없는 user_id를 선별, 중복 제거 후 user_id 후보군에 삽입
* chat_logs 테이블의 chat_id 와 chat_rooms의 id 컬럼이 같은 것으로 추정
* members 리스트에는 사용자의 user_id가 들어가지 않는 것으로 추정됨
3. 모든 연산을 마친 후에 후보군에 들어온 user_id 별 백분율 계산
4. 가장 높은 확률을 가진(가장 많이 등장한) user_id를 사용자의 user_id로 추정
kakaodecrypt.py
복호화 수행
kakaoDbDecrypt class
1. 카카오톡 데이터의 enc_type(암호화 유형)을 찾는다.
2. user_id, enc_type, chipper text를 kakaoDecrypt.decrypt 함수로 넘긴다.
kakaoDecrypt class
1. key와 iv를 정의(하드코딩 된 값)
2. userid와 enc_type을 특정 algorithm을 사용해 salt 생성
3. 미리 정의된 key와 salt를 사용해 새로운 new_key를 생성
4. base64 decode를 진행한 후 ( 암호화된 값은 암호화 후에 base64 encode 되어 db에 저장되어있음)
5. new_key, iv, chippertext를 사용해 AES_CBC 모드로 decrypt
6. 복호화된 바이트 데이터를 'UTF-8' 로 디코딩
* salt 생성 algorithm이나 new_key 생성 algorithm은 설명하기 복잡하므로 code를 참조
이렇게 대화내역이 복호화된 평문 데이터를 볼 수 있다.
4. DB 분석하기
나중에! 복호화된 DB를 여러분이 직접 분석해도 좋을 것이다.
마치며
최근 핸드폰 수리업체 또는 중고 핸드폰 수거 업체에서 개인 사용자 데이터를 무단으로 복구한 뒤 이를 유포하는 사례를 뉴스에서 많이 보았다. 보면서 정말 안타깝다는 생각이 들었는데,여러분은 이런 지식을 나쁜일에 쓰지 않았으면 좋겠다.
그리고 여러분 개인의 데이터가 담긴 장치를 처리할때 복구가 되어 유포되지는 않을까 하는 생각을 한번 더 하는 것이 좋겠다.
참조
https://present4n6.tistory.com/84 - 디지털 포렌식 까마귀 선생님