Skip to content

Instantly share code, notes, and snippets.

@nenodias
Last active May 18, 2018 10:14
Show Gist options
  • Save nenodias/3e5ed44e8672d4e79f47 to your computer and use it in GitHub Desktop.
Save nenodias/3e5ed44e8672d4e79f47 to your computer and use it in GitHub Desktop.
Python Forwarding Proxy
# *-* coding: utf-8 *-*
import socket, sys
import threading
def tratando_host(host_proxy):
host_proxy = host_proxy.replace("Host: ", "")
index_prota_proxy = host_proxy.find(":")
port_proxy = host_proxy[index_prota_proxy:].replace(":","").replace("\r\n","") if index_prota_proxy != -1 else 80
port_proxy = int(port_proxy)
return (host_proxy, port_proxy)
def tratativa_data(data, webserver, port):
comeco = data[data.find("\r\n")+2:]
host_proxy = comeco[:comeco.find("\r\n")+2]
host_novo = "Host: "
if port != 80:
host_novo += webserver + ":" + str(port)
else:
host_novo += webserver
host_novo += "\r\n"
addr_proxy = tratando_host(host_proxy)
return (data.replace(host_proxy, host_novo), addr_proxy)
def tratativa_retornodata(data, webserver):
location = data[data.find("Location:"):]
location = location[:location.find("\r\n")]
location = location[location.find('http://'):]
host_novo = "Location: http://"
host_novo += webserver.replace("\r\n", "")
host_novo += location[7:][ (location[7:].find('/')) :]
return data.replace(location, host_novo)
def proxy_server(webserver, port, conn, addr, data):
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((webserver, port))
data, addr_proxy = tratativa_data(data, webserver, port)
print("Dados:",data)
print("Para:",webserver)
s.send(data)
while True:
reply = s.recv(buffer_size)
if len(reply) > 0:
# falta tratar o retorno pelo proxy
reply = tratativa_retornodata(reply, addr_proxy[0])
conn.send(reply)
dar = float(len(reply))
dar = float(dar / 1024.0)
dar = "%.3s" %( str(dar) )
dar = "%s KB" %( dar)
print("[*] Request Done: %s => %s <= " %( str(addr[0] ) , str(dar) ) )
else:
break
s.close()
conn.close()
except socket.error as e:
print("Erro no proxy_server")
print(e)
s.close()
conn.close()
sys.exit(1)
class Connexao(threading.Thread):
def __init__(self, conn, data, addr):
threading.Thread.__init__(self)
self.conn = conn
self.data = data
self.addr = addr
def run(self):
conn = self.conn
data = self.data
addr = self.addr
try:
first_line = data.split("\n")[0]
url = first_line.split(" ")[1]
http_pos = url.find("://")
if http_pos == -1:
temp = url
else:
temp = url[(http_pos+3):]
port_pos = temp.find(":")
webserver_pos = temp.find("/")
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]
else:
port = int ( ( temp[ ( port_pos + 1 ) :]) [:webserver_pos - port_pos -1 ] )
webserver = temp[:port_pos]
webserver = "www.google.com"
port = 80
proxy_server(webserver, port, conn, addr, data)
except Exception as e:
print("Erro no run")
print(e)
conn.close()
pass
def start():
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('', listening_port))
s.listen(max_conn)
print("[*] Initializing Sockets ...Done")
print("[*] Sockets Binded Succefully ...")
print("[*] Sockets Started Succefully [%d]\n"%(listening_port))
except Exception:
print("[*] Unable to Initialize Socket")
sys.exit(2)
while True:
try:
conn, addr = s.accept()
data = conn.recv(buffer_size)
conexao = Connexao(conn, data, addr)
conexao.run()
except KeyboardInterrupt:
print("\n[*] Proxy Server is Shuting Down ...")
s.close()
sys.exit(1)
try:
listening_port = int(input("[*] Enter Listening Port Number: "))
except KeyboardInterrupt:
print("\n[*] User registration An Interrupt")
print("[*] Application Exiting")
sys.exit()
max_conn = 5
buffer_size = 8129
start()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment