카카오톡으로 여친 만들기
김태훈
나이 : 22
carpedm20
카카오톡으로 여친 만들기
카카오톡으로 여친 만들기
카카오톡?
카카오톡?
모바일 인스턴트 메신저
Mobile instant messenger
모바일 인스턴트 메신저
카카오톡?
HTTP
2011.11 이전
모바일 인스턴트 메신저
카카오톡?
모바일 인스턴트 메신저
카카오톡?
겁나 빠른 황소 프로젝트
2011.11 이후
모바일 인스턴트 메신저
카카오톡?
겁나 빠른 황소 프로젝트 = LOCO 프로토콜
2011.11 이후
LOCO 프로토콜
카카오톡으로 여친 만들기
여친?
카카오톡으로 여친 만들기
여친?
신화 속에서나 등장하는 상상의 동물
ASKY
여친?
신화 속에서나 등장하는 상상의 동물
목표 : 여친을 만들자 (X)
가상의 여친을 만들자 (O)
Imaginary girlfriend
여친?
신화 속에서나 등장하는 상상의 동물
‘가상의 여친’, 조건 2가지
여친?
신화 속에서나 등장하는 상상의 동물
‘가상의 여친’, 조건 2가지
1. 나의 말을 들을 수 있다.
여친?
신화 속에서나 등장하는 상상의 동물
‘가상의 여친’, 조건 2가지
1. 나의 말을 들을 수 있다.
2. 나의 말에 대한 대답을 할 수 있다.
여친?
신화 속에서나 등장하는 상상의 동물
‘가상의 여친’, 조건 2가지
1. 나의 메시지를 읽을 수 있다.
2. 나의 메시지에 대한 답장을 할 수 있다.
카카오톡에 살고 있는
해킹을 시작해 봅시다
Let’s start hacking
해킹을 시작해 봅시다
우리에게 필요한 것?
# include <stdio.h>
int kakaoTalk()
{
sendMessage(“카카오톡으로 여친 만들기”);
return 0;
}
해킹을 시작해 봅시다
우리에게 필요한 것?
해킹을 시작해 봅시다
우리에게 필요한 것?
카카오톡 ≠ 오픈 소스
Life is short, you need HeXA
해킹을 시작해 봅시다
우리에게 필요한 것?
디컴파일
Decompile
해킹을 시작해 봅시다
우리에게 필요한 것?
카카오톡 초기 버전 어플리케이션
KakaoTalk application in 2006
해킹을 시작해 봅시다
우리에게 필요한 것?
우리를 환영하는 “소스 코드 난독화”
Source code obfuscation
해킹을 시작해 봅시다
우리에게 필요한 것?
읽어볼 테면 읽어봐
<- 카카오톡 소스 코드의 공격
Java
.apk
Objective C
.ipa
C#
.xap
Java
.jar
해킹을 시작해 봅시다
우리에게 필요한 것?
Java
상대적으로 구하기 쉬움
C#
상대적으로 분석하기 쉬움
해킹을 시작해 봅시다
우리에게 필요한 것?
어떻게 구하지?
해킹을 시작해 봅시다
해킹을 시작해 봅시다
어떻게 구하지?
해킹을 시작해 봅시다
어떻게 구하지?
해킹을 시작해 봅시다
어떻게 구하지?
해킹을 시작해 봅시다
어떻게 구하지?
그렇게 아무 일도 일어나지 않았다...
검색에 왕도는 없었다...
해킹을 시작해 봅시다
어떻게 구하지?
by carpdm20
해킹을 시작해 봅시다
어떻게 구하지?
결국... 성공!
Reversing
소스코드를 읽어 봅시다
해킹을 시작해 봅시다
해킹을 시작해 봅시다
소스코드를 읽어 봅시다
얘네는 뭐지? C#, Java 인건 알겠는데...
해킹을 시작해 봅시다
소스코드를 읽어 봅시다
그냥 zip 파일
해킹을 시작해 봅시다
소스코드를 읽어 봅시다
해킹을 시작해 봅시다
소스코드를 읽어 봅시다
음...
해킹을 시작해 봅시다
소스코드를 읽어 봅시다
찾음ㅋ
해킹을 시작해 봅시다
소스코드를 읽어 봅시다
.Net Reflector
0
<- 우왕! 코드가 보여요
해킹을 시작해 봅시다
소스코드를 읽어 봅시다
TCP 통신
보내는이 IP
받는이 IP
메시지 : 안녕
Socket
소켓을 통해서 서로 데이터를 교환하는 통로
(가상의) 여친한테 “안녕"이라고 보내줘
ㅇㅋ 보냈음
나
(가상의)
여친
…
해킹을 시작해 봅시다
소스코드를 읽어 봅시다
 LOCO 서버와 TCP 소켓이 연결되어 있는지 확인
