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()