2010-05-21 325 views
1

一个疯狂的问题,但无论如何发现没有DHCP的默认网关?发现没有DHCP的默认网关

这将用于网络上的设备,该设备不使用尚未具有IP地址的DHCP。我在想如果我能发现默认网关,那么我可以尝试猜测一个未使用的IP地址,然后在网络上广播,看看它是否被使用。

我可能会问我理解的麻烦。例如。如果已经有一台具有静态IP并正在关机的计算机。

+0

你的意思是编程?在什么平台上? – 2010-05-21 06:09:20

+0

是编程使用C或任何事情。 – JavaRocky 2010-05-21 06:10:34

回答

7

数据包嗅探一段时间,然后应用启发式。我假设IPv4和以太网的其余部分。如果使用以太网交换机而不是集线器,这将不会很好。更多的在最后。

根据您看到的以太网(或其他)和IP头以及实际ARP数据包(忽略广播和多播IP和MAC地址)创建您自己的RARP(反向地址解析)表。确保您的表格能够将多个IP地址映射到单个硬件接口。表中任何由实际ARP数据包输入或验证的IP地址都应该标记为这样。

网关可能会收到并发送更多流量。该流量可能拥有来自许多不同网络的许多IP地址,但具有相同的硬件地址。该网关将显示在您的表中作为一个具有大量IP地址的MAC地址。您很可能会观察到涉及此MAC地址地址的ARP事务,因此您可以查找用于替换标记为seen in ARP packet标志的MAC地址的IP地址。这几乎肯定是网关的IP地址。

您可能会根据网关的IP地址猜测网络地址和子网掩码,但这可能不是您可以信任的。如果您想尝试使用非标准网络掩码在网络上进行此项工作,您可以尝试执行以下操作。 让两个IP地址大小的蓄电池变量:

uint32_t acc_and = 0xFFffFFff; 
uint32_t acc_or = 0x00000000; 

然后每个ARP在表格验证地址,你做

acc_and &= ip_addr; 
acc_or |= ip_addr; 

你也可以使用目标IP地址(不在多播)在为此来自网关的数据包,但您必须先知道网关,然后才能将它们标记为这样。

找到网络掩码和网络地址

地址的网络部分应该保持相同在两者(第一操作之后),但在acc_and底部比特应该开始清理掉,而在acc_or底部位应该开始填补。有了足够的样本,你将能够确定由网络地址:

和网络掩码:

uint32_t net_mask = acc_and^acc_or; 

获得足够的采样本地IP地址可能要花很长时间,这样你就可以开始尝试将其缩小为:

uint32_t almost_net_mask = acc_and^acc_or; 
int i = 0; 
while (1 & almost_net_mask) { 
    i++; 
    almost_net_mask >>= 1; 
} 
uint32_t net_mask = 0xFFffFFff; 
while(i--) { 
    net_mask <<=1; 
} 

这会找到你最后1位的设置。最低的0位显然不是地址本地部分的一部分。或者你可以通过获得相同的i

i = ffs(~ (acc_and^acc_or)) ; // assuming that int on your system is 32 bit. if not use ffsl 

如果你真的想确保你的网络掩码和网络地址的,现在你可以尝试一些其他的东西。您可以尝试查看网关是否尝试将您发送的数据包转发给您认为应该是本地地址的数据包。因为这将不得不继续,并为自己分配一个IP地址,如果你的网络掩码不正确,这是很危险的。

选择一个IP为自己

尽量选择你还没有见过流量或增加,这是不超出范围的几率最低的合法IP地址。你可以伪造该地址的ARP请求并寻找任何回应(你可以使用自己的真实MAC地址,但可能为此构成一个IP,并不一定是你的IP,这可能会使事情混淆一点) 。在找到一个你不能自己声称的IP地址之后。

您可能最终得到的IP地址实际上太高。这很难确定,因为你的网络掩码仍然是一个很好的猜测。如果情况确实如此,你的运气不好,因为没有空闲的插槽可供您居住。

回子网掩码

要看到,如果你的网络掩码需要调整的尝试与目标地址发送IP包,你有没有在本地网络中所看到的,但可能会根据你的猜测在是本地网络中网络掩码和网络地址。如果这些猜测是关闭的,它们应该有太多的位分配给网络地址,所以发送到地址可以改变(到目前为止)最好的猜测网络地址的网络掩码部分的低位。您可以像平常一样通过ARP地址发送这些IP地址并查看是否有人回复,但由于您猜测的地址可能会丢失,因此尝试创建目标MAC地址设置为的数据包可能会更好看看它是否会转发它的网关。它可能被配置为不是,所以你可以试着看看它是否会首先为你已经在网络中观察到的网络成员做这件事,然后看看它是否为你转发它。如果网关转发数据包,那么你可以依靠其网络掩码的想法来缩小你对网络掩码的想法。如果网关不会转发目的地为本地网络的已知成员的数据包,那么您可以继续使用本地网络掩码和网络的想法,直到您有理由对其进行调整或发出对该范围内的地址的ARP请求(这只会回答你的问题是“是”或“也许”,而不可能有确定的“否”)。

如果您使用的是以太网交换机,而不是HUB

如果您使用的是以太网交换机事情变得更加困难,因为交换机不会转发以太网帧给你,如果它知道帧应该去在别的地方,所以你不会看到它们。不过,它会转发很多ARP请求,因为它们是广播的,除非发送者在其ARP缓存中仍然有该IP的条目,并且只是试图尽快更新该条目(这可能不是所有系统都可以完成的)。这将使你对网络及其成员的构想变得更加困难,但你很可能能够做一份体面的工作。尽管如此,您可能不得不依赖网关的ARP请求数量,并且网关的数量要高于其他系统。这很容易出错,因为文件服务器可能具有相似的流量。

3

可以完成但不是简单的方法(根据我的知识欠佳)。 解决方法我将进一步分析:

  • 检测网关 - 2种可能性(全部关闭它们与数据嗅探有关):
    • 捕获DHCP提供数据包和 检索网关
    • 找包被寻址到外部网络(例如,对每个目标IP地址执行ARP请求 - 如果没有答案,则有可能的默认网关的MAC地址 - 您需要查找此网关的IP地址(分析ARP数据包,所有数据包等)。
  • 你有一个IP地址做一个ARP请求,并找到你的免费IP。

嗅探库我认为是libpcap或winpcap。

从来没有做过甚至类似的事情,但如果我不会在谷歌上找到任何引用我会这样去我想。

3

在Windows网络上,您可以使用IP 0.0.0.0并打开一个带有端口67(或可能是68)的UDP套接字,然后等待SMB广播消息学习IP地址。从那里,您可以使用ARP数据包在接近该IP的地址上搜索设备。

在网络使用小于255.255.255.0的网络掩码的情况下,尝试找到接近原始IP(相同的高位)的未使用地址。一旦你找到一个未使用的IP,为你的设备声称它并发送免费ARP。

现在继续您的ARP扫描,并且每当您找到响应的设备时,都会暂时将其设置为默认网关,并尝试ping互联网上将响应的设备的已知IP地址。如果你得到回应,你已经找到了你的网关。

当使用DHCP时,这很多工作将使您在99%的时间内完成工作。