Как настроить параметры TCP (Timestamp и SAckOk) через Scapy? - PullRequest
0 голосов
/ 04 октября 2019

У меня есть следующая информация для каждого пакета, который я хочу сгенерировать через 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 = frametime

wrpcap(output, pkt, append=True)

Вот что передается в поле опций для пакета Iпредоставили информацию в начале:

[('MSS', 1460), ('SAck', ''), ('Timestamps', (1098453, 0)), ('NOP', ()), ('WScale', 6)]

Но когда я проверяю пакет через Wireshark, опция Timestamps не устанавливается, кажется, что Scapy проигнорировал ее, иSAck опция не установлена, как я ожидал.

Вот как выглядит это поле параметров пакета в Wireshark:

enter image description here

Вот то, что я ожидал, это будет:

enter image description here

Итак, вопрос здесь:

  • Как установитьtimestamps, чтобы Scapy его не игнорировал?
  • Как установить SAck, чтобы он был помечен как разрешенный.

Редактировать 1:

Я решил проблему с SAck, я должен передать ее как ('SAckOK', '')

1 Ответ

0 голосов
/ 06 октября 2019

Наконец, я нашел то, что неправильно установил:

Как я уже упоминал в своем первом редактировании, чтобы установить Разрешенное выборочное подтверждение, я должен передать option tuple как ('SAckOK', '').

Чтобы установить timestamp, я должен передать option кортеж как ('Timestamp', (1098453, 0)) во внутренний кортеж, первый аргумент - Val, а второй - Ecr.

...