Экспортированный захват linux в готовом режиме scapy не открывается в wirehark

Вот простой пример:

from scapy.all import *
pkts = rdpcap('/tmp/sample.pcap')
wireshark(pkts)

Затем wireshark выдает эту ошибку:

The capture file appears to be damaged or corrupt.
(libpcap: IrDA capture has a packet with an invalid sll_protocol field)

Я использую wireshark 1.8, python 2.7.3 и scapy 2.2.0.

ПРИМЕЧАНИЕ. Я могу открыть файл smaple.pcap напрямую с помощью wireshark.

Что я могу сделать, чтобы файлы pcap, сгенерированные scapy, открывались в wirehark?

EDIT: я попробовал другие файлы pcap (из образцов захвата wireshark), и это сработало. Похоже проблема в моих пакетах. Вот первый пакет (который тоже не работает):

###[ cooked linux ]###
  pkttype   = unicast
  lladdrtype= 0x1
  lladdrlen = 6
  src       = '\x00\x04\xed\xcb\x9b0'
  proto     = 0x800
###[ IP ]###
     version   = 4L
     ihl       = 5L
     tos       = 0xb8
     len       = 165
     id        = 47433
     flags     = 
     frag      = 0L
     ttl       = 49
     proto     = udp
     chksum    = 0x50c9
     src       = 22.31.32.55
     dst       = 192.168.1.102
     \options   \
###[ UDP ]###
        sport     = 4566
        dport     = 4566
        len       = 145
        chksum    = 0x0
###[ Raw ]###
           load      = 'H\x84\x80\x80\x80\x80\x80\x8c\x80\x80\x86\x81\x8b\x82\x80\x82\x81\x98\xb1\xb9\xb2\xae\xb1\xb6\xb8\xae\xb1\xae\xb2\xb5\xad\xb0\xb1\xb2\xb2\xb6\xb6\xb5\xb7\xb4\xb9\xb4\xad\x81\xca\x82\x89\xb9\xb9\xb5\xb0\xb6\xb1\xb0\xb3\xb3\xa6\x81\x80\xa7\x81\x80\xa8\x82\x80\x80\x84\x89\xb9\xb9\xb5\xb0\xb6\xb1\xb0\xb3\xb3\x8a\x82\xe5\xee\x86\x88\xe3\xe3\xec\xe9\xe5\xee\xf4\xb2\x89\x84\x80\x80\x81\x80\xb8\x89\x80\x80\x80\x80\x80\x80\x80\x81\x80\x88\x84\x80\x80\x81\x80\xb7\x89\x80\x80\x80\x80\x80\x80\x80\x81\x80\x8c\x82\x80\x82\x9f\x84\x9e\xa7 \xe2\xb6\x80'

Примечание: изменились IP-адреса, поэтому контрольная сумма может быть неверной.


person ItsMe    schedule 08.01.2015    source источник
comment
wireshark([pkts[0]]) работает? Если это так, попробуйте найти проблемный пакет. Если это не так, отредактируйте свой вопрос, указав значение pkts[0].   -  person Yoel    schedule 08.01.2015


Ответы (2)


Я понятия не имею, в чем проблема, но ее можно решить следующим образом:

wireshark(pkt for pkt in pkts) # don't supply a list but rather a generator

Это также выводит следующее сообщение:

ВНИМАНИЕ: PcapWriter: неизвестный тип LL для генератора. Использование типа 1 (Ethernet)

По-видимому, функция wireshark не обрабатывает захват в готовом режиме Linux это хорошо. Эта странная ситуация может быть связана со следующим отрывком из вики scapy:

Помните, что Wireshark работает с пакетами уровня 2 (обычно называемыми «фреймами»). Поэтому нам пришлось добавить заголовок Ether() к нашим ICMP-пакетам. Передача только IP-пакетов (уровень 3) в Wireshark даст странные результаты.

Мы также можем обойти эту проблему, создав фиктивный уровень Ethernet, если нас не волнует кадр уровня 2:

pkts = [Ether(src=pkt[0].src)/pkt[1:] for pkt in pkts]

EDIT - после дальнейших исследований и анализа исходного кода scapy я понял, почему передача объекта-генератора, похоже, решает эту проблему.

Функция wireshark создает временный файл, содержащий пакеты, и запускает Wireshark с этим файлом. Тип ссылки, который должен быть указан в заголовке этого файла, извлекается следующим образом:

if self.linktype == None:
    if type(pkt) is list or type(pkt) is tuple or isinstance(pkt,BasePacketList):
        pkt = pkt[0]
    try:
        self.linktype = conf.l2types[pkt.__class__]
    except KeyError:
        warning("PcapWriter: unknown LL type for %s. Using type 1 (Ethernet)" % pkt.__class__.__name__)
        self.linktype = 1

При передаче объекта генератора первый оператор if оценивается как False (что, очевидно, является ошибкой), и возникает исключение при попытке доступа к conf.l2types[pkt.__class__], поскольку pkt.__class__ равно <type 'generator'>. Таким образом, выполняется исключение блока кода try-except, а тип ссылки указывается равным 1.

Однако при передаче реального списка первый оператор if оценивается как True, а первый пакет списка извлекается и используется для доступа к conf.l2types, то есть:

In [2]: conf.l2types
Out[2]: 
   0x1 <-  Dot3                 (802.3)
   0x1 <-> Ether                (Ethernet)
   0xc  -> IP                   (IP)
  0x17  -> Ether                (Ethernet)
  0x1f <-> IPv6                 (IPv6)
  0x65 <-> IP                   (IP)
  0x69 <-> Dot11                (802.11)
  0x71  -> CookedLinux          (cooked linux)
  0x77 <-> PrismHeader          (Prism header)
  0x7f <-> RadioTap             (RadioTap dummy)
  0x90 <-> CookedLinux          (cooked linux)
  0xc0 <-> PPI                  (Per-Packet Information header (partial))
 0x304  -> Ether                (Ethernet)
 0x321  -> Dot11                (802.11)
 0x322  -> PrismHeader          (Prism header)
 0x323  -> RadioTap             (RadioTap dummy)

Поскольку pkts[0].__class__ равно scapy.layers.l2.CookedLinux, тип ссылки установлен на 0x90, а не на 0x71 (похоже, это еще одна ошибка), из-за которой Wireshark не может проанализировать файл.


Поэтому я думаю, что лучшим подходом было бы копирование функции wireshark scapy с небольшим изменением, позволяющим пользователю явно указывать тип ссылки:

def wireshark(*args, **kwargs):
    """Run wireshark on a list of packets"""
    f = scapy.all.get_temp_file()
    scapy.all.wrpcap(f, *args, **kwargs)
    subprocess.Popen([scapy.all.conf.prog.wireshark, "-r", f])

wireshark(pkts, linktype=0x71)

РЕДАКТИРОВАНИЕ. Теперь я заметил, что проблема сопоставления типов ссылок уже сообщено и исправлено компанией secdev. Однако он еще не достиг python-scapy. Я также создал новый выпуск на недопустимая обработка объекта генератора в PcapWriter.

person Yoel    schedule 08.01.2015

(libpcap: захват IrDA имеет пакет с недопустимым полем sll_protocol)

В Linux IrDA используется что-то похожее на заголовок готового режима Linux, но это не то же самое:

Я не знаю, что заставило вашу программу выбрать 144, а не 113; был ли ваш входной файл файлом IrDA Linux, а не подготовленным файлом захвата Linux?

person Community    schedule 09.01.2015