【发布时间】:2016-01-27 15:33:19
【问题描述】:
我正在尝试制作一个适用于 HTTPS 请求的代理。我想做的代理只需要隧道和数据包,不要打扰它们。所以我尝试在浏览器和代理之间建立连接,例如浏览器向谷歌发送一个 CONNECT 请求,然后我创建了一个新的套接字,它创建自己的连接请求到相同的主机和端口,但谷歌例如返回一个 BAD请求方法。我该怎么办?
我只想使用httplib 和sockets 为HTTPS 做一个简单的隧道代理。这是我的代码:
import socket
从数据包导入 * 导入httplib
类 SockClient:
def __init__(self,sock,addr):
print "[*]New client has joined! ["+str(addr)+"]"
self.__sock = sock
self.__addr = str(addr)
self.__target = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
self.__open = True
def Process(self , Socklist , Clientlist):
print "[*]Receiving data. ["+self.__addr+"]"
try:
data = self.__sock.recv(1024)
except:
print "***WTF BROWSER***"
print "[*]Closing connection with target. ["+self.__addr+"]"
print "------------------------------------------------- ["+self.__addr+"]"
self.__target.close()
self.__sock.close()
Socklist.remove(self.__sock)
Clientlist.remove(self)
self.__open = True
return 1
print "[*]Data received. ["+self.__addr+"]"
print "[*]Data:\r\n" + data
print "[*]Analyzing data. ["+self.__addr+"]"
if data == "":
print "[*]Client closed connection. ["+self.__addr+"]"
print "[*]Closing connections with target. ["+self.__addr+"]"
print "------------------------------------------------- ["+self.__addr+"]"
self.__target.close()
self.__sock.close()
Socklist.remove(self.__sock)
Clientlist.remove(self)
self.__open = True
return 1
print "[*]Creating packet. ["+self.__addr+"]"
packet = Packet(data)
print "[*]Packet created. ["+self.__addr+"]"
print "[*]Connecting to target. ["+self.__addr+"]"
if self.__open:
self.__target.connect((packet.GetHost() , packet.GetPort()))
if packet.GetRequest() == "CONNECT":
#send 200 ok packet to client and closes connections.
self.__sock.send("HTTP/1.1 200 Connection established\r\nProxy-Agent: Gladis\r\n\r\n")
print "SEND 200 OK PLZ"
print "[*]Closing connections with client and target. ["+self.__addr+"]"
print "------------------------------------------------- ["+self.__addr+"]"
self.__target.close()
self.__sock.close()
Socklist.remove(self.__sock)
Clientlist.remove(self)
self.__open = True
return 1
'''
try:
if self.__open:
if packet.GetPort() == 443:
self.__target = httplib.HTTPSConnection(packet.GetHost(),443)
if packet.GetRequest() == "CONNECT":
#send 200 ok packet to client and closes connections.
self.__target.connect()
resp = self.__target.getresponse()
print resp.status , resp.reason
page = resp.read()
print page
self.__sock.send("HTTP/1.1 200 OK\r\nContent-Length: "+str(len(page))+"\r\n\r\n" + page)
print "SEND 200 OK PLZ"
print "[*]Closing connections with client and target. ["+self.__addr+"]"
print "------------------------------------------------- ["+self.__addr+"]"
self.__target.close()
self.__sock.close()
Socklist.remove(self.__sock)
Clientlist.remove(self)
self.__open = True
return 1
else:
self.__target.connect((packet.GetHost() , packet.GetPort()))
self.__open = False
except:
print "***COULDNT MAKE CONNECTION WITH TARGET***"
print "[*]Closing connections with client. ["+self.__addr+"]"
print "------------------------------------------------- ["+self.__addr+"]"
self.__target.close()
self.__sock.close()
Socklist.remove(self.__sock)
Clientlist.remove(self)
self.__open = True
return 1
'''
print "[*]Connection estabished. ["+self.__addr+"]"
print "[*]Sending packet to target. ["+self.__addr+"]"
try:
self.__target.send(packet.GetPacket())
except:
print "[*]Sending packet failed. ["+self.__addr+"]"
print "[*]Closing connections with client. ["+self.__addr+"]"
print "------------------------------------------------- ["+self.__addr+"]"
self.__target.close()
self.__sock.close()
Socklist.remove(self.__sock)
Clientlist.remove(self)
self.__open = True
return 1
print "[*]Packet sent. ["+self.__addr+"]"
print "[*]Waiting for response. ["+self.__addr+"]"
try:
reply = self.__target.recv(8192)
except:
print "***ERROR IN RECV***"
print "[*]Closing connections with client and server. ["+self.__addr+"]"
print "------------------------------------------------- ["+self.__addr+"]"
self.__target.close()
self.__sock.close()
Socklist.remove(self.__sock)
Clientlist.remove(self)
self.__open = True
return 1
print "[*]Reply received. ["+self.__addr+"]"
print "[*]Reply:\r\n"+ reply
print "[*]Analyzing reply. ["+self.__addr+"]"
if reply == "":
print "[*]Target closed connection. ["+self.__addr+"]"
print "[*]Closing connection with client. ["+self.__addr+"]"
print "------------------------------------------------- ["+self.__addr+"]"
self.__target.close()
self.__sock.close()
Socklist.remove(self.__sock)
Clientlist.remove(self)
self.__open = True
return 1
print "[*]Sending reply to client. ["+self.__addr+"]"
try:
self.__sock.send(reply)
except:
print "***ERROR IN SEND***"
print "[*]Closing connection with target. ["+self.__addr+"]"
print "------------------------------------------------- ["+self.__addr+"]"
self.__target.close()
self.__sock.close()
Socklist.remove(self.__sock)
Clientlist.remove(self)
self.__open = True
return 1
print "[*]Reply sent. ["+self.__addr+"]"
print "[*]Closing connections with client and server[Done!]. ["+self.__addr+"]"
self.__target.close()
self.__sock.close()
Socklist.remove(self.__sock)
Clientlist.remove(self)
print "------------------------------------------------- ["+self.__addr+"]"
def GetSock(self):
return self.__sock
【问题讨论】: