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:
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 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 < 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)>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. Esse foi um exemplo bem simples de um servidor proxy http, baseado no código do null-byte.
0 comentários:
Postar um comentário