HTTP Proxy em Python
Autor: zeldani | Publicado: 2015-07-14T23:26:00-03:00




O proxy age como intermediário entre o servidor local e requisições da internet, facilitando a nagevagação, controlando o acesso e fornecendo anonimato.

Criando um HTTP Proxy:

Nesse proxy, vamos criar uma função start()&nbsp;para fazer conexão entre o navegador e o servidor web.
import socket, sys, thread, httplib, re
def start():
    try:
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        s.bind(('', 8001))
        s.listen(10)
        print "[+] Ouvindo as conexoes..."
    except Exception, e:
        print "[-] Nao foi possivel iniciar o socket. :("
        sys.exit(3)
    while True:
        try:
            conn, addr = s.accept()
            data = conn.recv(4096)
            thread.start_new_thread(conn_string, (conn, addr, data))
        except KeyboardInterrupt:
            s.close()
            print "\n[-] Servidor Proxy finalizando..."
            print "[-] Saindo...\n"
            sys.exit(1)



No código acima, o módulo thread vai manter os dados atualizados enviando para a função conn_string o que for recebido. A função conn_string&nbsp;vai filtrar a url dos dados recebidos.
def conn_string(conn, addr, data):
    try:
        firstline = data.split('\n')[0] 
        url = firstline.split(' ')[1] 
        http_pos = url.find('://')
        temp = url[(http_pos+3):] # armazena a url completa
        port_pos = temp.find(':') 
        webserver_pos = temp.find('/') # encontra o final da url

        if webserver_pos == -1: 
            webserver_pos = len(temp) 
        webserver = "" 
        port = -1 

        if (port_pos == -1 or webserver_pos &lt; port_pos): 
            port = 80
            webserver = temp[:webserver_pos] # site raiz
        proxy_server(temp, webserver, port, conn, addr, data)

    except Exception, e:
        pass

Nesse proxy vamos filtrar a palavra "youtube" nos endereços requisitados. Se for encontrada, ele irá bloquear o acesso retornando a mensagem: "Acesso não autorizado!".
def proxy_server(temp, webserver, port, conn, addr, data):  
    ip_host=socket.gethostbyname(webserver)   
    consite=httplib.HTTPSConnection(webserver)
    consite.request("GET","/")
    r1=consite.getresponse()
    print "\n[+] HOST:", webserver
    print "[+] HOST_IP:", ip_host
    print "[+] STATUS: ", r1.status, r1.reason
    consite.close() 
    try:
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.connect((webserver, port))
        s.send(data)
        if re.match(".*youtube.*", temp):    
            print "\n[!] YOUTUBE: ", temp
            html='Acesso nao autorizado!'
            conn.send(html)
            conn.close()
            s.send(html)
            s.close()
        while True:
            reply = s.recv(4096)
            if (len(reply)&gt;0):
                conn.send(reply)
                conn_server(reply)
            else:
                break
        s.close()
        conn.close()

    except socket.error, (value, message):
        s.close()
        conn.close()
        sys.exit(2)

start()



Para testar, basta configurar o seu navegador para usar o proxy manual no endereço: 127.0.0.1:8001. &nbsp;Esse foi um exemplo bem simples de um servidor proxy http, baseado no código do null-byte.&nbsp;