Как сгенерировать пакет с порядковым номером «first:last» с помощью Scapy?Python

Программы на Python
Ответить Пред. темаСлед. тема
Гость
 Как сгенерировать пакет с порядковым номером «first:last» с помощью Scapy?

Сообщение Гость »


Я пытаюсь создать файл pcap из вывода tcpdump. Как мне сгенерировать пакеты с порядковым номером first:last?

Вот как выглядят мои входные данные tcpdump:

tcpdump: прослушивание eth1, тип канала EN10MB (Ethernet), размер захвата 65535 байт 1509471560.944080 MAC1 > MAC2, ethertype IPv4 (0x0800), длина 74: (tos 0x0, ttl 64, идентификатор 23237, смещение 0, флаги [DF], протокол TCP (6), длина 60) IP1.port > IP2.port: флаги , cksum 0x6d2f (неверно -> 0x0b4a), seq 1127096708, win 65535, параметры [mss 1460,sackOK,TS val 817985 ecr 0,nop,wscale 6], длина 0 1509471561.042855 MAC2 > MAC1, ethertype IPv4 (0x0800), длина 58: (tos 0x0, ttl 64, идентификатор 3107, смещение 0, флаги [нет], протокол TCP (6), длина 44) IP2.port > IP1.port: флаги [S.], cksum 0x85d8 (правильный), seq 449984001, ack 1127096709, win 65535, параметры [mss 1460], длина 0 1509471561.044008 MAC1 > MAC2, ethertype IPv4 (0x0800), длина 54: (tos 0x0, ttl 64, идентификатор 23238, смещение 0, флаги [DF], протокол TCP (6), длина 40) IP1.port > IP2.port: Флаги [.], cksum 0x6d1b (неверно -> 0x9d95), seq 1, ack 1, win 65535, длина 0 1509471561.046607 MAC1 > MAC2, ethertype IPv4 (0x0800), длина 191: (tos 0x0, ttl 64, идентификатор 23239, смещение 0, флаги [DF], протокол TCP (6), длина 177) IP1.port > IP2.port: Флаги [P.], cksum 0x6da4 (неверно -> 0x98df), seq 1:138, ack 1, win 65535, длина 137 1509471914.089046 MAC1 > MAC2, ethertype IPv4 (0x0800), длина 82: (tos 0x0, ttl 64, идентификатор 54304, смещение 0, флаги [DF], протокол UDP (17), длина 68) Ниже приведен код, который я подготовил для обработки TCP-пакетов:

из импорта scapy.all * секреты импорта Защиту генерироватьPcapfromText(inputtxt,выход): с open (inputtxt,encoding='cp850') в качестве входных данных: номер кадра=0 для строки ввода: if line[0].isdigit(): # первая строка номер кадра += 1 frametime=float(строка[:16]) srcmac= строка[18:34] dstmac= строка[38:54] ethertype = int(line[line.find('(')+1:line.find(')')], 16) FrameLen=int(line[line.find('length')+7:line.find(': (')]) FrameTos=int(line[line.find('tos')+4:line.find(', ttl')],16) frameTtl=int(line[line.find('ttl')+4:line.find(', id')]) frameId=int(line[line.find('id')+3:line.find(', offset')]) FrameOffset=line[line.find('offset')+7:line.find(', flags')] frameFlags=line[line.find('[')+1:line.find(']')] протокол = линия[line.find('proto')+6:line.rfind('(')-1] ipLen = int(line[line.rfind('length')+6:line.rfind(')')]) если FrameFlags == "нет": фреймФлагс = "" ether = Ether(dst=dstmac, src=srcmac, type=ethertype) элиф лен(строка)>5: if line[5].isdigit(): # вторая строка srcinfo = линия[4:line.find ( '>' )] dstinfo = линия[line.find ( '>' ) + 2:line.find ( ':' )] ipsrc = srcinfo[:srcinfo.rfind ( '.' )] ipdst = dstinfo[:dstinfo.rfind ( '.' )] srcport = int(srcinfo[srcinfo.rfind ( '.' ) + 1:]) dstport = int(dstinfo[dstinfo.rfind ( '.' ) + 1:]) ip = ether/IP(src=ipsrc, dst=ipdst, len=frameLen, tos=frameTos, ttl=frameTtl, id=frameId, flags=frameFlags, proto=protocol.lower()) если протокол == "TCP": FrameFlag = линия[line.find ( '[') + 1:line.find ( ']' )] frameFlag=frameFlag.replace(".","A") cksum = int(line[line.find('cksum') + 6:line.find('(')],16) если ", ack" в строке: seq_n = линия[line.find (', seq') + 6:line.find (', ack')] ack_n = int(line[line.find('ack') + 4:line.find(',win')]) еще: seq_n = линия[line.find(',seq') + 6:line.find(',win')] ack_n = 0 если "варианты" в соответствии: win = int(line[line.find('win') + 4:line.find(', options')]) options= line[line.find('options') + 8:line.find(', length')] еще: win = int(line[line.find('win') + 4:line.find(', length')]) опции="[]" pktlen = int(line[line.find(', length') + 9:]) если ":" в seq_n: # ??? еще: pkt = ip / TCP(sport=srcport, dport=dstport, flags=frameFlag, seq=int(seq_n), ack=ack_n, chksum=cksum, window=win) / secrets.token_hex(pktlen) pkt.time = время кадра wrpcap (выход, ПКТ, добавление = True) Поскольку TCP в Scapy требуется целое число для порядкового номера, я не могу передать его first:last в качестве порядкового номера, поэтому требуется некоторая модификация, с которой я не знаком с as Я впервые работаю со Scapy. У меня есть отметка, где это изменение должно быть выполнено с помощью #??? в приведенном выше коде.

Для моей цели важно, чтобы пакеты имели ту же временную метку, что и входные данные tcpdump, поэтому я установил временную метку пакета через pkt.time=timestamp.

PS: Историю этого вопроса можно найти здесь.
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»