0

here is my code in python 3. It is working properly for TCP But Not For UDP as per brooktest

I want this code to be working for UDP also as it is working for TCP

This implementation handles both TCP and UDP connections by checking the SOCKS5 command in the client request message. If the command is TCP CONNECT, it connects to the remote server and starts relaying data between the client and the remote server.

import socket


def handle_tcp(sock, remote_addr):
    # Connect to the remote server
    remote_sock = socket.create_connection(remote_addr)

    # Send a success response to the client
    reply = b'\x05\x00\x00\x01' + socket.inet_aton('0.0.0.0') + b'\x00\x00'
    sock.sendall(reply)

    # Start relaying data between the client and the remote server
    try:
        while True:
            data = sock.recv(4096)
            if not data:
                break
            remote_sock.sendall(data)
            data = remote_sock.recv(4096)
            if not data:
                break
            sock.sendall(data)
    finally:
        remote_sock.close()
        sock.close()


def handle_udp(sock, data):
    # Modify data as needed here
    return data


def handle_request(sock):
    # Read initial handshake message from client
    version, nmethods = sock.recv(2)
    assert version == 5, "Invalid SOCKS version"
    assert sock.recv(nmethods) == b'\x00' * nmethods, "Unsupported authentication method"

    # Send server method selection message
    sock.sendall(b'\x05\x00')

    # Read client request message
    version, cmd, _, addrtype = sock.recv(4)
    assert version == 5, "Invalid SOCKS version"
    assert cmd in (1, 3), "Unsupported command"
    if cmd == 1:
        assert addrtype == 1, "Unsupported address type"
        target_addr = socket.inet_ntoa(sock.recv(4))
        target_port = int.from_bytes(sock.recv(2), 'big')
        handle_tcp(sock, (target_addr, target_port))
    elif cmd == 3:
        assert addrtype == 3, "Unsupported address type"
        addr_len = ord(sock.recv(1))
        target_addr = sock.recv(addr_len)
        target_port = sock.recv(2)

        # Send server response message
        reply = b'\x05\x00\x00\x03' + bytes([addr_len]) + target_addr + target_port
        sock.sendall(reply)

        # Create new UDP socket and send/receive data
        udp_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        udp_sock.connect((target_addr, int.from_bytes(target_port, 'big')))
        while True:
            data, addr = udp_sock.recvfrom(4096)
            data = handle_udp(udp_sock, data)
            sock.sendto(data, addr)


if __name__ == '__main__':
    # Listen on all interfaces on port 1080
    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server.bind(('0.0.0.0', 1080))
    server.listen(10)
    while True:
        client, addr = server.accept()
        handle_request(client)

0 Answers0