使用 Scapy 发送具有随机偏移量的片段数据包

问题描述 投票:0回答:2

我想发送大小为 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)

上面的代码是做什么的? 它将大小为 8 字节的 IP 片段数据包发送到目标 IP 地址。

我想发送带有随机片段偏移量的 IP 片段数据包。 我找不到任何关于

fragment()
的信息,我能够编辑的唯一字段是 IP 数据包,而不是每个碎片化的 IP 数据包。

有人有实现这个的想法吗?

信息:Python2.7,最新版scapy (pip)

python scapy packet penetration-testing ip-fragmentation
2个回答
2
投票

如果你想生成“损坏的”片段偏移字段,你必须自己做。 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

如果你更改上面标记的代码行,你可以将片段偏移量设置为任何你想要的。


0
投票

@tay , 你能分享一下你的解决方案吗?

© www.soinside.com 2019 - 2024. All rights reserved.