- 그렇지 않다면 재 접속 시도
 현재 커맨드에 해당하는 패킷 생성 ( FillBuffer() )
- 커맨드 : 패킷이 메세징 과정에서 하는 역할
 if(isSecureMode)
- True & Login : handshake 패킷 생성 후 암호화된 커맨드 패킷 앞에
붙이고 전송
- True & !Login : 커맨드 패킷을 암호화 하고 전송
- False: 그대로 전송
Network flow
해킹을 시작해 봅시다
소스코드를 읽어 봅시다
 ADDMEM
 NOTIREAD
 LEAVE
 READ
 BUY
 CWRITE
 LOGIN
 PING
 WRITE
 BLOCK
 NCHATLIST
 CHATON
 CHATOFF
 UPDATECHAT
 UNBLOCK
 UPSEEN
 CHATLIST
 WRITE
커맨드 종류
해킹을 시작해 봅시다
소스코드를 읽어 봅시다
해킹을 시작해 봅시다
소스코드를 읽어 봅시다
FillBuffer 함수를 통해 현재 커맨드에
해당하는 패킷 생성
True & Login : handshake 패킷 생성 후 암호
화된 커맨드 패킷 앞에 붙이고 전송
LOCO 서버에 대한 TCP 소켓이 연결되어 있는지 확인
해킹을 시작해 봅시다
소스코드를 읽어 봅시다
 가장 기본이 되는 패킷
 Packet ID : 패킷 번호
 Status Code : 보통 0
 Method = 커맨드
Ex) LOGIN, ADDMEM , ACHATLIST
 Body Type : 0
 Body Length
 Body Contents
- bson 형태로 전송됨
출처 : http://www.bpak.org/
{ msg : “안녕”,
time : 20131012,
to : “(가상의) 여친” }
LocoPacket
해킹을 시작해 봅시다
소스코드를 읽어 봅시다
출처 : http://www.bpak.org/
해킹을 시작해 봅시다
소스코드를 읽어 봅시다
커맨드 종류
해킹을 시작해 봅시다
소스코드를 읽어 봅시다
BUY
Encrypted
LOGIN
Handshake
WRITE
loco.kakao.com
Host
port
Host:port
AES key
(랜덤 생성됨)
Encrypted
AES key
public key로
RSA encryptLOGIN
AES
12
6
7
3
45
서버 측에서는 Private key로 RSA decrypt
Network
패킷패킷패킷 실제로 어떻게 생겼을까?
해킹을 시작해 봅시다
해킹을 시작해 봅시다
패킷패킷패킷 실제로 어떻게 생겼을까?
Wireshark
해킹을 시작해 봅시다
패킷패킷패킷 실제로 어떻게 생겼을까?
Wireshark
HTTP Request
HTTP Response
해킹을 시작해 봅시다
패킷패킷패킷 실제로 어떻게 생겼을까?
 LOCO 서버 정보 및 소켓 요청
 non-secure 모드
