43. 해킹을 시작해 봅시다
소스코드를 읽어 봅시다
TCP 통신
보내는이 IP
받는이 IP
메시지 : 안녕
Socket
소켓을 통해서 서로 데이터를 교환하는 통로
(가상의) 여친한테 “안녕"이라고 보내줘
ㅇㅋ 보냈음
나
(가상의)
여친
…
44. 해킹을 시작해 봅시다
소스코드를 읽어 봅시다
LOCO 서버와 TCP 소켓이 연결되어 있는지 확인
- 그렇지 않다면 재 접속 시도
현재 커맨드에 해당하는 패킷 생성 ( FillBuffer() )
- 커맨드 : 패킷이 메세징 과정에서 하는 역할
if(isSecureMode)
- True & Login : handshake 패킷 생성 후 암호화된 커맨드 패킷 앞에
붙이고 전송
- True & !Login : 커맨드 패킷을 암호화 하고 전송
- False: 그대로 전송
Network flow
47. 해킹을 시작해 봅시다
소스코드를 읽어 봅시다
FillBuffer 함수를 통해 현재 커맨드에
해당하는 패킷 생성
True & Login : handshake 패킷 생성 후 암호
화된 커맨드 패킷 앞에 붙이고 전송
LOCO 서버에 대한 TCP 소켓이 연결되어 있는지 확인
48. 해킹을 시작해 봅시다
소스코드를 읽어 봅시다
가장 기본이 되는 패킷
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
73. 뭐부터 하지?
소스코드를 읽고 패킷을 분석
사실 평문으로 보이므로 어렵지 아니합니다
패킷을 좀더 자세히 분석해봅시다
74. 뭐부터 하지?
소스코드를 읽고 패킷을 분석
1. 커맨드로 보이는 sendMessage가 적나라하게 보임
2. 평문( 1234567… )이 ( 카카오톡과는 다르게 ) 확연히 눈에 보임
세션키로 보이며 Base64 로 인코딩 되어 있음 (iat 와 바이트 코드로 구성)
카카오 톡처럼 bson 형태라 생각했으나 아니었음
78. 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'
80. #!/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)
81. 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()