Skip to content

Instantly share code, notes, and snippets.

@jazzyjackson
Last active June 15, 2023 22:41
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jazzyjackson/a804db12fcdae3cd0fea2360686c4e09 to your computer and use it in GitHub Desktop.
Save jazzyjackson/a804db12fcdae3cd0fea2360686c4e09 to your computer and use it in GitHub Desktop.
python MITM for holochaining
import asyncio
import websockets
from http.server import HTTPServer, SimpleHTTPRequestHandler
from socketserver import ThreadingMixIn
myip = b'127.0.0.1'
def replace_localhost(data):
return data.replace(b'localhost', myip)
class MITMRequestHandler(SimpleHTTPRequestHandler):
def end_headers(self):
self.send_header('Access-Control-Allow-Origin', '*')
SimpleHTTPRequestHandler.end_headers(self)
def do_GET(self):
if self.path.endswith('.js'):
self.send_response(200)
self.send_header('Content-type', 'application/javascript')
self.end_headers()
with open(self.path[1:], 'rb') as f:
data = f.read()
self.wfile.write(replace_localhost(data))
else:
SimpleHTTPRequestHandler.do_GET(self)
class ThreadedHTTPServer(ThreadingMixIn, HTTPServer):
pass
async def websocket_tunnel_handler(websocket, path, local_port):
async with websockets.connect(f'ws://localhost:{local_port}') as local_ws:
async def forward_from_client():
async for message in websocket:
await local_ws.send(message)
async def forward_from_server():
async for message in local_ws:
await websocket.send(message)
await asyncio.gather(
forward_from_client(),
forward_from_server(),
)
if __name__ == '__main__':
# Start the HTTP server
http_server = ThreadedHTTPServer(('', 8000), MITMRequestHandler)
http_thread = threading.Thread(target=http_server.serve_forever, daemon=True)
http_thread.start()
# Define WebSocket tunnel handlers for each port
tunnel_handler_1235 = lambda websocket, path: websocket_tunnel_handler(websocket, path, 1235)
tunnel_handler_8889 = lambda websocket, path: websocket_tunnel_handler(websocket, path, 8889)
# Start the WebSocket servers for each port
websocket_server_1235 = websockets.serve(tunnel_handler_1235, myip, 1235)
websocket_server_8889 = websockets.serve(tunnel_handler_8889, myip, 8889)
# Run the WebSocket servers
loop = asyncio.get_event_loop()
loop.run_until_complete(websocket_server_1235)
loop.run_until_complete(websocket_server_8889)
loop.run_forever()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment