Skip to content

Instantly share code, notes, and snippets.

@CommanderRag
Created May 8, 2021 11:50
Show Gist options
  • Select an option

  • Save CommanderRag/192493374d1b9c769cf355fb850d0f62 to your computer and use it in GitHub Desktop.

Select an option

Save CommanderRag/192493374d1b9c769cf355fb850d0f62 to your computer and use it in GitHub Desktop.
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