Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 9, 2010 23:02:54

Romzik
От:
Зарегистрирован: 2010-06-09
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Использование метода CONNECT в http-прокси

Собственно, проблема в чем…
Цель: авторизоваться на icq сервере (только авторизоваться) (как это делается на питоне, всё у меня есть)
Проблема: не могу достигнуть цели, используя прокси сервер

Подробнее (если не использовать прокси):
1. Создаем подключение с сервером login.icq.com:5190 через модуль socket
2. После создания подключения, принимаем нужные данные
3. Анализируем, отправляем данные для авторизации
4. Получаем ответ, успешно или нет.
Вобщем при таком раскладе всё работает…

Подробнее (если использовать http-прокси):
1. Создаем подключение с прокси-сервером через модуль socket
2. После создания подключения, отправляем ему запрос “CONNECT login.icq.com:5190/ HTTP/1.0”
###(этой командой я прошу прокси создать тунеллированное соединение с icq сервером
3. Принимаю ответ от прокси об успешности запроса (НО! почему то в этом ответе сразу приходит и ответ от сервера аськи, хотя я думал, что на этом этапе лишь создается соединение, пришлось траффик анализировать чтобы понять, что здесь уже данные мне приходят…)
4. Извлекаем ответ от сервера аськи и анализируем.
5. Затем я пытаюсь уже отправить нужные данные на сервер аськи в сыром виде, то есть в том виде, в котором он их понимает, без какого-либо дополнительного запроса к прокси (как везде написано, после создания туннеля, прокси уже не вмешивается в передачу)
6. И вот тут проблема: в ответ приходит пустой ответ, хотя сервер должен отвечать…

Кто-нибудь подскажет как обмениваться данными с icq сервером через прокси? В чем проблема может быть? Может есть другие способы или модули? Или может для этих целей другие виды прокси лучше использовать?



Отредактировано (Июнь 9, 2010 23:05:38)

Офлайн

#2 Июнь 10, 2010 12:00:36

Alex2ndr
От:
Зарегистрирован: 2009-12-26
Сообщения: 204
Репутация: +  0  -
Профиль   Отправить e-mail  

Использование метода CONNECT в http-прокси

Мне не понятно почему вы в пункте 5 отправляете запрос на сервер аськи, а не на прокси. Ведь точка входа в тунель у вас именно прокси. Или я не так понимаю? Вы набросайте пример и выложите сюда - посмотрим.
Вот вам 2 статейки - может пригодятся.
http://www.nestor.minsk.by/sr/2003/04/30417.html
http://tools.ietf.org/html/draft-luotonen-web-proxy-tunneling-01



Офлайн

#3 Июнь 10, 2010 21:54:53

Romzik
От:
Зарегистрирован: 2010-06-09
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Использование метода CONNECT в http-прокси

Вот нужный код…

def send_FLAP(chain,chan):
global total_send
global s
global sequ
if chan==1:
chain = '\x00\x00\x00\x01'+chain
fmt='!BBHH'
buf1=struct.pack(fmt,0x2a,chan,sequ,len(chain))
sequ=sequ+1
if sequ >= 0x8000:
sequ=0x1000
s.send((buf1+chain))
total_send=total_send+len((buf1+chain))
return

def encode_password(pwd):
list = map(lambda x,y: chr(x^ord(y)), xor_table[:len(pwd)], pwd)
return string.join(list,'')

def tlv_make(type, value):
l=len(value)
fmt='!hh %ds' % l
return struct.pack(fmt, type, l, value)

def get_PLAP(rs):#Если rs=="i", то опрашиваем сервер icq
global total_recv
global s
if rs == "i":
res1=s.recv(6)
else:
res1=rs
total_recv=total_recv+6
if (len(res1)==6):
dlina=struct.unpack('!h',res1[4:6])
del res1
res1=s.recv(dlina[0])
total_recv=total_recv+dlina[0]
return res1

def send_HELO():
global s
global sequ
sequ=22784 #must be random(0x1000-0x8000)
chain = \
tlv_make(1,uin)+\
tlv_make(2,encode_password(password))+\
tlv_make(3,CLIENT_)+\
tlv_make(0x16, '\x01\x0a') + \
tlv_make(0x17, '\x00\x04') + \
tlv_make(0x18, '\x00\x3c') + \
tlv_make(0x19, '\x00\x01') + \
tlv_make(0x1a, '\x0c\x0e') + \
tlv_make(0x14, '\x00\x00\x00\x55') + \
tlv_make(0xe,'us') + tlv_make(0xf,'en')
send_FLAP(chain,01)

def proc_tlv(dat3):
ret_val = {}
while 1:
if len(dat3) < 4:
break
iden,l = struct.unpack('!hh', dat3[:4])
content = dat3[4:(l+4)]
ret_val[iden] = content
dat3 = dat3[4+l:]
return ret_val
#==========================================================
#ICQ witn proxy============================================
#==========================================================
print "connecting to proxy..."
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(proxyadress)
print "conected!"
st="CONNECT login.icq.com:5190/ HTTP/1.0\n\r\n"
print "sending request to proxy..."
s.send(st)
print "sended!"
try:
print "please wait..."
d=s.recv(1024)#Получаем ответ от прокси о результате нашего запроса
d=d.split(" ")
print "geted!"
td=d[len(d)-1]#Здесь берем концовку ответа от прокси, в котором содеожится ответ от icq
td=td.split("*")
td=td[1]
td2=td[0:5]
td3="\x2a"+td2#Немного подкорректировали и получили нужный нам ответ
try:
print 'try...'
buf=get_PLAP(td3)
print 'geted! = '+u
print "send Hello..."
send_HELO()
print 'sended!'
print 'please wait...'
buf=get_PLAP("i")###Вот на этом этапе в ответ приходит ПУСТОЙ ответ
print 'geted!'
try:
tlv_chain=proc_tlv(buf)
cookie=tlv_chain[TLV_COOKIE]
h,p = string.split(tlv_chain[TLV_REDIR],':')
print "password ok"
print h,p
except:
print "wrong password"
except: print "dont work"
except:
print "can't get"
s.close()
del s
print "closed"



Отредактировано (Июнь 10, 2010 22:19:44)

Офлайн

#4 Июнь 10, 2010 22:00:24

Romzik
От:
Зарегистрирован: 2010-06-09
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Использование метода CONNECT в http-прокси

А то, что в пункте 5 я запрашиваю не у прокси, а у аськи обьясняется следующим: почитав информацию о методе CONNECT я выяснил, что при успешном выполнении этого метода, далее создается туннель между моим клиентом и сервером аськи, и написано, что после этого можно сразу отправлять запросы, понятные целевому серверу (то бишь сервер аськи), то есть прокси дальше уже никоим образом не вмешивается в диалог МОЯ ПРОГРАММА <-> СЕРВЕР ICQ…вот…может я не так это понял, но я пробывал отправлять запросы к прокси, где вместо тела сообщения мои данные для icq сервера…но увы, безуспешно…

P.S.: спасибо за статьи, первую я уже читал, а во вторую не особо вник, так как не очень хорошо владею английским…



Отредактировано (Июнь 10, 2010 22:14:43)

Офлайн

#5 Июнь 11, 2010 12:08:33

Alex2ndr
От:
Зарегистрирован: 2009-12-26
Сообщения: 204
Репутация: +  0  -
Профиль   Отправить e-mail  

Использование метода CONNECT в http-прокси

Попробовал ваш код. Что-то у меня так как у вас не работает. В момент прихода ответа от прокси ответа от icq сервера нету. А ваш код пытается получить ответ и на это месте падает. Если переделать так, чтобы дальше делать send_HELO, то начинает падать на всяких неопределенных переменных. И если со struct, uin и password я еще справился, то что такое xor_table я не знаю. Прокся у меня squid.
Так что дальнейшие ответы будут зависеть от наличия работающего примера.
Вот вам еще одна статейка - по моему перевод 2-й моей ссылки - http://irchat.ru/page.php?id=40



