| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341 |
- #!/usr/bin/env python
- # -*- coding: utf-8 -*-
- # Edit By GlEmYsSoN & @e8th4ever
- from pprint import pprint
- import sys, http.client, socket, select, gzip, zlib, re, traceback, subprocess, argparse
- from socketserver import ThreadingMixIn
- from http.server import HTTPServer, BaseHTTPRequestHandler
- from threading import Lock, Timer
- from io import StringIO
- from urllib.parse import urlsplit
- subprocess.call("clear",shell=True)
- parser = argparse.ArgumentParser()
- parser.add_argument("-p", "--port", help="Nombre de archivo a procesar")
- parser.add_argument("-t", "--texto", help="Nombre de archivo a procesar")
- parser.add_argument("-i", "--ip", help="Nombre de archivo a procesar")
- args = parser.parse_args()
- if args.port:
- port = int(args.port)
- else:
- print(" Deve ingresar el puerto que usara como socks...")
- sys.exit()
- if args.texto:
- msg1 = args.texto
- else:
- msg1 = '<strong><font color="#00FFFF">A</font><font color="#6bffff">D</font><font color="#99ffff">M</font><font color="#ebffff">@</font><font color="#ebffff">R</font><font color="#ccffff">u</font><font color="#99ffff">f</font><font color="#6bffff">u</font><font color="#2effff">9</font><font color="#00FFFF">9</font></strong>'
- if args.ip:
- server = args.ip
- else:
- server = "127.0.0.1"
- msg2 = 'Server Forbidden'
- class ThreadingHTTPServer(ThreadingMixIn, HTTPServer):
- address_family = socket.AF_INET
- def handle_error(self, request, client_address):
-
- print('-'*40, file=sys.stderr)
- print('Exception happened during processing of request from', client_address, file=sys.stderr)
- traceback.print_exc()
- print('-'*40, file=sys.stderr)
-
-
- class ThreadingHTTPServer6(ThreadingHTTPServer):
- address_family = socket.AF_INET6
- class SimpleHTTPProxyHandler(BaseHTTPRequestHandler):
- global_lock = Lock()
- conn_table = {}
- timeout = 300
- upstream_timeout = 300
- proxy_via = None
- def log_error(self, format, *args):
- if format == "Request timed out: %r":
- return
- self.log_message(format, *args)
- def do_CONNECT(self):
- req = self
- reqbody = None
- if ':22' in req.path:
- hostip = req.path.replace(':22', '')
- elif ':443' in req.path:
- hostip = req.path.replace(':443', '')
- req.path = "https://%s/" % req.path.replace(':443', '')
- replaced_reqbody = self.request_handler(req, reqbody)
- if replaced_reqbody is True:
- return
- u = urlsplit(req.path)
- address = (u.hostname, u.port or 443)
- try:
- conn = socket.create_connection(address)
- except socket.error:
- return
- self.send_response(200, msg1)
- self.send_header('Connection', 'close')
- self.end_headers()
- conns = [self.connection, conn]
- keep_connection = True
- while keep_connection:
- if not server.find(hostip) != -1:
- self.send_error(403, msg2)
- self.close_connection
- keep_connection = False
- rlist, wlist, xlist = select.select(conns, [], conns, self.timeout)
- if xlist:
- break
- for r in rlist:
- other = conns[1] if r is conns[0] else conns[0]
- data = r.recv(8192)
- if data:
- other.sendall(data)
- keep_connection = True
- conn.close()
- def do_HEAD(self):
- self.do_SPAM()
- def do_GET(self):
- self.do_SPAM()
- def do_POST(self):
- self.do_SPAM()
- def do_SPAM(self):
- req = self
- content_length = int(req.headers.get('Content-Length', 0))
- if content_length > 0:
- reqbody = self.rfile.read(content_length)
- else:
- reqbody = None
- replaced_reqbody = self.request_handler(req, reqbody)
- if replaced_reqbody is True:
- return
- elif replaced_reqbody is not None:
- reqbody = replaced_reqbody
- if 'Content-Length' in req.headers:
- req.headers['Content-Length'] = str(len(reqbody))
-
- self.remove_hop_by_hop_headers(req.headers)
- if self.upstream_timeout:
- req.headers['Connection'] = 'Keep-Alive'
- else:
- req.headers['Connection'] = 'close'
- if self.proxy_via:
- self.modify_via_header(req.headers)
- try:
- res, resdata = self.request_to_upstream_server(req, reqbody)
- except socket.error:
- return
- content_encoding = res.headers.get('Content-Encoding', 'identity')
- resbody = self.decode_content_body(resdata, content_encoding)
- replaced_resbody = self.response_handler(req, reqbody, res, resbody)
- if replaced_resbody is True:
- return
- elif replaced_resbody is not None:
- resdata = self.encode_content_body(replaced_resbody, content_encoding)
- if 'Content-Length' in res.headers:
- res.headers['Content-Length'] = str(len(resdata))
- resbody = replaced_resbody
- self.remove_hop_by_hop_headers(res.headers)
- if self.timeout:
- res.headers['Connection'] = 'Keep-Alive'
- else:
- res.headers['Connection'] = 'close'
- if self.proxy_via:
- self.modify_via_header(res.headers)
- self.send_response(res.status, res.reason)
- for k, v in list(res.headers.items()):
- if k == 'set-cookie':
-
- for value in self.split_set_cookie_header(v):
- self.send_header(k, value)
- else:
- self.send_header(k, v)
- self.end_headers()
- if self.command != 'HEAD':
- self.wfile.write(resdata)
- with self.global_lock:
- self.save_handler(req, reqbody, res, resbody)
- def request_to_upstream_server(self, req, reqbody):
- u = urlsplit(req.path)
- origin = (u.scheme, u.netloc)
-
- req.headers['Host'] = u.netloc
- selector = "%s?%s" % (u.path, u.query) if u.query else u.path
- while True:
- with self.lock_origin(origin):
- conn = self.open_origin(origin)
- try:
- conn.request(req.command, selector, reqbody, headers=dict(req.headers))
- except socket.error:
-
- self.close_origin(origin)
- raise
- try:
- res = conn.getresponse(buffering=True)
- except http.client.BadStatusLine as e:
- if e.line == "''":
-
- self.close_origin(origin)
- continue
- else:
- raise
- resdata = res.read()
- res.headers = res.msg
- if not self.upstream_timeout or 'close' in res.headers.get('Connection', ''):
- self.close_origin(origin)
- else:
- self.reset_timer(origin)
- return res, resdata
- def lock_origin(self, origin):
- d = self.conn_table.setdefault(origin, {})
- if not 'lock' in d:
- d['lock'] = Lock()
- return d['lock']
- def open_origin(self, origin):
- conn = self.conn_table[origin].get('connection')
- if not conn:
- scheme, netloc = origin
- if scheme == 'https':
- conn = http.client.HTTPSConnection(netloc)
- else:
- conn = http.client.HTTPConnection(netloc)
- self.reset_timer(origin)
- self.conn_table[origin]['connection'] = conn
- return conn
- def reset_timer(self, origin):
- timer = self.conn_table[origin].get('timer')
- if timer:
- timer.cancel()
- if self.upstream_timeout:
- timer = Timer(self.upstream_timeout, self.close_origin, args=[origin])
- timer.daemon = True
- timer.start()
- else:
- timer = None
- self.conn_table[origin]['timer'] = timer
- def close_origin(self, origin):
- timer = self.conn_table[origin]['timer']
- if timer:
- timer.cancel()
- conn = self.conn_table[origin]['connection']
- conn.close()
- del self.conn_table[origin]['connection']
- def remove_hop_by_hop_headers(self, headers):
- hop_by_hop_headers = ['Connection', 'Keep-Alive', 'Proxy-Authenticate', 'Proxy-Authorization', 'TE', 'Trailers', 'Trailer', 'Transfer-Encoding', 'Upgrade']
- connection = headers.get('Connection')
- if connection:
- keys = re.split(r',\s*', connection)
- hop_by_hop_headers.extend(keys)
- for k in hop_by_hop_headers:
- if k in headers:
- del headers[k]
- def modify_via_header(self, headers):
- via_string = "%s %s" % (self.protocol_version, self.proxy_via)
- via_string = re.sub(r'^HTTP/', '', via_string)
- original = headers.get('Via')
- if original:
- headers['Via'] = original + ', ' + via_string
- else:
- headers['Via'] = via_string
- def decode_content_body(self, data, content_encoding):
- if content_encoding in ('gzip', 'x-gzip'):
- io = StringIO(data)
- with gzip.GzipFile(fileobj=io) as f:
- body = f.read()
- elif content_encoding == 'deflate':
- body = zlib.decompress(data)
- elif content_encoding == 'identity':
- body = data
- else:
- raise Exception("Unknown Content-Encoding: %s" % content_encoding)
- return body
- def encode_content_body(self, body, content_encoding):
- if content_encoding in ('gzip', 'x-gzip'):
- io = StringIO()
- with gzip.GzipFile(fileobj=io, mode='wb') as f:
- f.write(body)
- data = io.getvalue()
- elif content_encoding == 'deflate':
- data = zlib.compress(body)
- elif content_encoding == 'identity':
- data = body
- else:
- raise Exception("Unknown Content-Encoding: %s" % content_encoding)
- return data
- def split_set_cookie_header(self, value):
- re_cookies = r'([^=]+=[^,;]+(?:;\s*Expires=[^,]+,[^,;]+|;[^,;]+)*)(?:,\s*)?'
- return re.findall(re_cookies, value, flags=re.IGNORECASE)
- def request_handler(self, req, reqbody):
-
- pass
- def response_handler(self, req, reqbody, res, resbody):
-
- pass
- def save_handler(self, req, reqbody, res, resbody):
-
- pass
- def test(HandlerClass=SimpleHTTPProxyHandler, ServerClass=ThreadingHTTPServer, protocol="HTTP/1.1"):
- server_address = ('', port)
- HandlerClass.protocol_version = protocol
- httpd = ServerClass(server_address, HandlerClass)
- sa = httpd.socket.getsockname()
- print("Servidor: " + str(sa[0]) + " Porta " + str(sa[1]))
- httpd.serve_forever()
- if __name__ == '__main__':
- test()
|