Guest User

Proxy server

a guest
Mar 2nd, 2016
3,706
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. # BASED ON: http://null-byte.wonderhowto.com/how-to/sploit-make-proxy-server-python-0161232/
  2.  
  3. """
  4. ISSUES: it hangs, https doesn't work well with it.
  5. if you can help fix email here admin@anim.ga
  6.  
  7. """
  8.  
  9.  
  10. ###
  11. # config.py
  12. ###
  13.  
  14. # if you want to spoof the useragent then,
  15. # replace "$MyAgent" with the desired agent.
  16. # For example,
  17. # agent="Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:44.0) Gecko/20100101 Firefox/44.0"
  18.  
  19. host="127.0.0.1"
  20. port=8888
  21. byte=8192
  22. listeners=5
  23. agent="$MyAgent"
  24.  
  25.  
  26. ###
  27. # Proxy.py
  28. ###
  29.  
  30. import socket, select, time, config, sys, re
  31. from thread import start_new_thread as thread
  32. def Print(val):
  33.     sys.stdin.flush()
  34.     sys.stdout.write(val)
  35.    
  36. class ProxyServerData(object):
  37.     def __init__(self, con, addr, data):
  38.         self.bytes = config.byte
  39.         self._con = con
  40.         self._addr = addr
  41.         self._data = data
  42.         self.sock = socket.socket()
  43.         self._sendAll()
  44.  
  45.     def _get_addr(self):
  46.         data = self._data.split('\n')[0]
  47.         try:
  48.             url = data.split(" ")[1]
  49.         except:
  50.             m = re.search("CONNECT (.*?):443", data)
  51.             print m
  52.             url = m.group(0)
  53.         h_pos = url.find("://")
  54.         if (h_pos) ==-1:
  55.             tmp = url
  56.         else:
  57.             tmp = url[(h_pos+3):]
  58.            
  59.         m = re.search("(.*\.\w+)", tmp)
  60.         return m.group(0)
  61.    
  62.     def _get_port(self):
  63.         url = self._get_addr()
  64.         port_pos = url.find(":")
  65.         if port_pos == -1:
  66.             return 80
  67.         else:
  68.             m = re.search(":(\d+)", url)
  69.             print m.group(0)
  70.    
  71.     def _socket_format(self):
  72.         return (self._get_addr(), int(self._get_port()))
  73.  
  74.     def _get_extra(self):
  75.         data = self._data.split('\n')[0]
  76.         url = data.split(" ")[1]
  77.         h_pos = url.find("://")
  78.         if h_pos == -1:
  79.             extra = "/"
  80.         else:
  81.             url = url.replace("//", "")
  82.             m = re.search("(/.+)", url)
  83.         return m.group(0)
  84.        
  85.        
  86.     def _sendAll(self):
  87.         sock = self.sock
  88.         try:
  89.             sock.connect(self._socket_format())
  90.             sock.send(data)
  91.             while True:
  92.                 reply = sock.recv(self.bytes)
  93.                 if (len(reply) > 0):
  94.                     self._con.send(reply)
  95.                     dar = float(len(reply))
  96.                     dar = float(dar / 1024)
  97.                     dar = "%.3s" % (str(dar))
  98.                     dar = "%sKB" % (dar)
  99.                     print("[*] Request Done: %s => %s <= %s" % (self._addr[0], dar))
  100.                 else:
  101.                     break
  102.             sock.close()
  103.             self._con.close()
  104.         except:
  105.             self._con.send("Error can't connect to %s" % self._get_addr())
  106.            
  107. class ProxyServer(object):
  108.     def __init__(self):
  109.         self._host = (config.host, config.port)
  110.         self._socket = socket.socket()
  111.         self._socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  112.         self._socket.setblocking(False)
  113.         self._agent = config.agent
  114.         self._bytes = config.byte
  115.         self._delay = config.delay
  116.         self._listeners = config.listeners
  117.         self._cons = list()
  118.         self._log = Print
  119.         self._proxy = ProxyServerData
  120.  
  121.     def _bind(self):
  122.         self._socket.bind(self._host)
  123.         self._socket.listen(self._listeners)
  124.        
  125.     def main(self):
  126.         self._cons.append(self._socket)
  127.         while True:
  128.             rl, xl, wl = select.select(self._cons, [], [])
  129.             for sock in rl:
  130.                 if sock == self._socket:
  131.                     sock, ip = self._socket.accept()
  132.                     self._on_connect()
  133.                     self._cons.append(sock)
  134.                 elif sock == None:
  135.                     self._socket.close()
  136.  
  137.                 data = sock.recv(self._bytes)
  138.                 if not data:
  139.                         self._on_close(sock)
  140.                 else:
  141.                     agent = self._get_agent_header(data)
  142.                     if not agent == "NO_AGENT":
  143.                         agent_new = self._agent.replace("$MyAgent", agent)
  144.                         data = data.replace(agent, agent_new)
  145.                         thread(self._proxy, (sock, ip, data))
  146.                     else:
  147.                         thread(self._proxy, (sock, ip, data))
  148.                
  149.  
  150.     def _on_close(self, sock):
  151.         self._cons.remove(sock)
  152.         self._log("client dc {0} left".format(self._count()))
  153.         sock.close()
  154.  
  155.     def _on_connect(self):
  156.         self._log("connection made, {0} clients connected".format(self._count()))
  157.  
  158.     def _count(self):
  159.         c = len(self._cons) - 1
  160.         return c
  161.    
  162.     def _get_agent_header(self, data):
  163.         pat = "User-Agent: (.+)"
  164.         m = re.search(pat, data)
  165.         if m:
  166.             return m.group(0)
  167.         else:
  168.             return "NO_AGENT"
  169.        
  170.     def _recvall(self, sock, count):
  171.         buf = b''
  172.         while count:
  173.             newbuf = sock.recv(count)
  174.             if not newbuf: return None
  175.             buf += newbuf
  176.             count -= len(newbuf)
  177.         return buf  
  178. if __name__ == '__main__':
  179.     server = ProxyServer()
  180.     server._bind()
  181.     server.main()
RAW Paste Data