对于您可以nmap的使用,只要你能以某种方式限制范围,如您的评论本已应该给你的主机,你要第一部分:基于ARP
sudo nmap -PR -sn 192.168.0-255.0-255 -e <interface-to-test>
这确实发现和如果成功的话可以通过一次额外的ICMP查找活力。这一次在一个没有活跃的本地主机和5个有4个活动主机的系列上花了我大约一秒钟的时间。因此,您甚至可以将其扩展到更大的范围,但是除非您有一两天的时间,否则不会包含完整的IPv4地址空间。在这种情况下,我只需连接wireshark或tcpdump并等待无偿ARP。
编辑:为此,您必须在要测试的子网中使用IP配置“源计算机”。我认为在离开子网时或者没有配置IP时,它会使用ARP的DAD模式,但它不会做任何事情。我为下面的算法写了一个更通用的版本,但是比简单地使用nmap获得这个结果要慢一些。
检测配置的网络掩码有点棘手。但我认为这个过程是可行的,主要思想是主机将发送一个ARP请求给其子网中的主机,并且不发送任何ARP请求或者其默认gw的ARP请求给不在其子网中的主机。
- 从第二个到最小的子网
N=29
开始。
- 从该主机的IP和子网掩码
N
组成的子网中选取IP X
。确保选取的IP不是主机的IP而不是网络/广播。还要确保这个IP不是由主机的IP和掩码N+1
组成的子网的一部分。
- 平安其他主机与源
X
(你不介意它回答,只是发出一个请求)
- 如果你看到
X
一个ARP请求,一个减少N
。请返回2
- 如果您没有看到
X
的ARP请求,N+1
是搜索到的子网。
一个缺陷可能是过度的网络堆栈实现可能会从传入的ICMP请求中学习MAC,但我个人不知道任何以这种方式工作的终端设备堆栈。
我不知道是否有工具可以为你做这件事,但应该很容易用ping,tcpdump和子网计算器手动执行;)。或者如果你觉得受到一些黑客攻击,可能没有太多的工作来实现这scapy
我一起写了一个完整的python scapy脚本我应该工作,我测试它在我的家庭网络上的linksys homegw ,另一个linux机器和一个android设备:
from __future__ import print_function, absolute_import, unicode_literals
from scapy.base_classes import Net
from scapy.config import conf
from scapy.layers.inet import Ether, ARP, ICMP, IP
from scapy.sendrecv import srp, debug
import scapy.route
iface = b'eth0'
subnet_to_test = b'192.168.1.0/24'
#or:
subnet_to_test = b'192.168.1.*'
#IP/MAC discovery
pkt = Ether(dst=b'ff:ff:ff:ff:ff:ff')/ARP(psrc=b'0.0.0.0', pdst=subnet_to_test, hwdst=b'ff:ff:ff:ff:ff:ff')
responses = srp(pkt, timeout=1, retry=0, verbose=0, iface=iface)
for r in responses[0]:
found = r[1].getfieldval('psrc')
foundmac = r[1].getfieldval('hwsrc')
n = 29
conf.debug_match = 1
while n > -1:
net = Net("{}/{}".format(found, n))
my_src = net.choice()
while my_src in Net("{}/{}".format(found, n + 1)):
my_src = net.choice()
pkt = Ether(dst=foundmac)/IP(dst=found, src=my_src)/ICMP(type=8)
resp = srp(pkt, timeout=1, retry=0, verbose=0, iface=iface, filter=b'ether dst FF:FF:FF:FF:FF:FF and arp')
received = [x for x in debug.recv if x.haslayer(ARP) and x.getfieldval('pdst') == my_src]
received.extend(x[1] for x in resp[0] if x[1].haslayer(ARP) and x[1].getfieldval('pdst') == my_src)
if len(received) == 0:
print("Found host: {}/{} on mac {}".format(found, n + 1, foundmac))
break
n -= 1
DHCP是否可用?这是处理IP设置的动态分配的正确方法。既然你愿意编译和安装一个自定义的解决方案,我会考虑安装DHCP。 –
设备是否响应ICMP网络掩码请求? – Keith
另一端的设备配置为使用静态IP地址,即使我们提供此服务也不会使用DHCP – h22