4

一个疯狂的问题,但是有没有发现没有 DHCP 的默认网关?

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

我可能是在自找麻烦,我理解。例如,如果已经有一台具有静态 IP 并且正在关闭的计算机。

4

3 回答 3

10

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

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

网关可能会接收和发送更多流量。此流量可能具有来自许多不同网络的许多 IP 地址,但具有相同的硬件地址。网关将在您的表格中显示为一个带有大量 IP 地址的 MAC 地址。您可能已经观察到涉及此 MAC 地址地址的 ARP 事务,因此您可以查找一个 IP 地址,该地址为也seen in ARP packet设置了标志的 MAC 提供别名。那几乎可以肯定是网关的 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_addr = 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 地址后,您不能为自己进行 ARP 声明。

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

回到网络掩码

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

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

如果您使用的是以太网交换机,事情会变得更加困难,因为如果交换机知道帧应该发送到其他地方,它就不会将以太网帧转发给您,因此您将看不到它们。但是,它将转发许多 ARP 请求,因为它们是广播的,除非发送方在其 ARP 缓存中仍然有该 IP 的条目,并且只是尝试提前更新该条目(这可能并非所有系统都这样做)。这将使您对网络及其成员的想法变得更加困难,但您可能会做得不错。但是,您可能必须依赖网关的 ARP 请求数量以及网关的数量高于其他系统才能发现它。这很容易出错,因为文件服务器可能有类似的流量。

于 2010-05-21T21:41:29.517 回答
3

可以完成但不容易(据我所知)。解决方案我将进一步分析:

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

嗅探库我认为是 libpcap 或 winpcap。

从来没有做过类似的事情,但如果我在谷歌上找不到任何参考资料,我想我会这样做。

于 2010-05-21T08:28:00.260 回答
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% 的时间里到达那里时,这是很多工作。

于 2010-05-21T17:23:29.723 回答