scapy导出的Linux熟模式捕获未在Wireshark中打开

是我

这是一个简单的例子:

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。

注意:我可以直接使用wireshark打开smaple.pcap文件。

我该怎么做才能使Scapy生成的pcap文件在Wireshark中打开?

编辑:我尝试了其他pcap文件(来自wirehark捕获示例),并且可以正常工作。看来问题出在我的包裹中。这是第一个数据包(也无法正常工作):

###[ 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地址已更改,因此校验和可能不正确。

约尔

我不知道这是什么问题,但是可以通过以下方式解决:

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

这还会输出以下消息:

警告:PcapWriter:生成器的LL类型未知。使用类型1(以太网)

显然,该wireshark功能不能很好地处理Linux熟模式捕获这种奇怪的情况可能与scapyWiki的以下摘录有关

请记住,Wireshark适用于第2层数据包(通常称为“帧”)。因此,我们必须在Ether()ICMP数据包中添加标头。仅将IP数据包(第3层)传递给Wireshark会产生奇怪的结果。

如果我们真的不在乎第2层框架,我们还可以通过创建虚拟以太网层来规避此问题:

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

编辑-经过进一步研究,并分析了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__is,在尝试访问时会引发异常<type 'generator'>因此,将try-except执行代码块的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无法解析文件。


因此,我认为最好的方法将是复制cat scapy的wireshark功能,并进行细微的更改,即允许用户显式指定链接类型:

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

scapy导出的Linux熟模式捕获未在Wireshark中打开

来自分类Dev

程序未在Linux中打开

来自分类Dev

Wireshark监视模式,解密捕获

来自分类Dev

Eclipse 未在 linux 环境中打开

来自分类Dev

如何处理未在PhantomJS中打开的模式?

来自分类Dev

当处于混杂模式时,Wireshark(Linux)仅捕获来往于我的PC的数据包

来自分类Dev

Wireshark无法打开iptrace -T捕获的.cap

来自分类Dev

在wireshark或tshark中捕获SSID

来自分类Dev

Packet Tracer中的Wireshark捕获

来自分类Dev

Arch-linux:Emacs:在组织模式下导出为html并在外部浏览器中打开不起作用

来自分类Dev

捕获的图像中的问题始终在Android中的横向模式自定义相机中打开

来自分类Dev

如何清除Wireshark中的捕获窗口?

来自分类Dev

如何从可以在Microsoft Word中打开的emacs组织模式导出html

来自分类Dev

活动未在Android中打开

来自分类Dev

Qt MouseMove事件未在eventFilter()中捕获

来自分类Dev

异常未在多处理中捕获

来自分类Dev

捕获Python中的Scapy函数show_interfaces()输出

来自分类Dev

捕获Python中的Scapy函数show_interfaces()输出

来自分类Dev

窗口未在新标签页中打开

来自分类Dev

网址未在WKWebView中快速打开

来自分类Dev

Elasticsearch未在云URL中打开

来自分类Dev

YouTube视频未在webView中打开

来自分类Dev

未在浏览器中打开Google

来自分类Dev

某些网址未在iframe中打开

来自分类Dev

jQuery子菜单未在firefox中打开

来自分类Dev

Tkinter GUI 未在 Pydev 中打开(Liclipse)

来自分类Dev

C:未在“rb”中打开 WAV 文件

来自分类Dev

GNOME 终端未在 Ubuntu 18.04 中打开

来自分类Dev

该链接未在新标签中打开

Related 相关文章

热门标签

归档