예제 #1
0
    def test_modify_tcp_header_shortcut(self):
        """
        Tests injection of a packet with a modified tcp header using shortcutted send
        """
        fake_port = random_free_port()
        fake_addr = "10.10.10.10"
        srv_port = self.server.server_address[1]
        srv_addr = self.server.server_address[0]
        text = "Hello World!"
        client = FakeTCPClient((fake_addr, fake_port), text.encode("UTF-8"))
        client_thread = threading.Thread(target=client.send)

        f = "tcp.DstPort == %d or tcp.SrcPort == %d" % (fake_port, srv_port)
        with Handle(filter=f, priority=1000) as handle:
            # Initialize the fake tcp client
            client_thread.start()
            while True:
                packet = handle.receive()

                if packet.meta.is_outbound():
                    if packet.dst_port == fake_port:
                        packet.dst_port = srv_port
                        packet.dst_addr = srv_addr
                    if packet.src_port == srv_port:
                        packet.src_port = fake_port
                        packet.src_addr = fake_addr

                handle.send(packet)
                if hasattr(client, "response") and client.response:
                    break
            client_thread.join(timeout=10)
            self.assertEqual(text.upper(), client.response.decode("UTF-8"))
예제 #2
0
    def test_modify_tcp_payload(self):
        """
        Tests injection of a TCP packet with modified payload
        """
        text = "Hello world! ZZZZ"
        new_text = "Hello World!"
        # Initialize the fake tcp client
        client = FakeTCPClient(self.server.server_address,
                               text.encode("UTF-8"),
                               ipv6=True)
        client_thread = threading.Thread(target=client.send)
        f = "outbound and tcp.DstPort == %s and tcp.PayloadLength > 0" % self.server.server_address[
            1]
        with Handle(filter=f) as handle:
            client_thread.start()
            raw_packet, metadata = handle.recv()

            if metadata.is_outbound():
                packet = handle.driver.parse_packet(raw_packet)
                self.assertEqual(text.encode("UTF-8"), packet.payload)
                packet.payload = new_text.encode("UTF-8")
                raw_packet = packet.raw

            handle.send((raw_packet, metadata))
            client_thread.join(timeout=10)
            self.assertEqual(new_text.upper(), client.response.decode("UTF-8"))
예제 #3
0
    def test_modify_udp_header(self):
        """
        Tests injection of a packet with a modified udp header
        """
        fake_port = random_free_port()
        srv_port = self.server.server_address[1]
        text = "Hello World!"
        client = FakeUDPClient(("127.0.0.1", fake_port), text.encode("UTF-8"))
        client_thread = threading.Thread(target=client.send)

        f = "udp.DstPort == %d or udp.SrcPort == %d" % (fake_port, srv_port)
        with Handle(filter=f, priority=1000) as handle:
            # Initialize the fake tcp client
            client_thread.start()

            for i in range(2):
                packet = handle.receive()
                if packet.meta.is_outbound():
                    if packet.dst_port == fake_port:
                        packet.dst_port = srv_port
                    if packet.src_port == srv_port:
                        packet.src_port = fake_port

                handle.send(packet)

            client_thread.join(timeout=10)
            self.assertEqual(text.upper(), client.response.decode("UTF-8"))
예제 #4
0
 def test_implicit_construct_handle(self):
     """
     Tests constructing an handle without passing a WinDivert instance
     """
     handle = Handle(filter="tcp.DstPort == 23", priority=1000)
     self.assertIsInstance(handle, Handle)
     self.assertFalse(handle.is_opened)
예제 #5
0
    def test_modify_tcp_header(self):
        """
        Tests injection of a packet with a modified tcp header
        """
        fake_port = random_free_port()
        srv_port = self.server.server_address[1]
        text = "Hello World!"
        client = FakeTCPClient(("127.0.0.1", fake_port), text.encode("UTF-8"))
        client_thread = threading.Thread(target=client.send)

        f = "tcp.DstPort == %d or tcp.SrcPort == %d" % (fake_port, srv_port)
        with Handle(filter=f, priority=1000) as handle:
            # Initialize the fake tcp client
            client_thread.start()
            while True:
                raw_packet, meta = handle.recv()
                packet = handle.driver.parse_packet(raw_packet)

                if meta.is_outbound():
                    if packet.dst_port == fake_port:
                        packet.dst_port = srv_port
                    if packet.src_port == srv_port:
                        packet.src_port = fake_port
                packet = handle.driver.update_packet_checksums(packet)

                handle.send((packet.raw, meta))
                if hasattr(client, "response") and client.response:
                    break
            client_thread.join(timeout=10)
            self.assertEqual(text.upper(), client.response.decode("UTF-8"))
예제 #6
0
 def test_handle_invalid(self):
     """
     Tests constructing an handle from a WinDivert instance
     """
     handle = Handle(filter="tcp.DstPort == 23", priority=1000)
     #The handle is not opened so we expect an error
     self.assertRaises(WindowsError, handle.close)
예제 #7
0
 def test_construct_handle(self):
     """
     Tests constructing an handle from a WinDivert instance
     """
     driver = WinDivert()
     handle = Handle(driver, filter="tcp.DstPort == 23", priority=1000)
     self.assertIsInstance(handle, Handle)
     self.assertFalse(handle.is_opened)
