Last active
June 15, 2023 22:41
-
-
Save jazzyjackson/a804db12fcdae3cd0fea2360686c4e09 to your computer and use it in GitHub Desktop.
python MITM for holochaining
This file contains 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 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