Отредактировано (Июнь 11, 2010 12:09:42)

Офлайн

#6 Июнь 11, 2010 15:05:52

Romzik
От:
Зарегистрирован: 2010-06-09
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Использование метода CONNECT в http-прокси

Вот тот код, какого не хватает:

TLV_UIN=0x01
TLV_PWD=0x02
TLV_REDIR=0x05
TLV_COOKIE=0x06
CLIENT_='AOL Instant Messenger'
s=''
chain=''
seq=''
sequ=0
runn=0
total_send=0
total_recv=0
xor_table=[0xf3, 0x26, 0x81, 0xc4, 0x39, 0x86, 0xdb, 0x92, 0x71, 0xa3, 0xb9, 0xe6, 0x53, 0x7a, 0x95, 0x7c]
servericq="login.icq.com"
porticq="5190"
#proxyserver="189.57.202.1"
#proxyport="3128"
proxyserver="84.22.134.50"
proxyport="3128"
uin='123456789'#поменять на рабочий
password='123456'#поменять на рабочий
proxyadress=(proxyserver,int(proxyport))
Прокси указан рабочий, по крайней мере до этого момента работал…
По поводу того, что в ответе прокси нет ответа ну сервера аськи…тут я не знаю, я поначалу тоже так думал, и делал запрос к icq…но в ответ не приходило что нужно…потом когда записал ответ прокси в файл, и посмотрел это в хекс, то увидел что в конце как раз и есть тот ответ что мне нужен от аськи…



Отредактировано (Июнь 11, 2010 16:45:10)

Офлайн

#7 Июнь 11, 2010 20:54:38

Romzik
От:
Зарегистрирован: 2010-06-09
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Использование метода CONNECT в http-прокси

Я, если честно, может не понимаю чего…вот отправил я запрос на прокси для установления соединения с сервером аськи…прокси мне ответил, что все ОК - соединение установлено….а дальше как? дальше мне нужно напрямую с сервером аськи общааться?
мне нужно сразу после утсановления соединения через прокси получить получить 6 байт от сервера аськи…делаю это так:

buf=s.recv(6)

И что из этого получается? Это я таким образом прошу от прокси 6 байт? Или прокси понимает, запрашивает у icq сервера эти 6 байт и пересылает мне?



Отредактировано (Июнь 11, 2010 21:02:05)

Офлайн

#8 Июнь 14, 2010 01:49:45

Alex2ndr
От:
Зарегистрирован: 2009-12-26
Сообщения: 204
Репутация: +  0  -
Профиль   Отправить e-mail  

Использование метода CONNECT в http-прокси

Romzik
Я, если честно, может не понимаю чего…вот отправил я запрос на прокси для установления соединения с сервером аськи…прокси мне ответил, что все ОК - соединение установлено….а дальше как? дальше мне нужно напрямую с сервером аськи общааться?
Представьте такую ситуацию: Вам сервер аськи не доступен напрямую, а доступен только прокси. А вот проксЕ этот сервер аськи доступен. Например корпоративная сеть - выход в инет только через проксю. Как вы думаете что будет, если слать напрямую серверу аськи? Думаю фаервол эти пакеты просто дропнет. Таким образом вы должны общаться черз тунель. Т е вы шлете проксе, а она в свою очередь серверу аськи. А ответы сервер аськи направляет проксе, которая в свою очередь пересылает их вам.

Сейчас код проверить не могу. Проверю в будни.



Офлайн

#9 Июнь 14, 2010 07:29:30

Romzik
От:
Зарегистрирован: 2010-06-09
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Использование метода CONNECT в http-прокси

Тогда у меня возникает вопрос, как в таком случае вести диалог с прокси? я нигде не нашел информации какой синтакс использовать для запросов прокси при установлении тунеля…запросы GET POST получается не подходят, как тогда прокси дать что понять что в одном случае я хочу отправить данные на удаленный сервер, а в другом случае - принять данные…? Получается что общение должно идти напрямую…или может как то можно организовать связь, не используя CONNECT?



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version