12

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

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

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

4

4 回答 4

17

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

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

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

  • 任何主动方法都要求您传输一个数据包,迫使冒名顶替者做出响应。这立即消除了任何依赖于可选协议的方法。

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

  • 该解决方案应独立于 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

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

于 2008-11-10T05:21:33.990 回答
3

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

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

这是伪造的包裹的样子: 替代文字

这是回复的样子: 替代文字

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

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

于 2009-01-16T00:25:16.163 回答
1

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

于 2008-11-10T03:40:13.413 回答
1

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

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

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

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

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

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

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

于 2010-08-04T18:01:21.737 回答