【问题标题】:HTTPS proxy CONNECT issueHTTPS 代理连接问题
【发布时间】:2016-01-27 15:33:19
【问题描述】:

我正在尝试制作一个适用于 HTTPS 请求的代理。我想做的代理只需要隧道和数据包,不要打扰它们。所以我尝试在浏览器和代理之间建立连接,例如浏览器向谷歌发送一个 CONNECT 请求,然后我创建了一个新的套接字,它创建自己的连接请求到相同的主机和端口,但谷歌例如返回一个 BAD请求方法。我该怎么办?

我只想使用httplibsockets 为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

【问题讨论】:

    标签: python sockets proxy


    【解决方案1】:

    CONNECT 方法仅用于客户端和代理之间,使代理创建隧道,即指定隧道的最终目标。一旦与 CONNECT 请求中给出的服务器建立 TCP 连接,代理就会向 CONNECT 请求发送一个肯定响应。之后,客户端和代理之间的所有数据都简单地传输到服务器并返回。 CONNECT 请求本身不会转发到服务器。

    有关详细信息,请参阅RFC 2817

    【讨论】:

    • 请在链接中总结相关细节。
    • 代理只是一个隧道。 CONNECT 方法从浏览器发送到特定主机。我只是想通过代理从浏览器获取数据包到服务器。
    • @Nostalgia72:查看编辑后的响应 - CONNECT 仅在客户端和代理之间完成,而不是在代理和服务器之间完成。
    • @Steffen Ullrich 我按照你说的做了,之后浏览器关闭了连接。浏览器向代理发送了 CONNECT 请求,并且代理与服务器建立了 TCP 连接,但是当代理以“HTTP/1.1 200 Connection established\r\nProxy-Agent: Gladis”响应浏览器时,浏览器关闭了连接。或停止发送数据包。
    • @Nostalgia72:请更新代码以反映您所做的事情。请注意,任何 HTTP 请求和响应标头都必须以 \r\n\r\n 结尾,您的代码中似乎并非如此。
    猜你喜欢
    • 2018-08-02
    • 1970-01-01
    • 2013-03-13
    • 1970-01-01
    • 2018-03-20
    • 1970-01-01
    • 1970-01-01
    • 2016-09-20
    • 1970-01-01
    相关资源
    最近更新 更多