【问题标题】:Detect another host with the same MAC address检测具有相同 MAC 地址的另一台主机
【发布时间】:2008-11-10 03:19:05
【问题描述】:

如何检测其他主机是否使用与当前主机相同的 MAC 地址,例如因为其他主机在欺骗?

我在嵌入式环境中工作,因此在协议级别寻找答案,而不是“使用某某工具”。

编辑:RARP 没有解决这个问题。要让 RARP 得到任何回复,网段上必须至少有一台主机支持 RARP。由于 RARP 已过时,现代操作系统不支持它。此外,RARP 所能做的就是告诉您自己的 IP 地址 - 如果网段上的另一台主机具有相同的 MAC,则响应不会有任何不同,除非该主机本身使用了不同的 IP 地址。

【问题讨论】:

    标签: networking ethernet


    【解决方案1】:

    这个问题太有趣了,不能放下!在几次错误的开始之后,我开始思考问题的基本组成部分,并在 RFC 中寻找建议。 我还没有找到明确的答案,但这是我的思考过程,希望对您有所帮助:

    • 原始问题询问如何使用您的 MAC 地址检测另一台设备。假设您在 IP 网络上,需要什么来完成此操作?

    • 被动 方法只是监听 流量并查找您未传输但具有您的 MAC 地址的任何数据包。这可能会发生也可能不会发生,因此虽然它可以明确地告诉您是否存在重复,但它不能明确地告诉您它不存在。

      李>
    • 任何活动方法都要求您发送一个强制冒名顶替者响应的数据包。这会立即消除任何依赖于可选协议的方法。

    • 如果另一台设备在欺骗您,它必须(根据定义)响应以您的 MAC 地址作为目的地的数据包。否则它是 snooping 而不是 spoofing

    • 解决方案应独立于 IP 地址,仅涉及 MAC 地址。

    • 因此,答案似乎是传输广播(以太网)数据包或以您的 MAC 地址为目的地的数据包,这需要响应。猴子扳手是通常涉及IP地址,而您不知道。

    什么样的协议适合这个描述?

    简单回答:

    • 如果您的网络支持 BOOTP 或 DHCP,那么您就完成了,因为这会权威地将 MAC 地址绑定到 IP 地址。发送一个 BOOTP 请求,获取一个 IP 地址,然后尝试与之对话。您可能需要创造性地将数据包强制传输到网络上并阻止自己响应(我认为明智地使用 iptables 和 NAT)。

    不太简单的答案:

    • 一种独立于 IP 的协议:要么不使用 IP 层,要么允许广播。没有想到。

    • 发送任何数据包,这些数据包通常会产生您的响应,阻止您自己响应,并从其他设备寻找响应。使用您的 IP 地址作为目的地似乎是明智的,但我不相信这一点。不幸的是,细节(以及答案)留给 OP 练习......但我希望讨论会有所帮助。

    我怀疑最终的解决方案将涉及多种技术的组合,因为似乎没有一种方法可以保证可靠的确定。

    一些信息可以在http://en.wikipedia.org/wiki/ARP_spoofing#Defenses获得

    如果一切都失败了,你可能会喜欢这个:http://www.rfc-editor.org/rfc/rfc2321.txt

    发布您的解决方案的后续内容,因为我相信它会对其他人有所帮助。祝你好运!

    【讨论】:

    • 感谢您的出色回复。就我的目的而言,依赖 IP 是可以的——我不希望支持非 IP 网络 :)。我一定会跟进的。
    【解决方案2】:

    您可以为子网中每个可能的 ip 发送 ARP 请求。 当然ARP请求的源地址必须是ff:ff:ff:ff:ff:ff,否则你可能看不到响应。

    我用 bittwiste 伪造了一个这样的数据包,然后用 PReplay 重放它,网络上的所有主机都得到了响应。 (我不知道这些伪造的 ARP 数据包是否合法......某些操作系统可能会忽略它们)

    这是伪造的包裹的样子:

    回复如下:

    如果您查看响应并在其中一个数据包中看到您的 MAC 地址(在红色矩形中),那么有人与您拥有相同的 MAC 地址...

    不幸的是,我无法完全测试该理论,因为我的 (Windows) 机器都不关心我尝试设置网卡的 MAC 地址...

    【讨论】:

      【解决方案3】:

      在一个网段上使用相同 MAC 地址的两台主机可能会使交换机发疯,您可能会通过极其不可靠的网络连接来检测它(因为交换机会将属于您主机的部分数据包发送到第二个,取决于你们中的哪一个向他们发送了最后一个数据包)。

      【讨论】:

        【解决方案4】:

        这已经很晚了,而且没有答案,但我想跟进我所做的事情,以防其他人感兴趣。

        我正在使用一些非常奇怪的嵌入式硬件,这些硬件在制造时没有分配 MAC 地址。这意味着我们需要在软件中分配一个。

        显而易见的解决方案是让用户选择他们知道在他们的网络上可用的 MAC 地址,最好是从本地管理的范围内,这就是我所做的。但是,我想选择一个相当安全的默认值,并尝试在发生冲突时警告用户。

        最后,我在本地管理的范围内选择了一个随机的默认值,通过一些具有中等熵的硬件读数来选择。我故意排除了范围的开始和结束,假设它们更有可能是手动选择的。任何给定网络上可能只有其中一个设备,而且肯定少于 20 个,因此发生冲突的可能性非常低,尽管由于随机数可预测而不会低。

        考虑到出现问题的可能性很小,并且尽管上面给出了很好的答案,我还是决定放弃冲突检测,而是向用户发出警告以注意 MAC 冲突问题。

        如果我确实决定实施冲突检测,那么鉴于我控制了整个网络堆栈,我可能会寻找过多的未知或丢失的数据包,然后触发 MAC 地址的更改或在发生这种情况时警告用户。

        希望这会在某个地方对其他人有所帮助——但可能不会!

        【讨论】:

          猜你喜欢
          • 2023-02-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-09-04
          • 2013-12-17
          • 2022-06-14
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多