예제 #8
0
 def test_queue_len_range(self):
     """
     Tests setting the minimum value for queue length.
     From docs: 1< default 512 <8192
     """
     with Handle(filter="tcp.DstPort == 23", priority=1000) as filter0:
         #TODO: this range should have a proper default representation
         for value in (1, 512, 8192):
             filter0.set_param(Param.QUEUE_LEN, value)
             self.assertEqual(value, filter0.get_param(Param.QUEUE_LEN))
예제 #9
0
 def test_getter_and_setter(self):
     """
     Tests getting and setting params to WinDivert
     """
     queue_len = 2048
     queue_time = 64
     with Handle(filter="tcp.DstPort == 23", priority=1000) as filter0:
         filter0.set_param(Param.QUEUE_LEN, queue_len)
         self.assertEqual(queue_len, filter0.get_param(Param.QUEUE_LEN))
         filter0.set_param(Param.QUEUE_TIME, queue_time)
         self.assertEqual(queue_time, filter0.get_param(Param.QUEUE_TIME))
예제 #10
0
    def test_queue_time_range(self):
        """
        Tests setting the minimum value for queue time.
        From docs: 128 < default 512 < 2048
        """
        with Handle(filter="tcp.DstPort == 23", priority=1000) as filter0:
            # TODO: this range should have a proper default representation

            def_range = (128, 512, 2048)
            for value in def_range:
                filter0.set_param(Param.QUEUE_TIME, value)
                assert value == filter0.get_param(Param.QUEUE_TIME)
예제 #11
0
    def test_syn_tcp_options(self):
        """
        Tests the right capturing of tcp options field
        """
        text = "Hello World!"
        client = FakeTCPClient(self.server.server_address, text.encode("UTF-8"), ipv6=True)
        client_thread = threading.Thread(target=client.send)

        with Handle(filter="tcp.DstPort == %d" % self.server.server_address[1]) as handle:
            client_thread.start()
            packet = handle.receive()
            assert packet.tcp_hdr.Syn == 1
            assert hexlify(packet.tcp_hdr.Options) == b"0204ffc30103030801010402"
예제 #12
0
    def test_pass_through(self):
        """
        Tests capture and reinjection of data
        """
        srv_port = self.server.server_address[1]
        text = "Hello World!"
        client = FakeTCPClient(self.server.server_address, text.encode("UTF-8"), ipv6=True)
        client_thread = threading.Thread(target=client.send)

        with Handle(filter="tcp.DstPort == %d and tcp.PayloadLength > 0" % srv_port) as handle:
            client_thread.start()
            handle.send(handle.receive())

        client_thread.join(timeout=10)
        assert text.upper() == client.response.decode()
예제 #13
0
    def test_syn_tcp_options(self):
        """
        Tests the right capturing of tcp options field
        """
        text = "Hello World!"
        client = FakeTCPClient(self.server.server_address,
                               text.encode("UTF-8"))
        client_thread = threading.Thread(target=client.send)

        with Handle(filter="tcp.DstPort == %d" %
                    self.server.server_address[1]) as handle:
            client_thread.start()
            packet = handle.receive()
            self.assertEqual(packet.tcp_hdr.Syn, 1)
            self.assertEqual(hexlify(packet.tcp_hdr.Options),
                             b"0204ffd70103030801010402")
        client_thread.join(timeout=10)
예제 #14
0
    def test_modify_udp_payload(self):
        """
        Tests injection of a UDP packet with modified payload
        """
        text = "Hello World!"
        client = FakeUDPClient(("127.0.0.1", self.server.server_address[1]), text.encode("UTF-8"))
        client_thread = threading.Thread(target=client.send)
        filter_ = "outbound and udp.DstPort == %s" % self.server.server_address[1]
        with Handle(filter=filter_) as handle:
            client_thread.start()

            packet = handle.receive()
            assert text.encode("UTF-8") == packet.payload
            handle.send(packet)

            client_thread.join(timeout=10)
            assert text.upper() == client.response.decode()
예제 #15
0
    def test_pass_through_mtu_size(self):
        """
        Tests sending a packet bigger than mtu
        """
        srv_port = self.server.server_address[1]
        text = b"#" * (Defaults.PACKET_BUFFER_SIZE + 1)
        client = FakeTCPClient(("127.0.0.1", srv_port), text)
        client_thread = threading.Thread(target=client.send)

        f = "tcp.DstPort == {0} or tcp.SrcPort == {0} and tcp.PayloadLength > 0".format(srv_port)
        with Handle(filter=f, priority=1000) as handle:
            # Initialize the fake tcp client
            client_thread.start()
            while True:
                handle.send(handle.receive())
                if hasattr(client, "response") and client.response:
                    break
            client_thread.join(timeout=10)
            assert text == client.response
예제 #16
0
 def test_context_manager(self):
     """
     Tests usage of an Handle as a context manager
     """
     with Handle(filter="tcp.DstPort == 23", priority=1000) as filter0:
         self.assertNotEqual(str(filter0._handle), "-1")