【问题标题】:Scapy: check the message type of a captured DHCP packetScapy:检查捕获的 DHCP 数据包的消息类型
【发布时间】:2017-12-04 20:19:10
【问题描述】:

我对@9​​87654321@ 完全陌生,我正在尝试使用它为我的局域网构建一个 DHCP 监视器。我正在使用sniff 来捕获通过prn= 参数发送到回调的数据包。在回调中,我检查数据包是否具有DHCP 层,然后检查请求的类型。

我目前正在这样做:

def manage(pkt):
    if pkt.haslayer(DHCP):
        req_type = [x[1] for x in pkt[DHCP].options if x[0] == 'message-type'][0]

        # Message type: request
        if req_type == 3:
            print ("Request from {}".format(pkt[Ether].src))

sniff(prn=manage, count=0, store=0)

我在 DHCP 层中访问 options 的方式有点尴尬,但这是我想出的唯一一种可行的方式。不过我相信一定有更好、更 Pythonic 的方式,比如通过 dict 或其他方式。

访问这些选项的适当方式是什么?

【问题讨论】:

  • 我很好奇你是否能得到有用的答案。我不能说 scapy 做的事情比你现在做的更“有条理”。问题是 DHCP 只是将选项列表抛出到 bootp 有效负载中。不需要特定的选项,也不需要特定的订购。可能有多个相同类型的选项(路由器、DNS 服务器等),因此没有明显的 dict 类型框架有效。拥有多个消息类型并通常会成为第一个消息类型并没有什么意义,但没有人说它必须是。

标签: python network-programming scapy dhcp


【解决方案1】:

我认为这几乎是做你想做的最有效的方法。我会使用next() 和生成器表达式而不是列表,以避免在不需要时解析整个选项列表:

req_type = next(opt[1] for opt in pkt[DHCP].options if isinstance(opt, tuple) and opt[0] == 'message-type')

请注意,我还添加了对 opt 类型的检查,因为有些是字符串对象。

您可以使用dict(),但您必须再次解析整个选项列表。

附带说明一下,在 Scapy 中处理 DHCP 选项的方式有点陈旧,现在正确的做法可能是使用 PacketListField 和更简洁的方法来访问选项。

【讨论】:

  • next 的巧妙用法,不错。那我就解决了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多