Exemple #1
0
def test_fallback():
    """
    Tests fallback behavior.
    """
    fragment = actions.fragment.FragmentAction(correct_order=False, fragsize=2, segment=False)
    assert str(fragment) == "fragment{ip:2:False}", "Fragment returned incorrect string representation: %s" % str(fragment)

    fragment.parse("fragment{ip:0:False}", logger)
    packet = actions.packet.Packet(IP(src="127.0.0.1", dst="127.0.0.1", proto=0x06)/UDP(sport=2222, dport=3333, chksum=0x4444)/("thisissomedata"))
    packet1, packet2 = fragment.run(packet, logger)
    assert id(packet1) != id(packet2), "Duplicate aliased packet objects"
    assert str(packet1) == str(packet2)

    fragment.parse("fragment{tcp:-1:False}", logger)
    packet = actions.packet.Packet(IP(src="127.0.0.1", dst="127.0.0.1", proto=0x06)/UDP(sport=2222, dport=3333, chksum=0x4444)/("thisissomedata"))
    packet1, packet2 = fragment.run(packet, logger)
    assert id(packet1) != id(packet2), "Duplicate aliased packet objects"
    assert str(packet1) == str(packet2)

    fragment.parse("fragment{tcp:-1:False}", logger)
    packet = actions.packet.Packet(IP(src="127.0.0.1", dst="127.0.0.1", proto=0x06)/TCP(sport=2222, dport=3333, chksum=0x4444))
    packet1, packet2 = fragment.run(packet, logger)
    assert id(packet1) != id(packet2), "Duplicate aliased packet objects"
    assert str(packet1) == str(packet2)

    fragment.parse("fragment{ip:-1:False}", logger)
    packet = actions.packet.Packet(IP(src="127.0.0.1", dst="127.0.0.1", proto=0x06))
    packet1, packet2 = fragment.run(packet, logger)
    assert id(packet1) != id(packet2), "Duplicate aliased packet objects"
    assert str(packet1) == str(packet2)
Exemple #2
0
def test_reverse_fragment(logger):
    """
    Tests fragmentation with reversed packets
    """
    fragment = actions.fragment.FragmentAction(correct_order=False,
                                               fragsize=3,
                                               segment=False)
    assert str(
        fragment
    ) == "fragment{ip:3:False}", "Fragment returned incorrect string representation: %s" % str(
        fragment)

    packet = layers.packet.Packet(
        IP(src="127.0.0.1", dst="127.0.0.1", proto=0x06) /
        TCP(sport=2222, dport=3333, seq=100, ack=100, flags="S") /
        ("thisissomedata"))
    packet1, packet2 = fragment.run(packet, logger)

    assert id(packet1) != id(packet2), "Duplicate aliased packet objects"
    assert str(packet1["Raw"].load) != str(
        packet2["Raw"].load), "Packets were not different"
    assert packet2[
        "Raw"].load == b'\x08\xae\r\x05\x00\x00\x00d\x00\x00\x00dP\x02 \x00zp\x00\x00this', "Left packet incorrectly fragmented"
    assert packet1[
        "Raw"].load == b'issomedata', "Right packet incorrectly fragmented"
    assert packet2["Raw"].load + packet1[
        "Raw"].load == b'\x08\xae\r\x05\x00\x00\x00d\x00\x00\x00dP\x02 \x00zp\x00\x00thisissomedata', "Packets fragmentation was incorrect"
Exemple #3
0
def test_odd_fragment(logger):
    """
    Tests long IP fragmentation
    """
    fragment = actions.fragment.FragmentAction(correct_order=True,
                                               segment=False)
    assert str(
        fragment
    ) == "fragment{ip:-1:True}", "Fragment returned incorrect string representation: %s" % str(
        fragment)

    packet = layers.packet.Packet(
        IP(src="127.0.0.1", dst="127.0.0.1", proto=0x06) /
        TCP(sport=2222, dport=3333, seq=100, ack=100, flags="S") /
        ("dataisodd"))
    packet1, packet2 = fragment.run(packet, logger)

    assert id(packet1) != id(packet2), "Duplicate aliased packet objects"

    assert str(packet1["Raw"].load) != str(
        packet2["Raw"].load), "Packets were not different"
    assert packet1[
        "Raw"].load == b'\x08\xae\r\x05\x00\x00\x00d', "Left packet incorrectly fragmented"
    assert packet2[
        "Raw"].load == b'\x00\x00\x00dP\x02 \x00e\xc1\x00\x00dataisodd', "Right packet incorrectly fragmented"
    assert packet1["Raw"].load + packet2[
        "Raw"].load == b'\x08\xae\r\x05\x00\x00\x00d\x00\x00\x00dP\x02 \x00e\xc1\x00\x00dataisodd', "Packets fragmentation was incorrect"
