Найти - Пользователи
Полная версия: Использование метода CONNECT в http-прокси
Начало » Network » Использование метода CONNECT в http-прокси
1
Romzik
Собственно, проблема в чем…
Цель: авторизоваться на 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 сервером через прокси? В чем проблема может быть? Может есть другие способы или модули? Или может для этих целей другие виды прокси лучше использовать?
Alex2ndr
Мне не понятно почему вы в пункте 5 отправляете запрос на сервер аськи, а не на прокси. Ведь точка входа в тунель у вас именно прокси. Или я не так понимаю? Вы набросайте пример и выложите сюда - посмотрим.
Вот вам 2 статейки - может пригодятся.
http://www.nestor.minsk.by/sr/2003/04/30417.html
http://tools.ietf.org/html/draft-luotonen-web-proxy-tunneling-01
Romzik
Вот нужный код…
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"
Romzik
А то, что в пункте 5 я запрашиваю не у прокси, а у аськи обьясняется следующим: почитав информацию о методе CONNECT я выяснил, что при успешном выполнении этого метода, далее создается туннель между моим клиентом и сервером аськи, и написано, что после этого можно сразу отправлять запросы, понятные целевому серверу (то бишь сервер аськи), то есть прокси дальше уже никоим образом не вмешивается в диалог МОЯ ПРОГРАММА <-> СЕРВЕР ICQ…вот…может я не так это понял, но я пробывал отправлять запросы к прокси, где вместо тела сообщения мои данные для icq сервера…но увы, безуспешно…

P.S.: спасибо за статьи, первую я уже читал, а во вторую не особо вник, так как не очень хорошо владею английским…
Alex2ndr
Попробовал ваш код. Что-то у меня так как у вас не работает. В момент прихода ответа от прокси ответа от icq сервера нету. А ваш код пытается получить ответ и на это месте падает. Если переделать так, чтобы дальше делать send_HELO, то начинает падать на всяких неопределенных переменных. И если со struct, uin и password я еще справился, то что такое xor_table я не знаю. Прокся у меня squid.
Так что дальнейшие ответы будут зависеть от наличия работающего примера.
Вот вам еще одна статейка - по моему перевод 2-й моей ссылки - http://irchat.ru/page.php?id=40
Romzik
Вот тот код, какого не хватает:
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…но в ответ не приходило что нужно…потом когда записал ответ прокси в файл, и посмотрел это в хекс, то увидел что в конце как раз и есть тот ответ что мне нужен от аськи…
Romzik
Я, если честно, может не понимаю чего…вот отправил я запрос на прокси для установления соединения с сервером аськи…прокси мне ответил, что все ОК - соединение установлено….а дальше как? дальше мне нужно напрямую с сервером аськи общааться?
мне нужно сразу после утсановления соединения через прокси получить получить 6 байт от сервера аськи…делаю это так:

buf=s.recv(6)

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

Сейчас код проверить не могу. Проверю в будни.
Romzik
Тогда у меня возникает вопрос, как в таком случае вести диалог с прокси? я нигде не нашел информации какой синтакс использовать для запросов прокси при установлении тунеля…запросы GET POST получается не подходят, как тогда прокси дать что понять что в одном случае я хочу отправить данные на удаленный сервер, а в другом случае - принять данные…? Получается что общение должно идти напрямую…или может как то можно организовать связь, не используя CONNECT?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB