Intro
[*] 안드로이드 카카오톡을 대상으로 분석하였기에, 아래에 나오는 카카오톡은 안드로이드 버전의 카카오톡을 지칭합니다.
프로젝트를 진행하면서, 재미있어 보였지만 끝까지 하지는 못한 카카오톡 DB의 복호화에 관한 글을 적어 봅니다.
프로젝트 당시에는 많은 제약 조건들로 인하여 복호화 쪽은 다른 것들에 밀려 끝까지 분석해 보지 못했었습니다. 따라서 예전 분석한 것을 바탕으로 이번 기회에 시간을 더 투자하여 다시 한번 복호화를 진행하여 보았습니다. 결과부터 말하자면, 안드로이드 KakaoTalk 의 최신 버전인 v8.5.4 에서 진행하였으며 성공적으로 복호화 하였습니다.
메시지 원문
복호화할 대상을 생성하기 위하여 카카오톡 버전에 관한 정보와 DB 파일등을 주고 받았습니다.
카카오톡에서 메시지를 주고 받으면 위와 같이 평문으로 확인을 할 수 있습니다. 여기서 조금 추측을 해보자면 카카오톡이 네트워크에 연결되어 있지 않아도 채팅창에서 평문의 메시지를 확인할 수 있습니다. 따라서 서버에서 키와 관련된 정보는 받아오지 않는 것을 추측해 볼 수 있을 것 같습니다.
암호화된 DB
위는 /data/data/com.kakao.talk/databases/KakaoTalk.db 에서 추출한 카카오톡 메시지 관련 DB 입니다.
PC 버전 KakaoTalk의 경우에는 DB 자체가 암호화되어 있습니다. 반면에 안드로이드 KakaoTalk 의 경우에는 모바일이라는 특성 때문인지 messsage 부분과 attachment 부분만 암호화되어 있습니다.
즉 사용자가 주고 받은 메시지와 첨부파일에 대한 정보들만을 암호화하고 있습니다.
메시지 복호화
위는 DB를 성공적으로 복호화하여 CSV 형식으로 저장한 것입니다.
리버싱을 통해 암호화 루틴을 파악하고, smali로 되어 있는 코드를 java 코드로 구현하여 복호화를 진행하였습니다.
텍스트 메시지의 경우에는 메시지 부분에, 사진과 같은 첨부파일들은 첨부파일 부분에 카카오톡 파일 서버의 URL 과 같은 정보 등이 저장되어 있는 것을 확인할 수 있습니다.
Outro
카카오톡은 대칭키를 사용하여 message 와 attachment 부분을 암호화합니다. 따라서 카카오톡 DB 복호화의 핵심 요소는 암호화와 복호화할 때 사용하는 키입니다.
이 키는 서버에서 받아오거나 로컬에서 생성할 수 있을 텐데, 위에서 추측한 바와 같이 네트워크 연결이 없음에도 평문으로 내용을 확인할 수 있기에 로컬에서 생성할 것입니다. 실제로 DB에 저장되어 있는 값과 여러 고정 값들을 이용하여 키를 생성합니다. 이 부분은 내용이 길어지므로 나중에 별도의 글로 작성하겠습니다.
또한 필자와 같이 리버싱하여 사용자들이 카카오톡의 암호화 알고리즘을 파악할 수 있습니다. 이에 대한 변화가 필요하지만 기존에 암호화한 DB 와의 호환성을 위하여 무작정 암호화 알고리즘를 변경하기도 힘들다고 생각합니다. 따라서 카카오톡은 호환성을 유지하며 버전별로 조금씩 변화를 주며 키를 생성 하고 있습니다. 역시 이에 대한 자세한 내용은 길어질 것 같기에 나중에 별도의 글로 작성하겠습니다.
'0x10 Android' 카테고리의 다른 글
Android :: Android101 (3/3) - APK 루팅탐지 (0) | 2020.03.01 |
---|---|
Android :: Android101 (2/3) - APK 분석방법 (0) | 2020.03.01 |
Android :: Android101 (1/3) - APK 배경지식 (0) | 2020.03.01 |
Android :: 중고로운 평화나라 (0) | 2019.04.01 |