Exemple #4
0
def test_udp_fragment():
    """
    Tests fragmentation with reversed packets
    """

    fragment = actions.fragment.FragmentAction(correct_order=False, fragsize=2, segment=False)
    assert str(fragment) == "fragment{ip:2:False}", "Fragment returned incorrect string representation: %s" % str(fragment)

    packet = actions.packet.Packet(IP(src="127.0.0.1", dst="127.0.0.1", proto=0x06)/UDP(sport=2222, dport=3333, chksum=0x4444)/("thisissomedata"))
    packet1, packet2 = fragment.run(packet, logger)

    assert id(packet1) != id(packet2), "Duplicate aliased packet objects"
    assert str(packet1["Raw"].load) != str(packet2["Raw"].load), "Packets were not different"
Exemple #5
0
def test_segment_reverse():
    """
    Tests the duplicate action primitive in reverse!
    """
    fragment = actions.fragment.FragmentAction(correct_order=False)
    assert str(fragment) == "fragment{tcp:-1:False}", "Fragment returned incorrect string representation: %s" % str(fragment)

    packet = actions.packet.Packet(IP(src="127.0.0.1", dst="127.0.0.1")/TCP()/("data"))
    packet1, packet2 = fragment.run(packet, logger)

    assert id(packet1) != id(packet2), "Duplicate aliased packet objects"

    assert packet1["Raw"].load != packet2["Raw"].load, "Packets were not different"
    assert packet1["Raw"].load == b'ta', "Left packet incorrectly fragmented"
    assert packet2["Raw"].load == b"da", "Right packet incorrectly fragmented"
Exemple #6
0
def test_ip_only_fragment():
    """
    Tests fragmentation without higher protocols.
    """

    fragment = actions.fragment.FragmentAction(correct_order=True)
    fragment.parse("fragment{ip:-1:True}", logger)

    packet = actions.packet.Packet(IP(src="127.0.0.1", dst="127.0.0.1")/("datadata11datadata"))
    packet1, packet2 = fragment.run(packet, logger)

    assert id(packet1) != id(packet2), "Duplicate aliased packet objects"

    assert packet1["Raw"].load != packet2["Raw"].load, "Packets were not different"
    assert packet1["Raw"].load == b'datadata', "Left packet incorrectly fragmented"
    assert packet2["Raw"].load == b"11datadata", "Right packet incorrectly fragmented"
Exemple #7
0
def test_mutate(logger):
    """
    Tests mutating the fragment action
    """
    fragment = actions.fragment.FragmentAction(correct_order=False,
                                               fragsize=2,
                                               segment=False)
    assert str(
        fragment
    ) == "fragment{ip:2:False}", "Fragment returned incorrect string representation: %s" % str(
        fragment)

    for _ in range(0, 200):
        fragment.mutate()
        fragment.parse(str(fragment), logger)
        packet = layers.packet.Packet(
            IP(src="127.0.0.1", dst="127.0.0.1", proto=0x06) /
            TCP(sport=2222, dport=3333, chksum=0x4444) / ("thisissomedata"))
        packet1, packet2 = fragment.run(packet, logger)
Exemple #8
0
def test_segment_wrap3(logger):
    """
    Tests if segment numbers can wrap around testing for off-by-one
    """
    fragment = actions.fragment.FragmentAction(correct_order=True)
    assert str(
        fragment
    ) == "fragment{tcp:-1:True}", "Fragment returned incorrect string representation: %s" % str(
        fragment)

    packet = layers.packet.Packet(
        IP(src="127.0.0.1", dst="127.0.0.1") / TCP() / ("data"))
    packet["TCP"].seq = MAX_UINT - 2
    packet1, packet2 = fragment.run(packet, logger)

    assert id(packet1) != id(packet2), "Duplicate aliased packet objects"

    assert packet1["Raw"].load != packet2[
        "Raw"].load, "Packets were not different"
    assert packet1["Raw"].load == b'da', "Left packet incorrectly fragmented"
    assert packet2["Raw"].load == b"ta", "Right packet incorrectly fragmented"
    assert packet1["TCP"].seq == MAX_UINT - 2
    assert packet2["TCP"].seq == MAX_UINT
Exemple #9
0
def test_overlapping_segment_out_of_bounds():
    """
    Basic test for overlapping segments overlapping beyond the edge of the packet.
    """
    fragment = actions.fragment.FragmentAction(correct_order=True)
    fragment.parse("fragment{tcp:-1:True:20}", logger)

    packet = layers.packet.Packet(
        IP(src="127.0.0.1", dst="127.0.0.1") / TCP(seq=100) /
        ("datadata11datadata"))
    packet1, packet2 = fragment.run(packet, logger)

    assert id(packet1) != id(packet2), "Duplicate aliased packet objects"

    assert packet1["Raw"].load != packet2[
        "Raw"].load, "Packets were not different"
    assert packet1[
        "Raw"].load == b'datadata11datadata', "Left packet incorrectly segmented"
    assert packet2[
        "Raw"].load == b"1datadata", "Right packet incorrectly fragmented"

    assert packet1["TCP"].seq == 100, "First packet sequence number incorrect"
    assert packet2["TCP"].seq == 109, "Second packet sequence number incorrect"