해킹을 시작해 봅시다
소스코드를읽어 봅시다
TCP 통신
보내는이 IP
받는이 IP
메시지 : 안녕
Socket
소켓을 통해서 서로 데이터를 교환하는 통로
(가상의) 여친한테 “안녕"이라고 보내줘
ㅇㅋ 보냈음
나
(가상의)
여친
…
44.
해킹을 시작해 봅시다
소스코드를읽어 봅시다
LOCO 서버와 TCP 소켓이 연결되어 있는지 확인
- 그렇지 않다면 재 접속 시도
현재 커맨드에 해당하는 패킷 생성 ( FillBuffer() )
- 커맨드 : 패킷이 메세징 과정에서 하는 역할
if(isSecureMode)
- True & Login : handshake 패킷 생성 후 암호화된 커맨드 패킷 앞에
붙이고 전송
- True & !Login : 커맨드 패킷을 암호화 하고 전송
- False: 그대로 전송
Network flow
해킹을 시작해 봅시다
소스코드를읽어 봅시다
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
뭐부터 하지?
소스코드를 읽고패킷을 분석
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)
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()