为了账号安全,请及时绑定邮箱和手机立即绑定

如何通过 Scapy 设置 TCP 选项(时间戳和 SAckOk)?

如何通过 Scapy 设置 TCP 选项(时间戳和 SAckOk)?

喵喵时光机 2022-06-14 17:04:02
对于我想通过 Scapy 生成的每个数据包,我都有以下信息,它是 tcpdump 输出:1509472682.813373 MAC1 > MAC2, ethertype IPv4 (0x0800), length 74: (tos 0x0, ttl 64, id 64271, offset 0, flags [DF], proto TCP (6), length 60)    IP1.port1 > IP2.port2: Flags [S], cksum 0x4a0b (incorrect -> 0xe5b4), seq 1763588570, win 65535, options [mss 1460,sackOK,TS val 1098453 ecr 0,nop,wscale 6], length 0我已经生成TCP了如下数据包,但是当我通过wireshark检查它们时,似乎Timestamp根本没有设置该选项,Sack也没有像我预期的那样设置。for r in (("mss","MSS"), ("sackOK","SAck"), ("nop","NOP"), ("TS ", "Timestamps "), ("val", "TSval"), ("ecr", "TSecr"), ("wscale","WScale")):    opt = opt.replace(*r)opt=opt.split(",") for op in opt:           op = op.split()    if len(op) == 2:        options.append((op[0],int(op[1])))    elif op[0] == "Timestamps": ## Need some modification, so that Scapy do not ignore it.        options.append((op[0],(int(op[2]),int(op[4]))))    elif op[0] == "SAck": ## How to set SAck option to be SAck Permitted?        options.append((op[0], ''))     else: # NOP        options.append((op[0], ()))ip = ether/IP(src=ipsrc, dst=ipdst, len=ipLen, tos=frameTos, ttl=frameTtl, offset=frameOffset, id=frameId, flags=frameFlags, proto=protocol.lower())if ack_n is None:    pkt = ip / TCP(sport=srcport, dport=dstport , flags=frameFlag, seq=int(seq_n), chksum=cksum, window=win, options=options) / secrets.token_bytes(frameLen-54)                  else:                            pkt = ip / TCP(sport=srcport, dport=dstport , flags=frameFlag, seq=int(seq_n), ack=ack_n, chksum=cksum, window=win, options=options) / secrets.token_bytes(frameLen-54)                  pkt.time = frametimewrpcap(output, pkt, append=True)这是传递给我在开头提供其信息的数据包的选项字段的内容:[('MSS', 1460), ('SAck', ''), ('Timestamps', (1098453, 0)), ('NOP', ()), ('WScale', 6)]但是当我通过 Wireshark 检查数据包时,该Timestamps选项未设置,似乎 Scapy 已忽略它,并且该SAck选项未按我的预期设置。下面是这个数据包选项字段在 Wireshark 中的样子:这是我所期望的:所以这里的问题是:如何设置timestamps,让 Scapy 不忽略它?如何设置SAck,使其标记为允许。编辑1:我已经解决了这个问题SAck,我应该把它作为('SAckOK', '')
查看完整描述

1 回答

?
绝地无双

TA贡献1946条经验 获得超4个赞

最后我找到了我设置错误的地方:

正如我在第一次编辑中提到的那样,要设置允许选择性确认,我应该将选项元组传递为('SAckOK', '').

要设置timestamp我应该传递一个元组选项,因为('Timestamp', (1098453, 0))在内部元组中,第一个参数是Val,第二个参数是Ecr


查看完整回答
反对 回复 2022-06-14
  • 1 回答
  • 0 关注
  • 227 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信