代码之家  ›  专栏  ›  技术社区  ›  Daniel Cassidy

检测具有相同MAC地址的其他主机

  •  12
  • Daniel Cassidy  · 技术社区  · 17 年前

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

    我在一个嵌入式环境中工作,所以我在协议级别上寻找答案,而不是使用这样的工具。

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

    4 回复  |  直到 15 年前
        1
  •  17
  •   Adam Liss    17 年前

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

    • 最初的问题是如何用你的MAC地址检测另一个设备。假设您在一个IP网络上,需要什么来完成这个任务?

    • 这个 被动的 方法很简单 去流量和寻找任何你没有传输但有你的MAC地址的包。这可能发生,也可能不发生,所以尽管 可以 明确地告诉你,如果有重复的存在, 不能 明确地告诉你不是。

    • 任何 积极的 方法要求您发送一个数据包, 军队 一个冒名顶替者。这将立即消除任何依赖于 可选择的 协议。

    • 如果另一个设备在欺骗你,它 必须 (根据定义)响应数据包 你的 作为目的地的MAC地址。否则的话 窥探 但不是 欺骗 .

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

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

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

    简单回答:

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

    答案不那么简单:

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

    • 发送 任何 通常会从您那里生成响应、阻止您自己响应以及从另一个设备寻找响应的数据包。使用您的IP地址作为目的地似乎是明智的,但我不相信这一点。不幸的是,细节(因此,答案)是留给行动的练习…但我希望这次讨论有帮助。

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

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

    如果其他都失败了,您可以享受: http://www.rfc-editor.org/rfc/rfc2321.txt

    拜托 张贴一个跟进你的解决方案,因为我相信它将有助于其他人。祝你好运!

        2
  •  3
  •   Community Mohan Dere    9 年前

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

    我用bitwisture伪造了一个这样的包,并用preplay重播,网络上的所有主机都得到了响应。(我不知道这些伪造的ARP包是否合法…一些操作系统可能会忽略它们)

    这是伪造包裹的样子: alt text

    回复如下: alt text

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

    不幸的是,我不能完全测试这个理论,因为我的(Windows)机器都不关心我试图设置网卡的MAC地址…

        3
  •  1
  •   che    17 年前

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

        4
  •  1
  •   Daniel Cassidy    15 年前

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

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

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

    最后,我在本地管理的范围内选择了一个随机的ISH默认值,通过对一些具有中等熵的硬件读数进行选择。我故意排除了范围的开始和结束,前提是这些范围比较可能是手动选择的。很可能在任何给定的网络上只有一个这样的设备,而且肯定少于20个,所以冲突的可能性非常低,尽管由于某些可预测的随机数,可能没有那么低。

    考虑到出现问题的可能性很低,尽管上面给出了很好的答案,但我决定不进行冲突检测,而是向用户发出警告,提醒他们注意mac冲突问题。

    如果我决定执行冲突检测,那么考虑到我控制了整个网络堆栈,我可能会注意过多的未知或丢失的数据包,然后触发MAC地址的更改,或者在发生这种情况时警告用户。

    希望这能帮助其他人,但可能不会!

    推荐文章