Created
May 8, 2021 11:50
-
-
Save CommanderRag/192493374d1b9c769cf355fb850d0f62 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| import socket, ssl | |
| import os, sys, threading | |
| import requests | |
| import datetime | |
| import calendar | |
| HOST = "0.0.0.0" | |
| PORT = os.environ.get("PORT") or 9000 | |
| s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) | |
| s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) | |
| s.bind((HOST, PORT)) | |
| s.listen(9) | |
| print("Server listening on port {}".format(PORT)) | |
| def url_string(conn, addr): | |
| string = request.decode("UTF-8") | |
| # if(string.find("CONNECT") != -1): | |
| # string_conn = string.replace("CONNECT", "GET") | |
| # data = string_conn.encode("UTF-8") | |
| # else: | |
| data = string.encode("UTF-8") | |
| print("Request String:", data) | |
| first_line = string.split("\n")[0] | |
| print(first_line) | |
| url = first_line.split(" ")[1] | |
| is_post_request = False | |
| if(first_line.split(" ") [0] == "POST"): | |
| is_post_request = True | |
| http_pos = url.find("://") | |
| if(http_pos == -1): | |
| temp = url | |
| else: | |
| temp = url[(http_pos + 3):] | |
| port_pos = temp.find(":") | |
| webserver = "" | |
| port = -1 | |
| path_pos = temp.find("/") | |
| path = "" | |
| if(path_pos == -1): | |
| path_pos = len(temp) | |
| else: | |
| path = temp[path_pos : len(temp)] | |
| if(port_pos == -1 or path_pos < port_pos): | |
| port = 80 | |
| webserver = temp[:path_pos] | |
| else: | |
| port = int(temp[port_pos + 1 : len(temp)]) | |
| webserver = temp[:port_pos] | |
| print(webserver + path, port) | |
| proxy_request(webserver=webserver + path, port=port) | |
| #proxy_requestV2(webserver=webserver, port=port, request=data) | |
| def proxy_request(webserver, port): | |
| headers = get_HTTP_headers() | |
| data_recv = "" | |
| try: | |
| print("Proxying request to ", addr[0]) | |
| if(port == 443): | |
| r = requests.get("https://" + webserver) | |
| data_recv = r.text | |
| send_headers_test() | |
| # do_handshake() | |
| else: | |
| r = requests.get("http://" + webserver) | |
| data_recv = r.text | |
| except Exception as e: | |
| print(str(e)) | |
| data_recv = str(e).encode() | |
| finally: | |
| print("finally block entered") | |
| merge_HTTP_headers_and_content(headers, data_recv) | |
| import certifi | |
| def do_handshake(): | |
| ca_certificates = certifi.where() | |
| #ca_certificates = certifi.contents() | |
| print("ca-certificate mozilla", ca_certificates) | |
| CIPHERS = 'ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-SHA256:AES256-SHA' | |
| context = ssl.create_default_context(purpose=ssl.Purpose.CLIENT_AUTH) | |
| #conn_s = context.wrap_socket(conn, do_handshake_on_connect=False) | |
| #conn_s = ssl.wrap_socket(conn, ssl_version=ssl.PROTOCOL_TLS, cert_reqs=ssl.CERT_OPTIONAL, ca_certs=ca_certificates, do_handshake_on_connect=False) | |
| conn_s = context.wrap_socket(conn, do_handshake_on_connect=False) | |
| print("Initiating Handshake!") | |
| conn_s.do_handshake() | |
| print("Handshake Completed! ooo maa gooo") | |
| def get_HTTP_headers(): | |
| date = datetime.date.today() | |
| date_string = date.strftime("%A") | |
| response_headers = { | |
| 'Content-Type': 'text/plain', | |
| 'Connection': 'close', | |
| 'Set-Cookie': 'cookie={}, Expires={}, {} {} {} {}'.format("verified", date_string, date.day, calendar.month_name[date.month], date.year, (datetime.datetime.now() + datetime.timedelta(minutes=30)).strftime('%H:%M:%S') ), | |
| } | |
| response_headers_raw = ''.join('%s: %s\r\n' % (k, v) for k, v in response_headers.items()) | |
| print("Sending Headers:", "\n" + response_headers_raw) | |
| response_proto ='HTTP/1.1' | |
| response_status = '200' | |
| response_status_text = 'Connection established' | |
| return ('%s %s %s' % (response_proto, response_status, response_status_text) + | |
| "\r\n" + | |
| response_headers_raw + | |
| "\r\n" + "\r\n") | |
| def merge_HTTP_headers_and_content(headers, data_recv): | |
| send_content(headers=headers, content=data_recv) | |
| def send_content(headers, content): | |
| conn.sendall(headers.encode()) | |
| conn.sendall(content.encode()) | |
| def send_headers_test(): | |
| headers = get_HTTP_headers() | |
| conn.sendall(headers.encode()) | |
| while True: | |
| conn, addr = s.accept() | |
| request = conn.recv(4704) | |
| print(request) | |
| thread = threading.Thread(target=url_string, args=(conn, addr)) | |
| thread.setDaemon(True) | |
| thread.start() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment