【问题标题】:Force scapy to re-dissect a layer after changes强制 scapy 在更改后重新剖析图层
【发布时间】:2015-09-16 22:54:50
【问题描述】:

我正在使用一个名为scapy-comscapy(Python 数据包操作工具)的分支。这实现了 802.15.4 和 Zigbee 解析/操作以及其他协议。

在网络级安全标头中发现了 Zigbee 协议的一个怪癖。最初,安全级别(定义消息完整性代码的加密和长度)设置正确,但在发送之前设置为 0(不加密)。来自规范:

安全控制字段的安全级别子字段应为 被 3 位全零字符串 '000' 覆盖

规范可以是found here。相关章节为“4.3.1.1 出帧的安全处理”。

这意味着数据包捕获表明未使用加密或消息完整性代码。必须在带外传达安全级别。

scapy-com 不处理这个问题。它天真地解析安全级别并将MIC的长度设置为0。执行此操作的代码是:

def util_mic_len(pkt):
    ''' Calculate the length of the attribute value field '''
    # NWK security level 0 seems to implicitly be same as 5
    if ( pkt.nwk_seclevel == 0 ): # no encryption, no mic
        return 0
    elif ( pkt.nwk_seclevel == 1 ): # MIC-32
        return 4
    elif ( pkt.nwk_seclevel == 2 ): # MIC-64
        return 8
    elif ( pkt.nwk_seclevel == 3 ): # MIC-128
        return 16
    elif ( pkt.nwk_seclevel == 4 ): # ENC
        return 0
    elif ( pkt.nwk_seclevel == 5 ): # ENC-MIC-32
        return 4
    elif ( pkt.nwk_seclevel == 6 ): # ENC-MIC-64
        return 8
    elif ( pkt.nwk_seclevel == 7 ): # ENC-MIC-128
        return 16
    else:
        return 0

使用 scapy-com 的项目试图通过将安全级别设置为 5 来处理这个问题:

#TODO: Investigate and issue a different fix:
# https://code.google.com/p/killerbee/issues/detail?id=30
# This function destroys the packet, therefore work on a copy - @cutaway
pkt = pkt.copy()   #this is hack to fix the below line
pkt.nwk_seclevel=5 #the issue appears to be when this is set

mic = pkt.mic

但是,这不起作用 - 已设置消息完整性代码。我通过简单地更改 util_mic_len 函数来正确设置麦克风长度来解决这个问题。

问题是,应该如何更改 Zigbee 解析器,以便在初始解剖后更改 nwk_seclevel 导致麦克风长度更新?

我可以看到两种解决方案:

  1. 更改 scapy-com 代码,以便更改 nwk_seclevel 自动更改麦克风长度。
  2. 重新剖析来自 scapy-com 外部的数据包,因为它们已更改。

1 的问题是我不知道该怎么做。

2 的问题是我有一些想法,但无法让它工作 - 我不知道如何在数据包加载后调用 dissect。调用 pkt.dissect(pkt) 似乎不起作用并且看起来很奇怪。

这里最好或推荐的解决方案是什么?

【问题讨论】:

    标签: python security encryption zigbee


    【解决方案1】:

    修复 scapy 听起来是正确的解决方案。 scapy-com 已经很老了。 scapy-com 中的 Zigbee 特定代码是 1244 行代码,其中大部分是枚举和字段列表。因此,将其迁移到 scapy-python3 应该不会太难。如果您愿意协助将其迁移到 scapy-python3 http://github.com/phaethon/scapy ,我可以帮助解决此问题。

    【讨论】:

    • 谢谢 Eriks - 我完全不知道这个项目。
    【解决方案2】:

    您所指的项目是 KillerBee,而我在解密时遇到了这个确切的问题。我只是简单地“修复”了代码:

    from struct import pack
    f = pkt.getlayer(ZigbeeSecurityHeader).fields
    
    pkt.nwk_seclevel = 5
    nwk_mic = pkt.mic
    nwk_encrypted = f['data'][:-6]
    
    ext_source = f['ext_source']
    
    nwk_sec_ctrl_byte = str(pkt.getlayer(ZigbeeSecurityHeader))[0]
    nwk_nonce = struct.pack('Q',ext_source) + struct.pack('I',f['fc']) + nwk_sec_ctrl_byte
    
    nwk_crop_size = 4 + 2 + len(pkt.getlayer(ZigbeeSecurityHeader).fields['data'])  # The length of the encrypted data, mic and FCS
    
    # the Security Control Field flags have to be adjusted before this is calculated, so we store their original values so we can reset them later
    zigbeeData = pkt.getlayer(ZigbeeNWK).do_build()
    zigbeeData = zigbeeData[:-nwk_crop_size]
    
    (nwk_payload, nwk_micCheck) = zigbee_crypt.decrypt_ccm(nkey, nwk_nonce, nwk_mic, nwk_encrypted, zigbeeData)
    

    【讨论】:

      猜你喜欢
      • 2015-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-14
      • 2014-05-09
      • 2012-09-09
      • 1970-01-01
      • 2023-03-22
      相关资源
      最近更新 更多