- 암호화 되지 않고 LocoPacket 형태로 그대로 전송됨
BUY 커맨드
해킹을 시작해 봅시다
패킷패킷패킷 실제로 어떻게 생겼을까?
Handshake
with RSA
encrypted
AES key
AES
Encrypted
Login
AES
Encrypted
Response
Handshake + LOGIN 커맨드
이제 남은건?
카카오톡으로 여친 만들기
po코딩wer
카카오톡으로 여친 만들기
이제 남은건?
이제 남은건?
po코딩wer
이제 남은건?
po코딩wer
이제 남은건?
po코딩wer
끗
And?
LINE으로 여친 만들기
뭐부터 하지?
LINE 초기 버전 어플리케이션
LINE application in 2008(?)
뭐부터 하지?
뭐부터 하지?
LINE 초기버전 어플리케이션
성공!
뭐부터 하지?
LINE 초기버전 어플리케이션
찾음ㅋ
뭐부터 하지?
LINE 초기버전 어플리케이션
Code & packet reversing
소스코드를 읽고 패킷을 분석해봅시다
뭐부터 하지?
LINE auth에 이용된다고 추측되는 URL : gm.line.naver.jp/S3
뭐부터 하지?
소스코드를 읽고 패킷을 분석
.Net Reflector
뭐부터 하지?
소스코드를 읽고 패킷을 분석
Wireshark
#!/usr/bin/python
# -*- coding: utf-8 -*-
__author__ = 'carpedm20'
import urllib2
def send():
url = 'http://gm.line.naver.jp/S3'
headers = { 'POST' : '/S3',
'X-Line-Application' : 'WINPHONE.1.7.0.71.WindowsPhone.7.10.7720',
'Referer' : 'file:///Applications/Install/???/Install/',
'Accept-Encoding' : 'identity',
'Content-Type' : 'application/x-thrift',
'Accept' : 'application/x-thrift',
'X-Line-Access' : '???',
'Connection' : 'Keep-Alive',
'User-Agent' : 'WindowsPhone 1.7.0.71',
'HOST' : 'gm.line.naver.jp',
'Cache-Control' : 'no-cache'}
data='x80x01x00x01 ...생략... x0ex00x00x00'
request = urllib2.Request(url, data, headers)
response = urllib2.urlopen(request)
print "[*] Result "
data = response.read()
print data
#data = json.loads(data ,encoding='utf-8')
send()
뭐부터 하지?
소스코드를 읽고 패킷을 분석
성공!
뭐부터 하지?
소스코드를 읽고 패킷을 분석
사실 평문으로 보이므로 어렵지 아니합니다
패킷을 좀더 자세히 분석해봅시다
뭐부터 하지?
소스코드를 읽고 패킷을 분석
1. 커맨드로 보이는 sendMessage가 적나라하게 보임
2. 평문( 1234567… )이 ( 카카오톡과는 다르게 ) 확연히 눈에 보임
세션키로 보이며 Base64 로 인코딩 되어 있음 (iat 와 바이트 코드로 구성)
카카오 톡처럼 bson 형태라 생각했으나 아니었음
뭐부터 하지?
소스코드를 읽고 패킷을 분석
보내지는 파라미터 확인
뭐부터 하지?
소스코드를 읽고 패킷을 분석
아까 봤던 커맨드 확인
뭐부터 하지?
소스코드를 읽고 패킷을 분석
보내지는 파라미터 확인
data = 'x80x01x00x01'
data += 'x00x00x00x0b' # length of function
data += 'sendMessage‘
## Message information for static message ##
data += 'x00x00x00x00'
data += 'x08x00x01x00'
data += 'x00x00x00x0c'
data += 'x00x02x0bx00'
# x01x00x00x00 : from
# x02x00x00x00 : to
data += 'x02x00x00x00' # to
data += '????' # chat id to send message
data += 'x0bx00x0a' # ChatId footer
message = raw_input(">> ")
## Length of message ##
data += struct.pack('>I',len(message))
data += message
## Message footer ##
data += 'x02x00x0ex00x00x00'
뭐부터 하지?
소스코드를 읽고 패킷을 분석
+ =
#!/usr/bin/python#
-*- coding: utf-8 -*-
__author__ = 'carpedm20’
import urllib2
import struct
url = 'http://gm.line.naver.jp/S3‘
headers = { 'POST' : '/S3',
'X-Line-Application' : 'WINPHONE.1.7.0.71.WindowsPhone.7.10.7720',
'Referer' : 'file:///Applications/Install/A18DAAA9-9A1C-4064-91DD-794644CD88E7/Install/',
'Accept-Encoding' : 'identity',
'Content-Type' : 'application/x-thrift',
'Accept' : 'application/x-thrift',
'X-Line-Access' : '????';
'Connection' : 'Keep-Alive',
'User-Agent' : 'WindowsPhone 1.7.0.71',
'HOST' : 'gm.line.naver.jp',
'Cache-Control' : 'no-cache'}
def send():
data = 'x80x01x00x01x00x00x00x0b‘
data += 'sendMessage‘
data += 'x00x00x00x00x08x00x01x00x00x00x00x0cx00x02x0bx00x02x00x00x00‘
data += '????' # chat id to send message
data += 'x0bx00x0a‘
message = raw_input(">> ")
data += struct.pack('>I',len(message))
data += message
data += 'x02x00x0ex00x00x00‘
request = urllib2.Request(url, data, headers)
response = urllib2.urlopen(request)
print "[*] Result “
data = response.read()
for d in data:
print "%#x" % ord(d)
def read():
data = 'x80x01x00x01' # TBinaryProtocol.VERSION_1 | type
data += 'x00x00x00x0f‘
data += 'fetchOperations‘
data += 'x00x00x00x00x0a‘
data += 'x00x02x00x00x00x00x00x00x00xf9x08x00x03x00x00x00x14x00‘
request = urllib2.Request(url, data, headers)
response = urllib2.urlopen(request)
print "[*] Result “
data = response.read()
for d in data:
print "%#x" % ord(d),
print
print data
while 1:
send()
뭐부터 하지?
소스코드를 읽고 패킷을 분석
카카오 톡과는 다르게 스티커를 마음대로 쓸 수 없었다... 주륵
Demo
역시 세미나의 지루함은 데모로 날려버려야 제맛!
이제 남은건?
po코딩wer
끝
End!

카카오톡으로 여친 만들기 2013.06.29