Пример #1
0
def recvThread(client):
    print("This is the thread for " + str(client.address))
    while True:

        client.socket.settimeout(0.01)

        # Acquiring receive lock in thread
        client.socketLock.acquire()

        try:
            #receive the data with the socket which previously forwarded
            data, source_address = client.socket.recvfrom(65565)

        except socket.timeout as exc:
            # Timed out receive socket in thread
            client.socketLock.release()
            # Receive lock released in thread
            continue

        client.socketLock.release()
        # Receive lock released in thread

        if not data:
            logger.error('an error ocurred')
            break

        # Fuzz returns the string is fuzzOutMode is None
        data = fuzz(data, fuzzOutMode)

        # Acquiring send lock in thread
        sSocketLock.acquire()

        printDataFrame(data, source_address, client.socket.getsockname(),
                       client.address,
                       s.getsockname()[1])
        # send the data from the socket that formerly received th datagram from the gateway
        s.sendto(data, client.address)

        global collector_address
        if collector_address:
            s.sendto(data, collector_address)

        sSocketLock.release()
Пример #2
0
def server(localPort, remoteHost, remotePort):

    global collector_address

    try:
        localPort = int(localPort)
    except:
        fail('Invalid port number: ' + str(localPort))

    try:
        remotePort = int(remotePort)
    except:
        fail('Invalid port number: ' + str(remotePort))

    try:
        # This socket will be used by the server to receive data and by the threads to send the remote back to source
        global s
        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        s.bind(('', localPort))
    except:
        fail('Failed to bind on port ' + str(localPort))

    destServer = (remoteHost, remotePort)

    print('All set.\n')

    while True:
        s.settimeout(0.01)

        # Acquiring receive lock in main thread
        sSocketLock.acquire()

        try:
            # Receive data from source
            data, source_address = s.recvfrom(65565)
        except socket.timeout as exc:
            # Timed out receive socket in main thread
            sSocketLock.release()
            # Receive lock released in main thread
            continue

        sSocketLock.release()
        # Receive lock released in main thread

        if not data:
            logger.error('an error ocurred')
            break

        # Depending on the source address, a Client object is retrieved
        knownClient = None
        knownClient = getKnownClient(source_address)

        # Fuzz returns the string is fuzzInMode is None
        data = fuzz(data, fuzzInMode)

        # Forward the data if the client is known, using a socket previously created
        if knownClient is not None:
            print("Client already registered in port: " +
                  str(knownClient.address[1]) + " Clients list lenght: " +
                  str(len(knownClients)))

            # Acquiring send lock in main thread
            knownClient.socketLock.acquire()

            printDataFrame(data, source_address, s.getsockname(), destServer,
                           knownClient.socket.getsockname()[1])

            knownClient.socket.sendto(data, destServer)

            if collector_address:
                knownClient.socket.sendto(data, collector_address)

            knownClient.socketLock.release()
            # Send lock released in main thread

        # Else, create a new socket, save client+socket, forward the data and start a listening proxy
        else:
            newSocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
            # Choose a random socket, with param 0
            newSocket.bind(('', 0))

            print("Creating a new client")
            newClient = Client(source_address, newSocket)
            knownClients.append(newClient)

            # Acquiring send lock in main thread
            newClient.socketLock.acquire()
            printDataFrame(data, source_address, s.getsockname(), destServer,
                           newSocket.getsockname()[1])

            newSocket.sendto(data, destServer)

            if collector_address:
                newSocket.sendto(data, collector_address)

            newClient.socketLock.release()
            # Send lock released in main thread

            #Create the proxy listener in a thread
            listener = threading.Thread(target=recvThread, args=(newClient, ))
            listener.daemon = True
            listener.start()
Пример #3
0
 def on_recv(self):
     data = self.data
     # here we can parse and/or modify the data before send forward
     data = fuzz(data, fuzzInMode)
     print('%r' % (data))
     self.channel[self.s].send(data)