Python MITM/Proxy

16 Views Asked by At

I've got a server application that listens on port TCP 8013 and clients will connect to it using TLS. On the firewall, I'm redirecting port 8013 over to 8813, that way my python application will get the traffic first and forward it on. When I run Wireshark on the system, I see the client hello coming in, but my application isn't sending back the server hello.

import socket
import ssl
import threading

# Function to handle client connections
def handle_client(client_socket, server_host, server_port):
    try:
        # Connect to the real server
        server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        server_socket.connect((server_host, server_port))
        
        # Create SSL context for client
        client_ssl_context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)
        
        # Set minimum TLS version
        client_ssl_context.minimum_version = ssl.TLSVersion.TLSv1_2
        
        # Create SSL context for server
        server_ssl_context = ssl.create_default_context(ssl.Purpose.SERVER_AUTH)
        
        # Set minimum TLS version
        server_ssl_context.minimum_version = ssl.TLSVersion.TLSv1_2
        
        # Wrap the client socket in SSL
        client_ssl = client_ssl_context.wrap_socket(client_socket, server_hostname=server_host)
        
        # Connect to the real server via SSL
        server_ssl = server_ssl_context.wrap_socket(server_socket, server_hostname=server_host)
        
        while True:
            # Receive data from client
            client_data = client_ssl.recv(4096)
            if not client_data:
                break
            
            # Forward data to server
            server_ssl.sendall(client_data)
            print("Data from client:", client_data.decode())
            
            # Receive data from server
            server_data = server_ssl.recv(4096)
            if not server_data:
                break
            
            # Forward data to client
            client_ssl.sendall(server_data)
            print("Data from server:", server_data.decode())
            
    except ssl.SSLError as e:
        print("SSL Error:", e)
    except Exception as e:
        print("Error:", e)
    finally:
        # Close the sockets
        client_socket.close()
        server_socket.close()

# Main function
def main():
    # Configuration
    listen_host = '10.2.1.30'
    listen_port = 8813
    server_host = '10.2.1.30' # Replace with the actual server's host
    server_port = 8013
    
    # Create socket
    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server.bind((listen_host, listen_port))
    server.listen(5)
    print(f"[*] Listening on {listen_host}:{listen_port}")
    
    try:
        while True:
            # Accept connections
            client_socket, addr = server.accept()
            print(f"[*] Accepted connection from {addr[0]}:{addr[1]}")
            
            # Start a new thread to handle the connection
            client_handler = threading.Thread(target=handle_client, args=(client_socket, server_host, server_port))
            client_handler.start()
    except KeyboardInterrupt:
        print("\n[*] Exiting...")
        server.close()

if __name__ == "__main__":
    main()
0

There are 0 best solutions below