Использование Scapy для отправки пакетов фрагментов со случайными смещениями

Я хотел бы отправлять фрагментированные пакеты размером 8 байт и случайным начальным смещением. Также хочу оставить последний фрагментированный пакет.

Пока у меня есть все, кроме фрагмента

from scapy.all import *
from random import randint
dip="MY.IP.ADD.RESS"
payload="A"*250+"B"*500
packet=IP(dst=dip,id=12345,off=123)/UDP(sport=1500,dport=1501)/payload
frags=fragment(packet,fragsize=8)
print(packet.show())
for f in frags:
    send(f)

Что делает приведенный выше код? Он отправляет пакеты IP-фрагментов размером 8 байт на IP-адрес назначения.

Я хотел бы отправить пакеты IP-фрагментов со случайным смещением фрагментов. Я ничего не могу найти о fragment(), и единственное поле, которое я смог отредактировать, было в IP-пакете вместо каждого фрагментированного IP-пакета.

У кого-нибудь есть идея, как это сделать?

Информация: Python2.7, последняя версия scapy (pip)


person Tay    schedule 20.09.2018    source источник


Ответы (1)


Если вы хотите сгенерировать "сломанные" поля смещения фрагмента, вы должны сделать это самостоятельно. Функция scapy fragment() достаточно проста:

def fragment(pkt, fragsize=1480):
    """Fragment a big IP datagram"""
    fragsize = (fragsize + 7) // 8 * 8
    lst = []
    for p in pkt:
        s = raw(p[IP].payload)
        nb = (len(s) + fragsize - 1) // fragsize
        for i in range(nb):
            q = p.copy()
            del(q[IP].payload)
            del(q[IP].chksum)
            del(q[IP].len)
            if i != nb - 1:
                q[IP].flags |= 1
            q[IP].frag += i * fragsize // 8          # <---- CHANGE THIS
            r = conf.raw_layer(load=s[i * fragsize:(i + 1) * fragsize])
            r.overload_fields = p[IP].payload.overload_fields.copy()
            q.add_payload(r)
            lst.append(q)
    return lst

Источник: https://github.com/secdev/scapy/blob/652b77bf12499451b47609b89abc663aa0f69c55/scapy/layers/inet.py#L891

Если вы измените отмеченную выше строку кода, вы можете установить смещение фрагмента на любое желаемое.

person payne    schedule 20.09.2018
comment
Спасибо! Я только что отредактировал файл в /layers/inet.py, чтобы ожидать три argc во фрагменте вместо 2. Работает нормально! - person Tay; 21.09.2018